void CpiDeviceLpec::Invocable::InvokeAction(Invocation& aInvocation) { AutoMutex a(iDevice.iLock); iDevice.iResponseHandler = this; iInvocation = &aInvocation; iDevice.iWriteBuffer->Write(Lpec::kMethodAction); iDevice.iWriteBuffer->Write(' '); iDevice.iWriteBuffer->Write(iDevice.iLpecName); iDevice.iWriteBuffer->Write('/'); iDevice.iWriteBuffer->Write(aInvocation.ServiceType().Name()); iDevice.iWriteBuffer->Write(' '); Bws<Ascii::kMaxUintStringBytes> verBuf; (void)Ascii::AppendDec(verBuf, aInvocation.ServiceType().Version()); iDevice.iWriteBuffer->Write(verBuf); iDevice.iWriteBuffer->Write(' '); iDevice.iWriteBuffer->Write(aInvocation.Action().Name()); std::vector<Argument*> inputArgs = aInvocation.InputArguments(); for (TUint i=0; i<inputArgs.size(); i++) { inputArgs[i]->ProcessInput(*this); } iDevice.iWriteBuffer->Write(Lpec::kMsgTerminator); iDevice.iWriteBuffer->WriteFlush(); iSem.Wait(); // wait for response iInvocation = NULL; iDevice.iResponseHandler = NULL; }
void InvocationBodyWriter::Write(const Invocation& aInvocation) { const Brn kXmlVers("<?xml version=\"1.0\"?>"); const Brn kEnvelopeOpen("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/" "\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"); const Brn kEnvelopeClose("</s:Envelope>"); const Brn kBodyOpen("<s:Body>"); const Brn kBodyClose("</s:Body>"); const Brn kActionOpenStart("<u:"); const Brn kActionNs(" xmlns:u=\""); const Brn kActionCloseStart("</u:"); iWriteBuffer.Write(kXmlVers); iWriterAscii.WriteNewline(); iWriteBuffer.Write(kEnvelopeOpen); iWriterAscii.WriteNewline(); iWriteBuffer.Write(kBodyOpen); iWriterAscii.WriteNewline(); iWriteBuffer.Write(kActionOpenStart); iWriteBuffer.Write(aInvocation.Action().Name()); iWriteBuffer.Write(kActionNs); InvocationUpnp::WriteServiceType(iWriterAscii, aInvocation); iWriteBuffer.Write('\"'); iWriteBuffer.Write('>'); iWriterAscii.WriteNewline(); const Invocation::VectorArguments& inArgs = aInvocation.InputArguments(); const TUint count = (TUint)inArgs.size(); for (TUint i=0; i<count; i++) { iWriteBuffer.Write('<'); const Brx& argName = inArgs[i]->Parameter().Name(); iWriteBuffer.Write(argName); iWriteBuffer.Write('>'); inArgs[i]->ProcessInput(*this); iWriteBuffer.Write('<'); iWriteBuffer.Write('/'); iWriteBuffer.Write(argName); iWriteBuffer.Write('>'); iWriterAscii.WriteNewline(); } iWriteBuffer.Write(kActionCloseStart); iWriteBuffer.Write(aInvocation.Action().Name()); iWriteBuffer.Write('>'); iWriterAscii.WriteNewline(); iWriteBuffer.Write(kBodyClose); iWriterAscii.WriteNewline(); iWriteBuffer.Write(kEnvelopeClose); iWriterAscii.WriteNewline(); iWriteBuffer.WriteFlush(); }