/**************************************************************************
 * FUNCTION:  Java_org_opensaf_ais_amf_CsiManagerImpl_getHaState
 * TYPE:      native method
 *  Class:     ais_amf_CsiManager
 *  Method:    getHaState
 *  Signature: (Ljava/lang/String;Ljava/lang/String;)Lorg/saforum/ais/amf/HaState;
 *************************************************************************/
JNIEXPORT jobject JNICALL
Java_org_opensaf_ais_amf_CsiManagerImpl_getHaState(JNIEnv *jniEnv,
						   jobject thisCsiManager,
						   jstring componentName,
						   jstring csiName)
{
	// VARIABLES
	SaNameT _saComponentName;
	SaNameT *_saComponentNamePtr = &_saComponentName;
	SaNameT _saCsiName;
	SaNameT *_saCsiNamePtr = &_saCsiName;
	SaAmfHandleT _saAmfHandle;
	SaAmfHAStateT _saHaState = SA_AMF_HA_QUIESCING + 1;	// this is an invalid value...
	SaAisErrorT _saStatus;
	// JNI
	jobject _amfLibraryHandle;
	jobject _haState;

	// BODY

	assert(thisCsiManager != NULL);
	_TRACE2
		("NATIVE: Executing Java_org_opensaf_ais_amf_CsiManagerImpl_getHaState()\n");

	// get Java library handle
	_amfLibraryHandle = (*jniEnv)->GetObjectField(jniEnv,
						      thisCsiManager,
						      FID_amfLibraryHandle);

	assert(_amfLibraryHandle != NULL);

	// get native library handle
	_saAmfHandle = (SaAmfHandleT)(*jniEnv)->GetLongField(jniEnv,
							     _amfLibraryHandle,
							     FID_saAmfHandle);
	// copy Java component name object
	if (JNU_copyFromStringToSaNameT(jniEnv,
					componentName,
					&_saComponentNamePtr) != JNI_TRUE) {
		return NULL;	// EXIT POINT! Exception pending...
	}

	U_printSaName("NATIVE: component name is ", _saComponentNamePtr);

	// copy Java CSI name object
	if (JNU_copyFromStringToSaNameT(jniEnv,
					csiName, &_saCsiNamePtr) != JNI_TRUE) {
		return NULL;	// EXIT POINT! Exception pending...
	}

	U_printSaName("NATIVE: CSI name is ", _saCsiNamePtr);
	_TRACE2
		("NATIVE: _saHaState before calling saAmfHAStateGet(...) is: %d\n",
		 _saHaState);

	// call saAmfHAStateGet
	_saStatus = saAmfHAStateGet(_saAmfHandle,
				    _saComponentNamePtr,
				    _saCsiNamePtr, &_saHaState);

	_TRACE2
		("NATIVE: _saHaState after saAmfHAStateGet(...) has returned is: %d\n",
		 _saHaState);
	_TRACE2("NATIVE: saAmfHAStateGet(...) has returned with %d...\n",
		_saStatus);

	// error handling
	if (_saStatus != SA_AIS_OK) {
		switch (_saStatus) {
		case SA_AIS_ERR_LIBRARY:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisLibraryException",
					   AIS_ERR_LIBRARY_MSG);
			break;
		case SA_AIS_ERR_TIMEOUT:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisTimeoutException",
					   AIS_ERR_TIMEOUT_MSG);
			break;
		case SA_AIS_ERR_TRY_AGAIN:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisTryAgainException",
					   AIS_ERR_TRY_AGAIN_MSG);
			break;
		case SA_AIS_ERR_BAD_HANDLE:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisBadHandleException",
					   AIS_ERR_BAD_HANDLE_MSG);
			break;
		case SA_AIS_ERR_INVALID_PARAM:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisInvalidParamException",
					   AIS_ERR_INVALID_PARAM_MSG);
			break;
		case SA_AIS_ERR_NO_MEMORY:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisNoMemoryException",
					   AIS_ERR_NO_MEMORY_MSG);
			break;
		case SA_AIS_ERR_NO_RESOURCES:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisNoResourcesException",
					   AIS_ERR_NO_RESOURCES_MSG);
			break;
		case SA_AIS_ERR_NOT_EXIST:
			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisNotExistException",
					   AIS_ERR_NOT_EXIST_MSG);
			break;
		default:
			// this should not happen here!

			assert(JNI_FALSE);

			JNU_throwNewByName(jniEnv,
					   "org/saforum/ais/AisLibraryException",
					   AIS_ERR_LIBRARY_MSG);
			break;
		}
		return NULL;	// EXIT POINT! Exception pending...
	}
	// return HA state
	_haState = JNU_HaState_getEnum(jniEnv, _saHaState);
	if (_haState == NULL) {
		// this should not happen here!

		_TRACE2("NATIVE ERROR: _haState is NULL\n");

		return NULL;	// AisLibraryException thrown already...
	}

	U_printSaAmfHAState
		("NATIVE: Java_org_opensaf_ais_amf_CsiManagerImpl_getHaState(...) returning normally with HA state: ",
		 _saHaState);

	return _haState;
}
/**************************************************************************
 * FUNCTION:  Java_org_opensaf_ais_amf_ComponentRegistryImpl_unregisterProxiedComponent
 * TYPE:      native method
 *  Class:     ais_amf_ComponentRegistry
 *  Method:    unregisterProxiedComponent
 *  Signature: (Ljava/lang/String;)V
 *************************************************************************/
JNIEXPORT void JNICALL Java_org_opensaf_ais_amf_ComponentRegistryImpl_unregisterProxiedComponent(
    JNIEnv* jniEnv,
    jobject thisComponentRegistry,
    jstring proxiedComponentName )
{
    SaNameT _saProxyComponentName;
    SaNameT _saProxiedComponentName;
    SaNameT* _saProxiedComponentNamePtr = &_saProxiedComponentName;
    SaAmfHandleT _saAmfHandle;
    SaAisErrorT _saStatus;
    // JNI
    jobject _amfLibraryHandle;
    jstring _thisComponentName;

    // BODY

    assert( thisComponentRegistry != NULL );
    _TRACE2( "NATIVE: Executing Java_org_opensaf_ais_amf_ComponentRegistryImpl_unregisterProxiedComponent(...)\n" );


    // get Java library handle
    _amfLibraryHandle = (*jniEnv)->GetObjectField( jniEnv,
                                                   thisComponentRegistry,
                                                   FID_amfLibraryHandle );

    assert( _amfLibraryHandle != NULL );

    // get native library handle
    _saAmfHandle = (SaAmfHandleT) (*jniEnv)->GetLongField( jniEnv,
                                                           _amfLibraryHandle,
                                                           FID_saAmfHandle );
    // get Java component name
    _thisComponentName = (*jniEnv)->GetObjectField( jniEnv,
                                                    thisComponentRegistry,
                                                    FID_componentName );
    // copy Java component name object
    if( JNU_copyFromStringToSaNameT_NotNull( jniEnv,
		                                     _thisComponentName,
        		                             &_saProxyComponentName ) != JNI_TRUE ){
        return; // EXIT POINT! Exception pending...
    }
    // copy Java proxied component name object
    if( JNU_copyFromStringToSaNameT( jniEnv,
                                     proxiedComponentName,
                                     &_saProxiedComponentNamePtr ) != JNI_TRUE ){
        return; // EXIT POINT! Exception pending...
    }


    // call saAmfComponentUnregister
    _saStatus = saAmfComponentUnregister( _saAmfHandle,
                                          _saProxiedComponentNamePtr,
                                          &_saProxyComponentName );

    _TRACE2( "NATIVE: saAmfComponentUnregister(...) has returned with %d...\n", _saStatus );

    // error handling
    if( _saStatus != SA_AIS_OK ){
        switch( _saStatus ){
            case SA_AIS_ERR_LIBRARY:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisLibraryException",
                                    AIS_ERR_LIBRARY_MSG );
                break;
            case SA_AIS_ERR_TIMEOUT:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisTimeoutException",
                                    AIS_ERR_TIMEOUT_MSG );
                break;
            case SA_AIS_ERR_TRY_AGAIN:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisTryAgainException",
                                    AIS_ERR_TRY_AGAIN_MSG );
                break;
            case SA_AIS_ERR_BAD_HANDLE:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisBadHandleException",
                                    AIS_ERR_BAD_HANDLE_MSG );
                break;
            case SA_AIS_ERR_INVALID_PARAM:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisInvalidParamException",
                                    AIS_ERR_INVALID_PARAM_MSG );
                break;
            case SA_AIS_ERR_NO_MEMORY:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisNoMemoryException",
                                    AIS_ERR_NO_MEMORY_MSG );
                break;
            case SA_AIS_ERR_NO_RESOURCES:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisNoResourcesException",
                                    AIS_ERR_NO_RESOURCES_MSG );
                break;
            case SA_AIS_ERR_NOT_EXIST:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisNotExistException",
                                    AIS_ERR_NOT_EXIST_MSG );
                break;
            case SA_AIS_ERR_BAD_OPERATION:
                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisBadOperationException",
                                    AIS_ERR_BAD_OPERATION_MSG );
                break;
            default:
                // this should not happen here!

                assert( JNI_FALSE );

                JNU_throwNewByName( jniEnv,
                                    "org/saforum/ais/AisLibraryException",
                                    AIS_ERR_LIBRARY_MSG );
                break;
        }
        return; // EXIT POINT! Exception pending...
    }


    _TRACE2( "NATIVE: Java_org_opensaf_ais_amf_ComponentRegistryImpl_unregisterProxiedComponent(...) returning normally\n" );


}