/**
*******************************************************************************
* Copyright (C) 2006-2007, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
*******************************************************************************
*/ 
package com.ibm.icu.charset;



/*
 * Defines the UConverterSharedData struct,
 * the immutable, shared part of UConverter.
 */
final class UConverterSharedData {
    //uint32_t structSize;            /* Size of this structure */
	 int structSize;            /* Size of this structure */
    //uint32_t referenceCounter;      /* used to count number of clients, 0xffffffff for static SharedData */
	 int referenceCounter;      /* used to count number of clients, 0xffffffff for static SharedData */

	//agljport:todo const void *dataMemory;         /* from udata_openChoice() - for cleanup */
	//agljport:todo void *table;                    /* Unused. This used to be a UConverterTable - Pointer to conversion data - see mbcs below */

    //const UConverterStaticData *staticData; /* pointer to the static (non changing) data. */
	 UConverterStaticData staticData; /* pointer to the static (non changing) data. */

    //UBool                sharedDataCached;   /* TRUE:  shared data is in cache, don't destroy on close() if 0 ref.  FALSE: shared data isn't in the cache, do attempt to clean it up if the ref is 0 */
	 boolean                sharedDataCached;   /* TRUE:  shared data is in cache, don't destroy on close() if 0 ref.  FALSE: shared data isn't in the cache, do attempt to clean it up if the ref is 0 */
	/*UBool               staticDataOwned;   TRUE if static data owned by shared data & should be freed with it, NEVER true for udata() loaded statics. This ignored variable was removed to make space for sharedDataCached.   */

    //const UConverterImpl *impl;     /* vtable-style struct of mostly function pointers */
	// UConverterImpl impl;     /* vtable-style struct of mostly function pointers */

	/*initial values of some members of the mutable part of object */
    //uint32_t toUnicodeStatus;
	 long toUnicodeStatus;

	/*
	 * Shared data structures currently come in two flavors:
	 * - readonly for built-in algorithmic converters
	 * - allocated for MBCS, with a pointer to an allocated UConverterTable
	 *   which always has a UConverterMBCSTable
	 *
	 * To eliminate one allocation, I am making the UConverterMBCSTable
	 * a member of the shared data. It is the last member so that static
	 * definitions of UConverterSharedData work as before.
	 * The table field above also remains to avoid updating all static
	 * definitions, but is now unused.
	 *
	 */
	 CharsetMBCS.UConverterMBCSTable mbcs;

	 UConverterSharedData()
	{
		mbcs = new CharsetMBCS.UConverterMBCSTable();
	}
	
	 UConverterSharedData(int structSize_, int referenceCounter_, UConverterStaticData staticData_, boolean sharedDataCached_,/* UConverterImpl impl_,*/ long toUnicodeStatus_)
	{
		this();
		structSize = structSize_;
		referenceCounter = referenceCounter_;
		staticData = staticData_;
		sharedDataCached = sharedDataCached_;
		//impl = impl_;
		toUnicodeStatus = toUnicodeStatus_;
	}

	/**
	 * UConverterImpl contains all the data and functions for a converter type.
	 * Its function pointers work much like a C++ vtable.
	 * Many converter types need to define only a subset of the functions;
	 * when a function pointer is NULL, then a default action will be performed.
	 *
	 * Every converter type must implement toUnicode, fromUnicode, and getNextUChar,
	 * otherwise the converter may crash.
	 * Every converter type that has variable-length codepage sequences should
	 * also implement toUnicodeWithOffsets and fromUnicodeWithOffsets for
	 * correct offset handling.
	 * All other functions may or may not be implemented - it depends only on
	 * whether the converter type needs them.
	 *
	 * When open() fails, then close() will be called, if present.
	 */
	// class UConverterImpl {
	    //UConverterType type;
	    //UConverterToUnicode toUnicode;
/*	protected void doToUnicode(UConverterToUnicodeArgs args, int[] pErrorCode)
	{
	}
	
	 final void toUnicode(UConverterToUnicodeArgs args, int[] pErrorCode)
	{
		doToUnicode(args, pErrorCode);
	}
	
	//UConverterFromUnicode fromUnicode;
	protected void doFromUnicode(UConverterFromUnicodeArgs args, int[] pErrorCode)
	{
	}
	
	 final void fromUnicode(UConverterFromUnicodeArgs args, int[] pErrorCode)
	{
		doFromUnicode(args, pErrorCode);
	}
	
	protected int doGetNextUChar(UConverterToUnicodeArgs args, int[] pErrorCode)
	{
		return 0;
	}
	
	//UConverterGetNextUChar getNextUChar;
	 final int getNextUChar(UConverterToUnicodeArgs args, int[] pErrorCode)
	{
		return doGetNextUChar(args, pErrorCode);
	}
	
	// interface UConverterImplLoadable extends UConverterImpl
	protected void doLoad(UConverterLoadArgs pArgs, short[] raw, int[] pErrorCode)
	{
	}
	
	protected void doUnload()
	{
	}

	// interface UConverterImplOpenable extends UConverterImpl
	protected void doOpen(UConverter cnv, String name, String locale, long options, int[] pErrorCode)
	{
	}
    
	//UConverterOpen open;
	 final void open(UConverter cnv, String name, String locale, long options, int[] pErrorCode)
	{
		doOpen(cnv, name, locale, options, pErrorCode);
	}
	
	protected void doClose(UConverter cnv)
	{
	}
	
    //UConverterClose close;
	 final void close(UConverter cnv)
	{
		doClose(cnv);
	}
	
	protected void doReset(UConverter cnv, int choice)
	{
	}
	
	//typedef void (*UConverterReset) (UConverter *cnv, UConverterResetChoice choice);
	//UConverterReset reset;
	 final void reset(UConverter cnv, int choice)
	{
		doReset(cnv, choice);
	}

	// interface UConverterImplVariableLength extends UConverterImpl
	protected void doToUnicodeWithOffsets(UConverterToUnicodeArgs args, int[] pErrorCode)
	{
	}
	
    //UConverterToUnicode toUnicodeWithOffsets;
	 final void toUnicodeWithOffsets(UConverterToUnicodeArgs args, int[] pErrorCode)
	{
		doToUnicodeWithOffsets(args, pErrorCode);
	}
	
	protected void doFromUnicodeWithOffsets(UConverterFromUnicodeArgs args, int[] pErrorCode)
	{
	}
	
    //UConverterFromUnicode fromUnicodeWithOffsets;
	 final void fromUnicodeWithOffsets(UConverterFromUnicodeArgs args, int[] pErrorCode)
	{
		doFromUnicodeWithOffsets(args, pErrorCode);
	}

	// interface UConverterImplMisc extends UConverterImpl
	protected void doGetStarters(UConverter converter, boolean starters[], int[] pErrorCode)
	{
	}
	
    //UConverterGetStarters getStarters;
	 final void getStarters(UConverter converter, boolean starters[], int[] pErrorCode)
	{
		doGetStarters(converter, starters, pErrorCode);
	}
	
	protected String doGetName(UConverter cnv)
	{
		return "";
	}
	
    //UConverterGetName getName;
	 final String getName(UConverter cnv)
	{
		return doGetName(cnv);
	}
	
	protected void doWriteSub(UConverterFromUnicodeArgs pArgs, long offsetIndex, int[] pErrorCode)
	{
	}
	
	//UConverterWriteSub writeSub;
	 final void writeSub(UConverterFromUnicodeArgs pArgs, long offsetIndex, int[] pErrorCode)
	{
		doWriteSub(pArgs, offsetIndex, pErrorCode);
	}
	
	protected UConverter doSafeClone(UConverter cnv, byte[] stackBuffer, int[] pBufferSize, int[] status)
	{
		return new UConverter();
	}

    //UConverterSafeClone safeClone;
	 final UConverter  safeClone(UConverter cnv, byte[] stackBuffer, int[] pBufferSize, int[] status)
	{
		return doSafeClone(cnv, stackBuffer, pBufferSize, status);
	}
	
	protected void doGetUnicodeSet(UConverter cnv, UnicodeSet /*USetAdder* / sa, int /*UConverterUnicodeSet* / which, int[] pErrorCode)
	{
	}
	
    //UConverterGetUnicodeSet getUnicodeSet;
	// final void getUnicodeSet(UConverter cnv, UnicodeSet /*USetAdder* / sa, int /*UConverterUnicodeSet* / which, int[] pErrorCode)
	//{
	//	doGetUnicodeSet(cnv, sa, which, pErrorCode);
	//}

	//}

	static final String DATA_TYPE = "cnv";
	private static final int CNV_DATA_BUFFER_SIZE = 25000;
	 static final int sizeofUConverterSharedData = 100;
	
	//static UDataMemoryIsAcceptable isCnvAcceptable;

	/**
	 * Load a non-algorithmic converter.
	 * If pkg==NULL, then this function must be called inside umtx_lock(&cnvCacheMutex).
	 
	// UConverterSharedData * load(UConverterLoadArgs *pArgs, UErrorCode *err)
	 static final UConverterSharedData load(UConverterLoadArgs pArgs, int[] err)
	{
	    UConverterSharedData mySharedConverterData = null;
	
	    if(err == null || ErrorCode.isFailure(err[0])) {
	        return null;
	    }
	
	    if(pArgs.pkg != null && pArgs.pkg.length() != 0) {
	         application-provided converters are not currently cached 
	        return UConverterSharedData.createConverterFromFile(pArgs, err);
	    }
	
	    //agljport:fix mySharedConverterData = getSharedConverterData(pArgs.name);
	    if (mySharedConverterData == null)
	    {
	        Not cached, we need to stream it in from file 
	        mySharedConverterData = UConverterSharedData.createConverterFromFile(pArgs, err);
	        if (ErrorCode.isFailure(err[0]) || (mySharedConverterData == null))
	        {
	            return null;
	        }
	        else
	        {
	             share it with other library clients 
	            //agljport:fix shareConverterData(mySharedConverterData);
	        }
	    }
	    else
	    {
	         The data for this converter was already in the cache.            
	         Update the reference counter on the shared data: one more client 
	        mySharedConverterData.referenceCounter++;
	    }
	
	    return mySharedConverterData;
	}
	
	Takes an alias name gets an actual converter file name
	 *goes to disk and opens it.
	 *allocates the memory and returns a new UConverter object
	 
	//static UConverterSharedData *createConverterFromFile(UConverterLoadArgs *pArgs, UErrorCode * err)
	 static final UConverterSharedData createConverterFromFile(UConverterLoadArgs pArgs, int[] err)
	{
	    UDataMemory data = null;
	    UConverterSharedData sharedData = null;
	
	    //agljport:todo UTRACE_ENTRY_OC(UTRACE_LOAD);
	
	    if (err == null || ErrorCode.isFailure(err[0])) {
	        //agljport:todo UTRACE_EXIT_STATUS(*err);
	        return null;
	    }
	
	    //agljport:todo UTRACE_DATA2(UTRACE_OPEN_CLOSE, "load converter %s from package %s", pArgs->name, pArgs->pkg);
	
	    //agljport:fix data = udata_openChoice(pArgs.pkgArray, DATA_TYPE.getBytes(), pArgs.name, isCnvAcceptable, null, err);
	    if(ErrorCode.isFailure(err[0]))
	    {
	        //agljport:todo UTRACE_EXIT_STATUS(*err);
	        return null;
	    }
	
	    sharedData = data_unFlattenClone(pArgs, data, err);
	    if(ErrorCode.isFailure(err[0]))
	    {
	        //agljport:fix udata_close(data);
	        //agljport:todo UTRACE_EXIT_STATUS(*err);
	        return null;
	    }
	
	    
	     * TODO Store pkg in a field in the shared data so that delta-only converters
	     * can load base converters from the same package.
	     * If the pkg name is longer than the field, then either do not load the converter
	     * in the first place, or just set the pkg field to "".
	     
	
	    return sharedData;
	}
*/
	UConverterDataReader dataReader = null;
	


	/*returns a converter type from a string
	 */
	// static const UConverterSharedData * getAlgorithmicTypeFromName(const char *realName)
/*	 static final UConverterSharedData getAlgorithmicTypeFromName(String realName)
	{
	    long mid, start, limit;
	    long lastMid;
	    int result;
	    StringBuffer strippedName = new StringBuffer(UConverterConstants.MAX_CONVERTER_NAME_LENGTH);
	
	    // Lower case and remove ignoreable characters.
	    UConverterAlias.stripForCompare(strippedName, realName);
	
	    // do a binary search for the alias
	    start = 0;
	    limit = cnvNameType.length;
	    mid = limit;
	    lastMid = -1;
	
	    for (;;) {
	        mid = (long)((start + limit) / 2);
	        if (lastMid == mid) {   // Have we moved?
	            break;  // We haven't moved, and it wasn't found.
	        }
	        lastMid = mid;
	        result = strippedName.substring(0).compareTo(cnvNameType[(int)mid].name);
	
	        if (result < 0) {
	            limit = mid;
	        } else if (result > 0) {
	            start = mid;
	        } else {
	            return converterData[cnvNameType[(int)mid].type];
	        }
	    }
	
	    return null;
	}*/
	/*
	 * Enum for specifying basic types of converters
	 * @see getType
	 * @draft ICU 3.6
	 */
	static final class UConverterType {
	    static final int UNSUPPORTED_CONVERTER = -1;
	    static final int SBCS = 0;
	    static final int DBCS = 1;
	    static final int MBCS = 2;
	    static final int LATIN_1 = 3;
	    static final int UTF8 = 4;
	    static final int UTF16_BigEndian = 5;
	    static final int UTF16_LittleEndian = 6;
	    static final int UTF32_BigEndian = 7;
	    static final int UTF32_LittleEndian = 8;
	    static final int EBCDIC_STATEFUL = 9;
	    static final int ISO_2022 = 10;

	    static final int LMBCS_1 = 11;
	    static final int LMBCS_2 = LMBCS_1 + 1; //12
	    static final int LMBCS_3 = LMBCS_2 + 1; //13
	    static final int LMBCS_4 = LMBCS_3 + 1; //14
	    static final int LMBCS_5 = LMBCS_4 + 1; //15
	    static final int LMBCS_6 = LMBCS_5 + 1; //16
	    static final int LMBCS_8 = LMBCS_6 + 1; //17
	    static final int LMBCS_11 = LMBCS_8 + 1; //18
	    static final int LMBCS_16 = LMBCS_11 + 1; //19
	    static final int LMBCS_17 = LMBCS_16 + 1; //20
	    static final int LMBCS_18 = LMBCS_17 + 1; //21
	    static final int LMBCS_19 = LMBCS_18 + 1; //22
	    static final int LMBCS_LAST = LMBCS_19; //22
	    static final int HZ =LMBCS_LAST + 1; //23
	    static final int SCSU = HZ + 1; //24
	    static final int ISCII = SCSU + 1; //25
	    static final int US_ASCII = ISCII + 1; //26
	    static final int UTF7 = US_ASCII + 1; //27
	    static final int BOCU1 = UTF7 + 1; //28
	    static final int UTF16 = BOCU1 + 1; //29
	    static final int UTF32 = UTF16 + 1; //30
	    static final int CESU8 = UTF32 + 1; //31
	    static final int IMAP_MAILBOX = CESU8 + 1; //32
	    //static final int MAC_ARABIC = IMAP_MAILBOX + 1; //33 Not in ICU4C
	    //static final int MAC_HEBREW = MAC_ARABIC + 1; //34 Not in ICU4C

	    // Number of converter types for which we have conversion routines.
	    static final int NUMBER_OF_SUPPORTED_CONVERTER_TYPES = IMAP_MAILBOX + 1;
	}
	
	/**
	 * Enum for specifying which platform a converter ID refers to.
	 * The use of platform/CCSID is not recommended. See openCCSID().
	 * @draft ICU 3.6
	 */
	 static final class UConverterPlatform {
	     static final int UNKNOWN = -1;
	     static final int IBM = 0;
	}

	static UConverterSharedData _MBCSData = null, /*_Latin1Data = null,*/ /*_UTF8Data = null,*/ /*_UTF16BEData = null,*/ /*_UTF16LEData = null,*/ /*_UTF32BEData = null,*/ /*_UTF32LEData = null,*/  /*_ISO2022Data = null,*/ _LMBCSData1 = null,_LMBCSData2 = null, _LMBCSData3 = null, _LMBCSData4 = null, _LMBCSData5 = null, _LMBCSData6 = null, _LMBCSData8 = null,_LMBCSData11 = null,_LMBCSData16 = null,_LMBCSData17 = null,_LMBCSData18 = null,_LMBCSData19 = null, _HZData = null, _SCSUData = null, /*_ISCIIData = null,*/ /*_ASCIIData = null,*/ _UTF7Data = null, _Bocu1Data = null, /*_UTF16Data = null, _UTF32Data = null,*/ _CESU8Data = null, _IMAPData = null;
	static UConverterSharedData[] converterData;
/*	static class cnvNameTypeClass {
	  String name;
		int type;
		cnvNameTypeClass(String name_, int type_) { name = name_; type = type_; }
	} 
	
	static cnvNameTypeClass cnvNameType[];*/
	
    static final String DATA_TYPE = "cnv";
    //static final int CNV_DATA_BUFFER_SIZE = 25000;
    static final int SIZE_OF_UCONVERTER_SHARED_DATA = 228;

	static final int MAXIMUM_UCS2 =            0x0000FFFF;
	static final int MAXIMUM_UTF =             0x0010FFFF;
	static final int MAXIMUM_UCS4 =            0x7FFFFFFF;
	static final int HALF_SHIFT =              10;
	static final int HALF_BASE =               0x0010000;
	static final int HALF_MASK =               0x3FF;
	static final int SURROGATE_HIGH_START =    0xD800;
	static final int SURROGATE_HIGH_END =      0xDBFF;
	static final int SURROGATE_LOW_START =     0xDC00;
	static final int SURROGATE_LOW_END =       0xDFFF;
	
	/* -SURROGATE_LOW_START + HALF_BASE */
	static final int SURROGATE_LOW_BASE =      9216;
}
