package jbCAP;

import jVARIANT.VARIANT;
import jVARIANT.VARENUM;
import java.util.Arrays;

/** @file bCapFile.java
 *
 *  @brief b-CAP client library
 *
 *  @version	1.2
 *	@date		2014/5/26
 *	@author		DENSO WAVE (m)
 *
 */
public class bCapFile extends bCapObjectTmpl{
	private bCapFiles m_files;
	private bCapVariables m_vars;
	
	protected bCapFile(int iHandle, bCapSocket sock)
	{
		m_hr = 0;
		
		m_iHandle = iHandle;
		m_bCapSock = sock;
		m_iOffset = 54;
		
		m_files = new bCapFiles(m_iHandle, m_bCapSock, 1);
		m_vars = new bCapVariables(m_iHandle, m_bCapSock, 2);
	}
	
	@Override
	protected void Disconnect()
	{
		// Clear bCap Objects
		m_files.Clear();
		m_vars.Clear();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 61; // File_Release
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
	
	public VARIANT get_FileNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 39; // File_GetVariableNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);		
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	public bCapFiles get_Files()
	{
		return m_files;
	}
	
	public VARIANT get_VariableNames(String strOption)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 40; // File_GetVariableNames
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);		
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	public bCapVariables get_Variables()
	{
		return m_vars;
	}
	
	public bCapFile AddFile(String strName, String strOption)
	{
		bCapFile file = m_files.Add(strName, strOption);
		m_hr = m_files.HRESULT();
		
		return file;
	}
	
	public bCapVariable AddVariable(String strName, String strOption)
	{
		bCapVariable var = m_vars.Add(strName, strOption);
		m_hr = m_vars.HRESULT();
		
		return var;
	}
	
	public VARIANT get_DateCreated()
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 46; // File_GetDateCreated
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	public VARIANT get_DateLastAccessed()
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 47; // File_GetLastAccessed
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	public VARIANT get_DateLastModified()
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 48; // File_GetLastModified
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	public int get_Size()
	{
		int iReturn = 0;
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 50; // File_GetSize
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1 && msg.m_vntArray.get(0).VariantGetType() == VARENUM.VT_I4)
		{
			iReturn = (Integer)msg.m_vntArray.get(0).VariantGetObject();
		}
		
		return iReturn;
	}
	
	public String get_Path()
	{
		String strReturn = "";
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 49; // File_GetPath
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1 && msg.m_vntArray.get(0).VariantGetType() == VARENUM.VT_BSTR)
		{
			strReturn = (String)msg.m_vntArray.get(0).VariantGetObject();
		}
		
		return strReturn;
	}
	
	public String get_Type()
	{
		String strReturn = "";
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 51; // File_GetType
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1 && msg.m_vntArray.get(0).VariantGetType() == VARENUM.VT_BSTR)
		{
			strReturn = (String)msg.m_vntArray.get(0).VariantGetObject();
		}
		
		return strReturn;
	}
	
	public VARIANT get_Value()
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 52; // File_GetValue
		
		VARIANT vnt = new VARIANT(VARENUM.VT_I4, m_iHandle);
		msg.m_vntArray.add(vnt);
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	public void put_Value(VARIANT newVal)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 53; // File_PutValue
		
		VARIANT vnt[] = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = newVal != null ? newVal : new VARIANT();
		msg.m_vntArray.addAll(Arrays.asList(vnt));

		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
	}
	
	public void Copy(String strName, String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 42; // File_Copy
		
		VARIANT[] vnt = new VARIANT[3];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strName);
		vnt[2] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}
	
	public void Delete(String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 43; // File_Delete
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;			
	}
	
	public void Move(String strName, String strOption)
	{
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 44; // File_Move
		
		VARIANT[] vnt = new VARIANT[3];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strName);
		vnt[2] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;		
	}
	
	public String Run(String strOption)
	{
		String strReturn = "";
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 45; // File_Run
		
		VARIANT[] vnt = new VARIANT[2];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strOption);
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;
		
		if(msg.m_vntArray.size() == 1 && msg.m_vntArray.get(0).VariantGetType() == VARENUM.VT_BSTR)
		{
			strReturn = (String)msg.m_vntArray.get(0).VariantGetObject();
		}
		
		return strReturn;
	}
	
	public VARIANT Execute(String strCommand, VARIANT vntParam)
	{
		VARIANT vntReturn = new VARIANT();
		
		bCapPacket msg = new bCapPacket();
		msg.m_ID = 41; // File_Execute
		
		VARIANT[] vnt = new VARIANT[3];
		vnt[0] = new VARIANT(VARENUM.VT_I4, m_iHandle);
		vnt[1] = new VARIANT(VARENUM.VT_BSTR, strCommand);
		vnt[2] = vntParam != null ? vntParam : new VARIANT();
		msg.m_vntArray.addAll(Arrays.asList(vnt));
		
		msg = m_bCapSock.SendMessage(msg);
		
		m_hr = msg.m_ID;

		if(msg.m_vntArray.size() == 1)
		{
			vntReturn = msg.m_vntArray.get(0);
		}
		
		return vntReturn;
	}
	
	protected int get_Offset()
	{
		return 54;
	}
}
