/******************************************************************
*
*	CyberUPnP for Java
*
*	Copyright (C) Satoshi Konno 2002
*
*	File: ActionResponse.java
*
*	Revision;
*
*	01/29/03
*		- first revision.
*	09/02/03
*		- Giordano Sassaroli <sassarol@cefriel.it>
*		- Problem : Action Responses do not contain the mandatory header field EXT
*		- Error : ActionResponse class does not set the EXT header
*	
******************************************************************/

package org.cybergarage.upnp.control;

import org.cybergarage.upnp.*;
import org.cybergarage.http.*;
import org.cybergarage.soap.*;
import org.cybergarage.xml.*;

public class ActionResponse extends ControlResponse
{
	////////////////////////////////////////////////
	//	Constructor
	////////////////////////////////////////////////
	
	public ActionResponse()
	{
		setHeader(HTTP.EXT, "");
	}

	public ActionResponse(SOAPResponse soapRes)
	{
		super(soapRes);
		setHeader(HTTP.EXT, "");
	}


	////////////////////////////////////////////////
	//	Response
	////////////////////////////////////////////////

	public void setResponse(Action action)
	{
		setStatusCode(HTTPStatus.OK);
	
		Node bodyNode = getBodyNode();
		Node resNode = createResponseNode(action);
		bodyNode.addNode(resNode);

		Node envNode = getEnvelopeNode();
		setContent(envNode);
	}

	private Node createResponseNode(Action action)
	{
		String actionName = action.getName();
		Node actionNameResNode = new Node(SOAP.METHODNS + SOAP.DELIM + actionName + SOAP.RESPONSE);
		
		Service service = action.getService();
		if (service != null) {
			actionNameResNode.setAttribute(
				"xmlns:" + SOAP.METHODNS,
					service.getServiceType());
		}
		
		ArgumentList argList = action.getArgumentList();
		int nArgs = argList.size();
		for (int n=0; n<nArgs; n++) {
			Argument arg = argList.getArgument(n);
			if (arg.isOutDirection() == false)
				continue;
			Node argNode = new Node();
			argNode.setName(arg.getName());
			argNode.setValue(arg.getValue());
			actionNameResNode.addNode(argNode);
		}
		
		return actionNameResNode;
	}

	////////////////////////////////////////////////
	//	getResponse
	////////////////////////////////////////////////

	private Node getActionResponseNode()
	{
		Node bodyNode = getBodyNode();
		if (bodyNode == null || bodyNode.hasNodes() == false)
			return null;
		return bodyNode.getNode(0);
	}
	
	
	public ArgumentList getResponse()
	{
		ArgumentList argList = new ArgumentList();
		
		Node resNode = getActionResponseNode();
		if (resNode == null)
			return argList;
			
		int nArgs = resNode.getNNodes();
		for (int n=0; n<nArgs; n++) {
			Node node = resNode.getNode(n);
			String name = node.getName();
			String value = node.getValue();
			Argument arg = new Argument(name, value);
			argList.add(arg);
		}
		
		return argList;
	}
}
