package jbCAP;

import jVARIANT.VARIANT;
import jVARIANT.VARENUM;
import java.util.ArrayList;

/** @file bCapCollectionTmpl.java
 *
 *  @brief b-CAP client library
 *
 *  @version	1.2
 *	@date		2014/5/26
 *	@author		DENSO WAVE (m)
 *
 */
abstract class bCapCollectionTmpl {
	protected static final int E_CAO_VARIANT_TYPE_NOSUPPORT = 0x80000203;
	protected static final int E_CAO_OBJECT_NOTFOUND = 0x80000204;
	
	protected int m_hr;
	protected ArrayList<bCapObjectTmpl> m_objArray;
	
	protected int m_iHandle;
	protected bCapSocket m_bCapSock;
	
	protected bCapObjectTmpl Item(VARIANT index)
	{
		bCapObjectTmpl obj = null;
		
		int nIndex = _GetIndex(index);
		if(nIndex >= 0){
			obj = m_objArray.get(nIndex);
			m_hr = 0;
		}else{
			m_hr = nIndex;
		}
		
		return obj;
	}
	
	protected void Remove(bCapObjectTmpl obj)
	{
		int index = m_objArray.indexOf(obj);
		if(index >= 0){
			m_objArray.get(index).Disconnect();
			m_objArray.remove(index);
			m_hr = 0;
		}else{
			m_hr = E_CAO_OBJECT_NOTFOUND;
		}
	}
	
	public void Remove(VARIANT index)
	{
		int nIndex = _GetIndex(index);
		if(nIndex >= 0){
			m_objArray.get(nIndex).Disconnect();
			m_objArray.remove(nIndex);
			m_hr = 0;
		}else{
			m_hr = nIndex;
		}
	}
	
	public void Clear()
	{
		for(int i = 0; i < m_objArray.size(); i++)
		{
			m_objArray.get(i).Disconnect();
		}
		m_objArray.clear();
		
		m_hr = 0;
	}
	
	public boolean IsMember(VARIANT index)
	{
		return _GetIndex(index) >= 0;
	}
	
	public int get_Count()
	{
		return m_objArray.size();
	}
	
	public int HRESULT()
	{
		return m_hr;
	}
	
	private int _GetIndex(VARIANT index){
		int iReturn = -1;
		
		if(index == null) return E_CAO_OBJECT_NOTFOUND;
		
		int vt = index.VariantGetType();
		Object obj = index.VariantGetObject();
		
		if(obj == null) return E_CAO_OBJECT_NOTFOUND;
		
		switch(vt){
			case VARENUM.VT_I4:
				if(0 <= (Integer)obj && (Integer)obj < m_objArray.size())
				{
					iReturn = (Integer)obj;
				}else{
					iReturn = E_CAO_OBJECT_NOTFOUND;
				}
				break;
			case VARENUM.VT_BSTR:
				for(int i = 0; i < m_objArray.size(); i++)
				{
					if((m_objArray.get(i).get_Name()).equals((String)obj)){
						iReturn = i;
						break;
					}
				}
				if(iReturn == -1){
					iReturn = E_CAO_OBJECT_NOTFOUND;
				}
				break;
			default:
				iReturn = E_CAO_VARIANT_TYPE_NOSUPPORT;
				break;
		}
		
		return iReturn;
	}
}
