/****************************************************************** * * CyberUPnP for Java * * Copyright (C) Satoshi Konno 2002 * * File: ControlRequest.java * * Revision; * * 01/29/03 * - first revision. * 05/09/05 * - Changed getActionName() to return when the delimiter is not found. * ******************************************************************/ package org.cybergarage.upnp.control; import org.cybergarage.http.*; import org.cybergarage.xml.*; import org.cybergarage.soap.*; import org.cybergarage.upnp.*; public class ActionRequest extends ControlRequest { //////////////////////////////////////////////// // Constructor //////////////////////////////////////////////// public ActionRequest() { } public ActionRequest(HTTPRequest httpReq) { set(httpReq); } //////////////////////////////////////////////// // Action //////////////////////////////////////////////// public Node getActionNode() { Node bodyNode = getBodyNode(); if (bodyNode == null) return null; if (bodyNode.hasNodes() == false) return null; return bodyNode.getNode(0); } public String getActionName() { Node node = getActionNode(); if (node == null) return ""; String name = node.getName(); if (name == null) return ""; int idx = name.indexOf(SOAP.DELIM)+1; if (idx < 0) return ""; return name.substring(idx, name.length()); } public ArgumentList getArgumentList() { Node actNode = getActionNode(); int nArgNodes = actNode.getNNodes(); ArgumentList argList = new ArgumentList(); for (int n=0; n<nArgNodes; n++) { Argument arg = new Argument(); Node argNode = actNode.getNode(n); arg.setName(argNode.getName()); arg.setValue(argNode.getValue()); argList.add(arg); } return argList; } //////////////////////////////////////////////// // setRequest //////////////////////////////////////////////// public void setRequest(Action action, ArgumentList argList) { Service service = action.getService(); setRequestHost(service); setEnvelopeNode(SOAP.createEnvelopeBodyNode()); Node envNode = getEnvelopeNode(); Node bodyNode = getBodyNode(); Node argNode = createContentNode(service, action, argList); bodyNode.addNode(argNode); setContent(envNode); String serviceType = service.getServiceType(); String actionName = action.getName(); String soapAction = "\"" + serviceType + "#" + actionName + "\""; setSOAPAction(soapAction); } //////////////////////////////////////////////// // Contents //////////////////////////////////////////////// private Node createContentNode(Service service, Action action, ArgumentList argList) { String actionName = action.getName(); String serviceType = service.getServiceType(); Node actionNode = new Node(); actionNode.setName(Control.NS, actionName); actionNode.setNameSpace(Control.NS, serviceType); int argListCnt = argList.size(); for (int n=0; n<argListCnt; n++) { Argument arg = argList.getArgument(n); Node argNode = new Node(); argNode.setName(arg.getName()); argNode.setValue(arg.getValue()); actionNode.addNode(argNode); } return actionNode; } //////////////////////////////////////////////// // post //////////////////////////////////////////////// public ActionResponse post() { SOAPResponse soapRes = postMessage(getRequestHost(), getRequestPort()); return new ActionResponse(soapRes); } }