soap_message.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: soap_message.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:44:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: soap_message.cpp,v 1000.2 2004/06/01 19:44:25 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Andrei Gourianov
  35. *
  36. * File Description:
  37. *   Hold the content of, send and receive SOAP messages
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <serial/serial.hpp>
  41. #include <serial/objostr.hpp>
  42. #include <serial/objistr.hpp>
  43. #include <serial/objostrxml.hpp>
  44. #include <serial/soap/soap_message.hpp>
  45. #include <serial/soap/soap_fault.hpp>
  46. #include "soap_envelope.hpp"
  47. #include "soap_body.hpp"
  48. #include "soap_header.hpp"
  49. #include "soap_writehook.hpp"
  50. #include "soap_readhook.hpp"
  51. #include <algorithm>
  52. BEGIN_NCBI_SCOPE
  53. const string& CSoapMessage::ms_SoapNamespace =
  54.     "http://www.w3.org/2002/12/soap-envelope";
  55. CSoapMessage::CSoapMessage(void)
  56.     : m_Prefix("env")
  57. {
  58.     RegisterObjectType(CSoapFault::GetTypeInfo);
  59. }
  60. CSoapMessage::~CSoapMessage(void)
  61. {
  62. }
  63. const string& CSoapMessage::GetSoapNamespace(void)
  64. {
  65.     return ms_SoapNamespace;
  66. }
  67. void CSoapMessage::SetSoapNamespacePrefix(const string& prefix)
  68. {
  69.     m_Prefix = prefix;
  70. }
  71. const string& CSoapMessage::GetSoapNamespacePrefix(void) const
  72. {
  73.     return m_Prefix;
  74. }
  75. void CSoapMessage::AddObject(const CSerialObject& obj,
  76.                               EMessagePart destination)
  77. {
  78.     if (destination == eMsgHeader) {
  79.         m_Header.push_back( CConstRef<CSerialObject>(&obj));
  80.     } else if (destination == eMsgBody) {
  81.         m_Body.push_back( CConstRef<CSerialObject>(&obj));
  82.     } else {
  83.         m_FaultDetail.push_back( CConstRef<CSerialObject>(&obj));
  84.     }
  85. }
  86. void CSoapMessage::Write(CObjectOStream& out) const
  87. {
  88.     CObjectOStreamXml* os = 0;
  89.     bool schema = false, loc = false;
  90.     string ns_default;
  91.     ESerialDataFormat fmt = out.GetDataFormat();
  92.     if (fmt == eSerial_Xml) {
  93.         os = dynamic_cast<CObjectOStreamXml*>(&out);
  94.         if (os) {
  95.             schema = os->GetReferenceSchema();
  96.             os->SetReferenceSchema();
  97.             loc = os->GetUseSchemaLocation();
  98.             os->SetUseSchemaLocation(false);
  99.             ns_default = os->GetDefaultSchemaNamespace();
  100.             os->SetDefaultSchemaNamespace(GetSoapNamespace());
  101.         }
  102.     }
  103.     CSoapEnvelope env;
  104.     env.SetNamespaceName(GetSoapNamespace());
  105.     env.SetNamespacePrefix(GetSoapNamespacePrefix());
  106.     if (!m_Header.empty()) {
  107. // This is to make the stream think the Header was not empty.
  108. // Since Header is optional, we do not have to make it *always*
  109.         CRef<CSoapHeader::C_E> h(new CSoapHeader::C_E);
  110.         h->SetAnyContent(*(new CAnyContentObject));
  111.         env.SetHeader().Set().push_back(h);
  112.     }
  113. // This is to make the stream think the Body was not empty.
  114. // Body is mandatory
  115.     CRef<CSoapBody::C_E> h(new CSoapBody::C_E);
  116.     h->SetAnyContent(*(new CAnyContentObject));
  117.     env.SetBody().Set().push_back(h);
  118.     CSoapFault* flt = 0;
  119.     if (!m_FaultDetail.empty()) {
  120. // This is to make the stream think the Detail was not empty.
  121. // Since Detail is optional, we do not have to make it *always*
  122.         flt = dynamic_cast<CSoapFault*>(const_cast<CSerialObject*>(
  123.             GetSerialObject("Fault", eMsgBody).GetPointer()));
  124.         if (!flt) {
  125. // throw exception here (?)
  126.         }
  127.         CRef<CSoapDetail::C_E> h(new CSoapDetail::C_E);
  128.         h->SetAnyContent(*(new CAnyContentObject));
  129.         flt->SetSoapDetail().Set().push_back(h);
  130.     }
  131.     CObjectTypeInfo typeH = CType<CSoapHeader::C_E>();
  132.     typeH.SetLocalWriteHook(out, new CSoapWriteHook(m_Header));
  133.     CObjectTypeInfo typeB = CType<CSoapBody::C_E>();
  134.     typeB.SetLocalWriteHook(out, new CSoapWriteHook(m_Body));
  135.     CObjectTypeInfo typeF = CType<CSoapDetail::C_E>();
  136.     typeF.SetLocalWriteHook(out, new CSoapWriteHook(m_FaultDetail));
  137.     out << env;
  138.     if (flt) {
  139.         flt->SetSoapDetail().Set().clear();
  140.     }
  141.     if (os) {
  142.         os->SetReferenceSchema(schema);
  143.         os->SetUseSchemaLocation(loc);
  144.         os->SetDefaultSchemaNamespace(ns_default);
  145.     }
  146. }
  147. void CSoapMessage::Read(CObjectIStream& in)
  148. {
  149.     Reset();
  150.     CSoapEnvelope env;
  151.     CObjectTypeInfo typeH = CType<CSoapHeader::C_E>();
  152.     typeH.SetLocalReadHook(in, new CSoapReadHook(m_Header,m_Types));
  153.     CObjectTypeInfo typeB = CType<CSoapBody::C_E>();
  154.     typeB.SetLocalReadHook(in, new CSoapReadHook(m_Body,m_Types));
  155.     CObjectTypeInfo typeF = CType<CSoapDetail::C_E>();
  156.     typeF.SetLocalReadHook(in, new CSoapReadHook(m_FaultDetail,m_Types));
  157.     in >> env;
  158. }
  159. void CSoapMessage::RegisterObjectType(TTypeInfoGetter type_getter)
  160. {
  161.     RegisterObjectType(*type_getter());
  162. }
  163. void CSoapMessage::RegisterObjectType(const CTypeInfo& type)
  164. {
  165.     if (find(m_Types.begin(), m_Types.end(), &type) == m_Types.end()) {
  166.         m_Types.push_back(&type);
  167.     }
  168. }
  169. void CSoapMessage::RegisterObjectType(const CSerialObject& obj)
  170. {
  171.     RegisterObjectType(*obj.GetThisTypeInfo());
  172. }
  173. void CSoapMessage::Reset(void)
  174. {
  175.     m_Header.clear();
  176.     m_Body.clear();
  177.     m_FaultDetail.clear();
  178. }
  179. const CSoapMessage::TSoapContent&
  180. CSoapMessage::GetContent(EMessagePart source) const
  181. {
  182.     if (source == eMsgHeader) {
  183.         return m_Header;
  184.     } else if (source == eMsgBody) {
  185.         return m_Body;
  186.     } else {
  187.         return m_FaultDetail;
  188.     }
  189. }
  190. CConstRef<CSerialObject>
  191. CSoapMessage::GetSerialObject(const string& type_name,
  192.                                EMessagePart source) const
  193. {
  194.     const TSoapContent& src = GetContent(source);
  195.     TSoapContent::const_iterator it;
  196.     for (it= src.begin(); it != src.end(); ++it) {
  197.         if ((*it)->GetThisTypeInfo()->GetName() == type_name) {
  198.             return (*it);
  199.         }
  200.     }
  201.     return CConstRef<CSerialObject>(0);
  202. }
  203. CConstRef<CAnyContentObject>
  204. CSoapMessage::GetAnyContentObject(const string& name,
  205.                                    EMessagePart source) const
  206. {
  207.     const TSoapContent& src = GetContent(source);
  208.     TSoapContent::const_iterator it;
  209.     for (it= src.begin(); it != src.end(); ++it) {
  210.         const CAnyContentObject* obj =
  211.             dynamic_cast<const CAnyContentObject*>(it->GetPointer());
  212.         if (obj && obj->GetName() == name) {
  213.             return CConstRef<CAnyContentObject>(obj);
  214.         }
  215.     }
  216.     return CConstRef<CAnyContentObject>(0);
  217. }
  218. END_NCBI_SCOPE
  219. /* --------------------------------------------------------------------------
  220. * $Log: soap_message.cpp,v $
  221. * Revision 1000.2  2004/06/01 19:44:25  gouriano
  222. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  223. *
  224. * Revision 1.4  2004/05/17 21:03:24  gorelenk
  225. * Added include of PCH ncbi_pch.hpp
  226. *
  227. * Revision 1.3  2003/12/04 20:56:03  gouriano
  228. * correct parameter names
  229. *
  230. * Revision 1.2  2003/09/25 19:45:33  gouriano
  231. * Added soap Fault object
  232. *
  233. * Revision 1.1  2003/09/22 21:00:04  gouriano
  234. * Initial revision
  235. *
  236. *
  237. * ===========================================================================
  238. */