00001 /* -*- C++ -*- */ 00002 00003 /* 00004 * The Apache Software License, Version 1.1 00005 * 00006 * 00007 * Copyright (c) 2002 The Apache Software Foundation. All rights 00008 * reserved. 00009 * 00010 * Redistribution and use in source and binary forms, with or without 00011 * modification, are permitted provided that the following conditions 00012 * are met: 00013 * 00014 * 1. Redistributions of source code must retain the above copyright 00015 * notice, this list of conditions and the following disclaimer. 00016 * 00017 * 2. Redistributions in binary form must reproduce the above copyright 00018 * notice, this list of conditions and the following disclaimer in 00019 * the documentation and/or other materials provided with the 00020 * distribution. 00021 * 00022 * 3. The end-user documentation included with the redistribution, 00023 * if any, must include the following acknowledgment: 00024 * "This product includes software developed by the 00025 * Apache Software Foundation (http://www.apache.org/)." 00026 * Alternately, this acknowledgment may appear in the software itself, 00027 * if and wherever such third-party acknowledgments normally appear. 00028 * 00029 * 4. The names "SOAP" and "Apache Software Foundation" must 00030 * not be used to endorse or promote products derived from this 00031 * software without prior written permission. For written 00032 * permission, please contact apache@apache.org. 00033 * 00034 * 5. Products derived from this software may not be called "Apache", 00035 * nor may "Apache" appear in their name, without prior written 00036 * permission of the Apache Software Foundation. 00037 * 00038 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 00039 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00040 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00041 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 00042 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00043 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00044 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 00045 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00046 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00047 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00048 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00049 * SUCH DAMAGE. 00050 * ==================================================================== 00051 * 00052 * This software consists of voluntary contributions made by many 00053 * individuals on behalf of the Apache Software Foundation. For more 00054 * information on the Apache Software Foundation, please see 00055 * <http://www.apache.org/>. 00056 */ 00057 00058 /* 00059 * 00060 * 00061 * @author Lilantha Darshana (lilantha@erunway.com) 00062 * 00063 */ 00064 00065 #include "Platform.hpp" 00066 #include "RPCElement.hpp" 00067 #include "RPCParam.hpp" 00068 #include "XMLSerializer.hpp" 00069 #include "XMLDeSerializer.hpp" 00070 #include "AxisException.hpp" 00071 #include <xercesc/dom/DOM_Element.hpp> 00072 #include <cstdio> 00073 00074 00075 RPCElement::RPCElement(const std::string& ns, const std::string& methodName, 00076 const std::vector<Param*>& params) 00077 { 00078 m_NsURI = ns; 00079 m_Name = methodName; 00080 00081 int nSize = params.size(); 00082 00083 for (int i = 0; i < nSize; i++) 00084 { 00085 std::string name; 00086 00087 RPCParam *param = new RPCParam(params[i]->m_Name, params[i]->m_pValue, *(params[i]->m_pType)); 00088 00089 m_pParams.push_back(param); 00090 } 00091 } 00092 00093 RPCElement::RPCElement(const DOM_Element& p_Elm) 00094 { 00095 SetMsgElm(p_Elm); 00096 m_Prefix = p_Elm.getPrefix().transcode(); 00097 m_qName = ax::QName(p_Elm.getNamespaceURI().transcode(), 00098 p_Elm.getLocalName().transcode()); 00099 } 00100 00101 00102 RPCElement::~RPCElement() 00103 { 00104 int size = m_pParams.size(); 00105 00106 for(int i = 0; i < size;i++) 00107 delete m_pParams[i]; 00108 00109 m_pParams.clear(); 00110 } 00111 00112 void RPCElement::AddMsgElement(const DOM_Element& p_Elm) 00113 { 00114 SetMsgElm(p_Elm); 00115 00116 std::string tagName = p_Elm.getTagName().transcode(); 00117 00118 if(m_pElmNode.hasChildNodes()) 00119 { 00120 DOM_Node child=m_pElmNode.getFirstChild(); 00121 00122 if(child.getNodeType() == DOM_Node::TEXT_NODE 00123 || child.getNodeType() == DOM_Node::CDATA_SECTION_NODE) 00124 { 00125 // All types are bound to name space URI_CURRENT_SCHEMA_XSI 00126 std::string schemaType = m_pElmNode.getAttributeNS(ax::URI_CURRENT_SCHEMA_XSI.c_str(), "type").transcode(); 00127 m_Result = child.getNodeValue().transcode(); 00128 00129 RPCParam *result = new RPCParam("result", m_Result, schemaType); 00130 m_pParams.push_back(result); 00131 } 00132 } 00133 else 00134 throw AxisException("Return data not found\n\n", 1); 00135 } 00136 00137 void * RPCElement::GetReturnValue() 00138 { 00139 RPCParam *pRpc = (m_pParams.size()) ? m_pParams[0] : NULL; 00140 00141 if(pRpc) 00142 return pRpc->GetValue(); 00143 00144 throw AxisException("Unexpected result from the callee....\n\n", 1); 00145 } 00146 00147 void RPCElement::Serialize(XMLSerializer& serilizer) 00148 { 00149 ax::QName qName(m_NsURI, m_Name); 00150 serilizer.StartElem(qName, m_AttLst); 00151 00152 for (paramItr = m_pParams.begin(); paramItr != m_pParams.end(); ++paramItr) 00153 { 00154 (*paramItr)->Serialize(serilizer); 00155 } 00156 serilizer.EndElem(); 00157 } 00158 00159 void RPCElement::DeSerialize(XMLDeSerializer& dserilizer) 00160 { 00161 dserilizer.RegisterPrefixForURI(m_Prefix, m_qName.GetNsURI()); 00162 00163 dserilizer.DeSerialize(*this); 00164 for (paramItr = m_pParams.begin(); paramItr != m_pParams.end(); ++paramItr) 00165 { 00166 (*paramItr)->DeSerialize(dserilizer); 00167 } 00168 00169 } 00170 00171 00172
Copyright © 2001 SL_OpenSource XML Project. All Rights Reserved