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 * @authors Lilantha Darshana (lilantha@erunway.com) 00061 * Satheesh Thurairajah (satheesh@erunway.com) 00062 * 00063 * 00064 */ 00065 00066 #include "Platform.hpp" 00067 #include "Call.hpp" 00068 #include "SOAPMsgContext.hpp" 00069 #include "AxisException.hpp" 00070 #include <iostream> 00071 #include "Param.hpp" 00072 00073 00078 00079 Call::Call() : m_pClientCtx(0) 00080 { 00081 00082 } 00083 00084 00089 00090 Call::~Call() 00091 { 00092 Cleanup(); 00093 } 00094 00095 00102 void Call::SetOperationName(const char *p_pchOpName) 00103 { 00104 if (p_pchOpName) 00105 m_strOpName = p_pchOpName; 00106 } 00107 00108 00115 00116 void Call::SetMethodNamespaceURI(const char *p_pchOpNsURI) 00117 { 00118 if (p_pchOpNsURI) 00119 m_strMethodNsURI = p_pchOpNsURI; 00120 } 00121 00122 00128 00129 void Call::SetTargetEndpointAddress(const char* p_pchUrl) 00130 { 00131 m_ServerURL = p_pchUrl; 00132 } 00133 00134 00144 00145 void Call::AddSerializerFactory(const std::string& p_sTypName, SerializerFactory * p_pSer) 00146 { 00147 if(!m_pClientCtx) 00148 m_pClientCtx = new SOAPMsgContext(); 00149 00150 m_pClientCtx->RegisterTypeMapping(p_sTypName, p_pSer); 00151 } 00152 00153 00159 00160 void Call::SetEncodingStyle(const std::string& p_sNsURI) 00161 { 00162 m_EncStyle = p_sNsURI; 00163 } 00164 00165 00178 00179 void * Call::Invoke(const std::string& p_sNs, const std::string& p_sMethod) 00180 { 00181 // set method name & namespace of the method. 00182 m_strMethodNsURI = p_sNs; 00183 m_strOpName = p_sMethod; 00184 00185 return Invoke(); 00186 } 00187 00188 00204 00205 void * Call::Invoke() 00206 { 00207 try 00208 { 00209 // Make sure the method name is provided 00210 if(m_strOpName.empty()) throw AxisException("Cannot Invoke unspecified method ....", 1); 00211 00212 // Build up the RPC body from method name, namespace & set of arguments; as SOAPBody 00213 RPCElement *pBody = new RPCElement(m_strMethodNsURI, m_strOpName, m_vArgs); 00214 00215 // Create message contex to handle SOAP requests 00216 if(!m_pClientCtx) 00217 m_pClientCtx = new SOAPMsgContext(); 00218 00219 //Set remote Web service address 00220 m_pClientCtx->SetServiceURL(m_ServerURL); 00221 00222 // Invoke the Web service with RPC body elements 00223 m_pClientCtx->Invoke(pBody); 00224 00225 // Get result of call to remote service as RPC body Element 00226 RPCElement *ret = (RPCElement*)m_pClientCtx->GetResults(); 00227 00228 // return deserialized response message to the caller 00229 // according the the service description of output form -- metainfo 00230 return ret->GetReturnValue(); 00231 00232 } 00233 catch(AxisException& ex) 00234 { 00235 std::cerr << ex.GetErrorMsg() << std::endl; 00236 Cleanup(); 00237 } 00238 catch(...) 00239 { 00240 // Handle any sort of exception that could cause on calling remote sercvice. 00241 std::cerr << "Exception in WebService ....." << std::endl; 00242 Cleanup(); 00243 } 00244 00245 // Exception has occured 00246 return NULL; 00247 } 00248 00249 00254 00255 void Call::Cleanup() 00256 { 00257 delete m_pClientCtx; 00258 m_pClientCtx = NULL; 00259 int size; 00260 if(size = m_vArgs.size()) 00261 { 00262 for (int i=0; i < size ; i++) 00263 delete m_vArgs[i]; 00264 m_vArgs.clear(); 00265 } 00266 } 00267 00268
Copyright © 2001 SL_OpenSource XML Project. All Rights Reserved