package jVARIANT;

/** @file SAFEARRAY.java
 *
 *  @brief b-CAP client library
 *
 *  @version	1.1
 *	@date		2014/1/30
 *	@author		DENSO WAVE (m)
 *
 */
public final class SAFEARRAY
{
	private int elem;
	private int vt;
	private byte[] bytArray;
	private Object[] objArray;
	
	public SAFEARRAY(int iNum)
	{
		elem = iNum;
		vt = VARENUM.VT_EMPTY;
	}
	
	public SAFEARRAY(int inputvt, byte[] inputbytArray)
	{
		if(inputbytArray != null && inputbytArray.length > 0)
		{
			elem = inputbytArray.length;

			switch(inputvt){
				case VARENUM.VT_UI1:
					vt = VARENUM.VT_UI1;
					bytArray = inputbytArray;
					break;
				default:
					SafeArrayPutType(inputvt);
					objArray = new Object[elem];
					for(int i = 0; i < elem; i++){
						objArray[i] = (Byte)inputbytArray[i];
					}
			}
		}
		else
		{
			elem = 0;
			vt = VARENUM.VT_EMPTY;
		}
	}
	
	public SAFEARRAY(int inputvt, Object[] inputobjArray)
	{
		if(inputobjArray != null && inputobjArray.length > 0)
		{
			Object tmpObj;
			elem = inputobjArray.length;
			
			switch(inputvt){
				case VARENUM.VT_UI1:
					vt = VARENUM.VT_UI1;
					bytArray = new byte[elem];
					for(int i = 0; i < elem; i++){
						try{
							tmpObj = new Byte(inputobjArray[i].toString());
							bytArray[i] = (Byte)tmpObj;
						}catch(NumberFormatException ignore){}
					}
					break;
				default:
					SafeArrayPutType(inputvt);
					objArray = inputobjArray;
			}
		}
		else
		{
			elem = 0;
			vt = VARENUM.VT_EMPTY;
		}
	}
	
	public void SafeArrayPutType(int iType)
	{
		if(VARENUM.IsVARENUM(iType) && ((iType & VARENUM.VT_ARRAY) == 0))
		{
			vt = iType;
			
			if(elem > 0){
				switch(vt){
					case VARENUM.VT_UI1:
						bytArray = new byte[elem];
						objArray = null;
						break;
					default:
						objArray = new Object[elem];
						bytArray = null;
				}
			}
		}
		else
		{
			vt = VARENUM.VT_EMPTY;
		}
	}
	
	public void SafeArrayPutElement(int index, byte byt)
	{
		switch(vt){
			case VARENUM.VT_UI1:
				if(bytArray != null && ((0 <= index) && (index < bytArray.length)))
				{
					bytArray[index] = byt;
				}
				break;
			default:
				SafeArrayPutElement(index, (Object) byt);
		}
	}
	
	public void SafeArrayPutElement(int index, Object obj)
	{
		Object tmpObj;
		
		switch(vt){
			case VARENUM.VT_UI1:
				try{
					tmpObj = new Byte(obj.toString());
					SafeArrayPutElement(index, (byte)(Byte) tmpObj);
				}catch(NumberFormatException ignore){}
				break;
			default:
				if(objArray != null && ((0 <= index) && (index < objArray.length)))
				{
					objArray[index] = obj;
				}
		}
	}
	
	public int SafeArrayGetType()
	{
		return vt;
	}
	
	public int SafeArrayGetElemsize()
	{
		return elem;
	}
	
	public Object SafeArrayGetElement(int index)
	{
		if(objArray != null && ((0 <= index) && (index < objArray.length)))
		{
			return objArray[index];
		}
		else
		{
			return null;
		}
	}
	
	public byte SafeArrayGetByteElement(int index)
	{
		if(bytArray != null && ((0 <= index) && (index < bytArray.length)))
		{
			return bytArray[index];
		}
		else
		{
			return 0;
		}
	}
	
	public Object[] SafeArrayGetArray()
	{
		return objArray;
	}
	
	public byte[] SafeArrayGetByteArray()
	{
		return bytArray;
	}
	
	@Override
	public boolean equals(Object obj){
		if(!(obj instanceof jVARIANT.SAFEARRAY)) return false;
		if(elem != ((SAFEARRAY)obj).elem) return false;
		if(vt != ((SAFEARRAY)obj).vt) return false;
		
		boolean flag = true;
		
		if(vt == VARENUM.VT_UI1){
			if(bytArray != null){
				if(((SAFEARRAY)obj).bytArray == null) return false;
				if(bytArray.length != ((SAFEARRAY)obj).bytArray.length) return false;
				
				for(int i = 0; i < bytArray.length; i++){
					flag = flag & (bytArray[i] == ((SAFEARRAY)obj).bytArray[i]);
				}
			}else{
				return ((SAFEARRAY)obj).bytArray == null;
			}
		}else{
			if(objArray != null){
				if(((SAFEARRAY)obj).objArray == null) return false;
				if(objArray.length != ((SAFEARRAY)obj).objArray.length) return false;
				
				for(int i = 0; i < objArray.length; i++){
					flag = flag & objArray[i].equals(((SAFEARRAY)obj).objArray[i]);
				}
			}else{
				return ((SAFEARRAY)obj).objArray == null;
			}
		}
		
		return flag;
	}
	
	@Override
	public String toString(){
		String strReturn = "";
		
		strReturn = "vt: " + Integer.toString(vt);
		
		if(vt == VARENUM.VT_UI1){
			strReturn += ", bytArray: (";
			
			if(bytArray == null){
				strReturn += "null";
			}else{
				for(int i = 0; i < bytArray.length; i++){
					strReturn += Byte.toString(bytArray[i]) + (i < bytArray.length - 1 ? ", " : "");
				}
			}
		}else{
			strReturn += ", objArray: (";
			
			if(objArray == null){
				strReturn += "null";
			}else{
				for(int i = 0; i < objArray.length; i++){
					strReturn += objArray[i].toString() + (i < objArray.length - 1 ? ", " : "");
				}
			}
		}
		
		strReturn += ")";
		
		return strReturn;
	}
}
