Element* Document::createElementNS(DOMString* nsUri, DOMString* qualifiedName) { if(!qualifiedName) { throw DOMException("createElementNS: qualifiedName arg is NULL"); } vector<XPlus::UString> tokens; qualifiedName->tokenize(':', tokens); poco_assert(tokens.size()==2); return createElementNS(nsUri, new DOMString(tokens[0]), new DOMString(tokens[1])); }
Element* Document::createElement(DOMString* tagName) { return createElementNS(NULL, NULL, tagName); }
bool Wsdl::GetWSDL( HTTPRequest *pRequest ) { m_typesCreated.clear(); QDomElement oNode; QString sClassName = m_pServiceHost->GetServiceMetaObject().className(); QString sTargetNamespace = "http://mythtv.org"; m_oRoot = createElementNS( "http://schemas.xmlsoap.org/wsdl/", "definitions"); m_oRoot.setAttribute( "targetNamespace", sTargetNamespace ); m_oRoot.setAttribute( "xmlns:soap", "http://schemas.xmlsoap.org/wsdl/soap/" ); m_oRoot.setAttribute( "xmlns:xs" , "http://www.w3.org/2001/XMLSchema" ); m_oRoot.setAttribute( "xmlns:soap", "http://schemas.xmlsoap.org/wsdl/soap/" ); m_oRoot.setAttribute( "xmlns:tns" , sTargetNamespace ); m_oRoot.setAttribute( "xmlns:wsaw", "http://www.w3.org/2006/05/addressing/wsdl" ); m_oRoot.setAttribute( "name", QString( "%1Services" ).arg( sClassName ) ); m_oTypes = createElement( "types" ); m_oLastMsg = m_oTypes; m_oPortType = createElement( "portType" ); m_oBindings = createElement( "binding" ); m_oService = createElement( "service" ); appendChild( m_oRoot ); m_oRoot.appendChild( m_oTypes ); m_oRoot.appendChild( m_oPortType ); m_oRoot.appendChild( m_oBindings ); m_oRoot.appendChild( m_oService ); m_oPortType.setAttribute( "name", sClassName ); oNode = createElement( "xs:schema" ); oNode.setAttribute( "targetNamespace" , sTargetNamespace ); oNode.setAttribute( "elementFormDefault", "qualified" ); m_oTypes.appendChild( oNode ); m_oTypes = oNode; // ---------------------------------------------------------------------- // Add Bindings... // ---------------------------------------------------------------------- m_oBindings.setAttribute( "name", QString("BasicHttpBinding_%1").arg( sClassName )); m_oBindings.setAttribute( "type", QString( "tns:%1" ).arg( sClassName )); oNode = createElement( "soap:binding" ); //oNode.setAttribute( "style" , "document" ); oNode.setAttribute( "transport", "http://schemas.xmlsoap.org/soap/http" ); m_oBindings.appendChild( oNode ); // ---------------------------------------------------------------------- // Loop for each method in class // ---------------------------------------------------------------------- QMapIterator< QString, MethodInfo > it( m_pServiceHost->GetMethods() ); while( it.hasNext()) { it.next(); MethodInfo oInfo = it.value(); QString sRequestTypeName = oInfo.m_sName; QString sResponseTypeName = oInfo.m_sName + "Response"; QString sInputMsgName = QString( "%1_%2_InputMessage" ) .arg( sClassName ) .arg( oInfo.m_sName ); QString sOutputMsgName = QString( "%1_%2_OutputMessage" ) .arg( sClassName ) .arg( oInfo.m_sName ); // ------------------------------------------------------------------ // Create PortType Operations // ------------------------------------------------------------------ QDomElement oOp = createElement( "operation" ); oOp.setAttribute( "name", oInfo.m_sName ); // ------------------------------------------------------------------ // Create PortType input element // ------------------------------------------------------------------ oNode = createElement( "input" ); oNode.setAttribute( "wsaw:Action", QString( "%1/%2/%3" ) .arg( sTargetNamespace ) .arg( sClassName ) .arg( oInfo.m_sName )); oNode.setAttribute( "message" , "tns:" + sInputMsgName ); oOp.appendChild( oNode ); // ------------------------------------------------------------------ // Create PortType output element // ------------------------------------------------------------------ oNode = createElement( "output" ); oNode.setAttribute( "wsaw:Action", QString( "%1/%2/%3Response" ) .arg( sTargetNamespace ) .arg( sClassName ) .arg( oInfo.m_sName )); oNode.setAttribute( "message", "tns:" + sOutputMsgName ); oOp.appendChild( oNode ); m_oPortType.appendChild( oOp ); // ------------------------------------------------------------------ // Create Messages // ------------------------------------------------------------------ QDomElement oMsg = CreateMessage( oInfo, sInputMsgName, sRequestTypeName ); m_oRoot.insertAfter( oMsg, m_oLastMsg ); m_oLastMsg = oMsg; // ------------------------------------------------------------------ // Create Request Type // ------------------------------------------------------------------ m_oTypes.appendChild( CreateMethodType( oInfo, sRequestTypeName ) ); // ------------------------------------------------------------------ // Create Response message // ------------------------------------------------------------------ oMsg = CreateMessage( oInfo, sOutputMsgName, sResponseTypeName ); m_oRoot.insertAfter( oMsg, m_oLastMsg ); m_oLastMsg = oMsg; // ------------------------------------------------------------------ // Create Response Type // ------------------------------------------------------------------ m_oTypes.appendChild( CreateMethodType( oInfo, sResponseTypeName, true ) ); // ------------------------------------------------------------------ // Create Soap Binding Operations // ------------------------------------------------------------------ m_oBindings.appendChild( CreateBindingOperation( oInfo, sClassName )); } // ---------------------------------------------------------------------- // Add Service Details // ---------------------------------------------------------------------- QString sServiceName = QString( "%1Services" ).arg( sClassName ); m_oService.setAttribute( "name", sServiceName ); // ------------------------------------------------------------------ // Add Service Port // ------------------------------------------------------------------ QDomElement oPort = createElement( "port" ); oPort.setAttribute( "name" , QString("BasicHttpBinding_%1" ).arg( sClassName )); oPort.setAttribute( "binding", QString("tns:BasicHttpBinding_%1").arg( sClassName )); oNode = createElement( "soap:address" ); oNode.setAttribute( "location", "http://localhost:6544/" + m_pServiceHost->GetServiceControlURL() ); oPort.appendChild( oNode ); m_oService.appendChild( oPort ); // ---------------------------------------------------------------------- // Return wsdl doc to caller // ---------------------------------------------------------------------- QTextStream os( &(pRequest->m_response) ); pRequest->m_eResponseType = ResponseTypeXML; save( os, 0 ); return true; }