/******************************************************************
*
*	CyberUPnP for Java
*
*	Copyright (C) Satoshi Konno 2002
*
*	File: ControlResponse.java
*
*	Revision;
*
*	01/29/03
*		- first revision.
*	
******************************************************************/

package org.cybergarage.upnp.control;

import org.cybergarage.http.*;
import org.cybergarage.xml.*;
import org.cybergarage.soap.*;

import org.cybergarage.upnp.*;

public class ControlResponse extends SOAPResponse
{
	public static final String FAULT_CODE = "Client";
	public static final String FAULT_STRING = "UPnPError";
	
	////////////////////////////////////////////////
	//	Constructor
	////////////////////////////////////////////////
	
	public ControlResponse()
	{
		setServer(UPnP.getServerName());
	}

	public ControlResponse(SOAPResponse soapRes)
	{
		super(soapRes);
	}
	
	////////////////////////////////////////////////
	//	FaultResponse
	////////////////////////////////////////////////

	public void setFaultResponse(int errCode, String errDescr)
	{
		setStatusCode(HTTPStatus.INTERNAL_SERVER_ERROR);
		
		Node bodyNode = getBodyNode();
		Node faultNode = createFaultResponseNode(errCode, errDescr);
		bodyNode.addNode(faultNode);

		Node envNode = getEnvelopeNode();
		setContent(envNode);
	}

	public void setFaultResponse(int errCode)
	{
		setFaultResponse(errCode, UPnPStatus.code2String(errCode));
	}

	////////////////////////////////////////////////
	//	createFaultResponseNode
	////////////////////////////////////////////////

	private Node createFaultResponseNode(int errCode, String errDescr)
	{
		// <s:Fault>
		Node faultNode = new Node(SOAP.XMLNS + SOAP.DELIM + SOAP.FAULT);

 		// <faultcode>s:Client</faultcode>
		Node faultCodeNode = new Node(SOAP.FAULT_CODE);
		faultCodeNode.setValue(SOAP.XMLNS + SOAP.DELIM + FAULT_CODE);
		faultNode.addNode(faultCodeNode);
		
		// <faultstring>UPnPError</faultstring>
		Node faultStringNode = new Node(SOAP.FAULT_STRING);
		faultStringNode.setValue(FAULT_STRING);
		faultNode.addNode(faultStringNode);

		// <detail>
		Node detailNode = new Node(SOAP.DETAIL);
		faultNode.addNode(detailNode);

		// <UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
		Node upnpErrorNode = new Node(FAULT_STRING);
		upnpErrorNode.setAttribute("xmlns", Control.XMLNS);
		detailNode.addNode(upnpErrorNode);

		// <errorCode>error code</errorCode>
		Node errorCodeNode = new Node(SOAP.ERROR_CODE);
		errorCodeNode.setValue(errCode);
		upnpErrorNode.addNode(errorCodeNode);

		// <errorDescription>error string</errorDescription>
		Node errorDesctiprionNode = new Node(SOAP.ERROR_DESCRIPTION);
		errorDesctiprionNode.setValue(errDescr);
		upnpErrorNode.addNode(errorDesctiprionNode);
		
		return faultNode;
	}
	
	////////////////////////////////////////////////
	//	UPnP Error
	////////////////////////////////////////////////
	
	private UPnPStatus upnpErr = new UPnPStatus();
	
	private Node getUPnPErrorNode()
	{
		Node detailNode = getFaultDetailNode();
		if (detailNode == null)
			return null;
		return detailNode.getNodeEndsWith(SOAP.UPNP_ERROR);
	}

	private Node getUPnPErrorCodeNode()
	{
		Node errorNode = getUPnPErrorNode();
		if (errorNode == null)
			return null;
		return errorNode.getNodeEndsWith(SOAP.ERROR_CODE);
	}

	private Node getUPnPErrorDescriptionNode()
	{
		Node errorNode = getUPnPErrorNode();
		if (errorNode == null)
			return null;
		return errorNode.getNodeEndsWith(SOAP.ERROR_DESCRIPTION);
	}

	public int getUPnPErrorCode()
	{
		Node errorCodeNode = getUPnPErrorCodeNode();
		if (errorCodeNode == null)
			return -1;
		String errorCodeStr = errorCodeNode.getValue();
		try {
			return Integer.parseInt(errorCodeStr);
		}
		catch (Exception e) {
			return -1;
		}
	}

	public String getUPnPErrorDescription()
	{
		Node errorDescNode = getUPnPErrorDescriptionNode();
		if (errorDescNode == null)
			return "";
		return errorDescNode.getValue();
	}

	public UPnPStatus getUPnPError()
	{
		int code = 0;
		String desc = "";
		code = getUPnPErrorCode();
		desc = getUPnPErrorDescription();
		upnpErr.setCode(code);
		upnpErr.setDescription(desc);
		return upnpErr;
	}

}
