Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

RPCElement.cpp

Go to the documentation of this file.
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 
Axis C++ Client Lib - User's Guide

Copyright © 2001 SL_OpenSource XML Project. All Rights Reserved