1 var xmlBuilder = require(
'xmlbuilder')
2 , dateFormatter = require(
'./date_formatter')
3 , CustomType = require(
'./customtype')
15 exports.serializeMethodCall = function(method, params, encoding) {
16 var params = params || []
18 var options = { version:
'1.0', allowSurrogateChars:
true }
21 options.encoding = encoding
24 var xml = xmlBuilder.create(
'methodCall', options)
30 params.forEach(
function(param) {
31 serializeValue(param, xml.ele(
'param'))
35 return xml.doc().toString()
47 exports.serializeMethodResponse =
function(result) {
48 var xml = xmlBuilder.create(
'methodResponse', { version:
'1.0', allowSurrogateChars:
true })
52 serializeValue(result, xml)
55 return xml.doc().toString()
58 exports.serializeFault = function(fault) {
59 var xml = xmlBuilder.create(
'methodResponse', { version:
'1.0', allowSurrogateChars:
true })
62 serializeValue(fault, xml)
65 return xml.doc().toString()
68 function serializeValue(value, xml) {
69 var stack = [ { value: value, xml: xml } ]
74 while (stack.length > 0) {
75 current = stack[stack.length - 1]
77 if (current.index !== undefined) {
79 next = getNextItemsFrame(current)
89 valueNode = current.xml.ele(
'value')
90 switch(typeof current.value) {
92 appendBoolean(current.value, valueNode)
96 appendString(current.value, valueNode)
100 appendNumber(current.value, valueNode)
104 if (current.value === null) {
108 else if (current.value instanceof Date) {
109 appendDatetime(current.value, valueNode)
112 else if (Buffer.isBuffer(current.value)) {
113 appendBuffer(current.value, valueNode)
116 else if (current.value instanceof CustomType) {
117 current.value.serialize(valueNode)
121 if (Array.isArray(current.value)) {
122 current.xml = valueNode.ele(
'array').ele(
'data')
125 current.xml = valueNode.ele(
'struct')
126 current.keys = Object.keys(current.value)
129 next = getNextItemsFrame(current)
146 function getNextItemsFrame(frame) {
150 if (frame.index < frame.keys.length) {
151 var key = frame.keys[frame.index++]
152 , member = frame.xml.ele(
'member').ele(
'name').text(key).up()
154 value: frame.value[key]
159 else if (frame.index < frame.value.length) {
161 value: frame.value[frame.index]
170 function appendBoolean(value, xml) {
171 xml.ele(
'boolean').txt(value ? 1 : 0)
174 var illegalChars = /^(?![^<&]*]]>[^<&]*)[^<&]*$/
175 function appendString(value, xml) {
176 if (value.length === 0) {
179 else if (!illegalChars.test(value)) {
180 xml.ele(
'string').d(value)
183 xml.ele(
'string').txt(value)
187 function appendNumber(value, xml) {
188 if (value % 1 == 0) {
189 xml.ele(
'int').txt(value)
192 xml.ele(
'double').txt(value)
196 function appendDatetime(value, xml) {
197 xml.ele(
'dateTime.iso8601').txt(dateFormatter.encodeIso8601(value))
200 function appendBuffer(value, xml) {
201 xml.ele(
'base64').txt(value.toString(
'base64'))