#include "ace_impl.h"

int ErrStringLength = 255;


CORBA_Boolean
Ace_Impl::aceInit( const char* path ) {
  Bool result = ::aceInit( (char*)path );
  if ( result ) {
    return ( CORBA_Boolean ) true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

CORBA_Boolean
Ace_Impl::aceGetWriteAccess( CORBA_Boolean get ) {
  Bool result = ::aceGetWriteAccess( get );
  if ( result ) {
    return ( CORBA_Boolean )true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

CORBA_Boolean
Ace_Impl::aceForbidWriteAccess( ) {
  Bool result = ::aceForbidWriteAccess( );
  if ( result ) {
    return ( CORBA_Boolean )true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}


CORBA_Boolean
Ace_Impl::aceOpen ( const char* path ) {

  theAceContext = ::aceOpenContext( path );
  if ( theAceContext != NULL ) {
    Bool result = ::aceSetContext( theAceContext );
    if ( result ) {
      return true;
    } else {
      char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
      throw AceView_aceException( errmess );
    }
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

CORBA_Boolean
Ace_Impl::aceClose ( CORBA_Boolean autoCommit ) {
  Bool result = ::aceCloseContext( (Bool)autoCommit );
  if ( result ) {
    return ( CORBA_Boolean )true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

/**
CORBA_Boolean
Ace_Impl::aceWriteLock( void ) {
  Bool result =  ::aceWriteLock();
  if ( result ) {
    return ( CORBA_Boolean )true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

*/

CORBA_Boolean
Ace_Impl::aceCommit( CORBA_Boolean releaseLock ) {
  Bool result =  ::aceCommit( (Bool)releaseLock );
  if ( result ) {
    return ( CORBA_Boolean )true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

AceView_AceHandle
Ace_Impl::aceHandleCreate( AceView_AceHandle h ) {
  AceView_AceHandle newHandle = (CORBA_Long) ::aceHandleCreate( (void*) h );
  if ( newHandle != 0 ) {
    return newHandle;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

CORBA_Boolean
Ace_Impl::aceFree(void* p) {
  Bool result = ::aceFree( p );
  if ( result ) {
    return (CORBA_Boolean)true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

AceView_AceStringList*
Ace_Impl::aceClasses( AceView_AceHandle h ) {

  AceStringSet classes = ::aceClasses( (void*)h );

  if (classes) {

    AceView_AceStringList* 
      corbaClasses = new AceView_AceStringList(arrayMax(classes));

    for(int i=0;i<arrayMax(classes);i++) {

      char* cp = CORBA_string_dup( arr(classes,i,char* ));

      (*corbaClasses).append(cp);

    }
    return corbaClasses;
  }
  else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

CORBA_Long
Ace_Impl::aceClassSize(const char* classname) {
  int sz;
  Bool result = ::aceClassSize( (char*)classname, &sz );
  if ( result ) {
    return (CORBA_Long)sz;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}

AceView_AceInstance*
Ace_Impl::aceModel(const char* classname, AceView_AceHandle h ) {
  AceInstance model = ::aceModel((char*)classname, (void*)h );
  if ( model != NULL ) {
    return (AceView_AceInstance*) model;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
}


/*
CORBA_Boolean
Ace_Impl::aceReadModels(void) {
  Bool result = ::aceReadModels();
  if ( result ) {
    return (CORBA_Boolean)true;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  } 
}
*/


char*
Ace_Impl::aceName(AceView_AceKeyxxx anyKey, AceView_AceHandle h ) {
  char* myName = CORBA_string_dup( ::aceName( anyKey, (void*) h ));
  //  char* myname = CORBA_string_dup( ::aceName( (AceView_AceKeyxxx)anyKey, (void*) h)));
  if ( myName != 0 ) {
    return myName;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  } 
}

char*
Ace_Impl::aceClassName(AceView_AceKeyxxx anyKey, AceView_AceHandle h) {
  char* name = CORBA_string_dup( ::aceClassName((AceView_AceKeyxxx)anyKey, (void*)h )); 
  if ( name != 0 ) {
    return name;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  } 
}

char*
Ace_Impl::aceComposeName(const char* classname, 
			  const char* instance, AceView_AceHandle h) {
  char* name = CORBA_string_dup( ::AceComposeName((char*)classname,(char*)instance,(void*)h));
  if ( name != 0 ) {
    return name;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  } 
}

AceView_AceTag
Ace_Impl::aceTag(const char* anyString, CORBA_Boolean create) {
  CORBA_Long tag = ::aceTag((char*)anyString,(Bool)create);
  if ( tag != 0 ) {
    return tag;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  } 
}

AceView_AceKeyxxx
Ace_Impl::aceKey(const char* anyString, CORBA_Boolean create) {
  CORBA_Long mykey = ::aceKey((char*)anyString,(Bool)create);
  if ( mykey != 0 ) {
    return mykey;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  } 
}

AceView_AceKeySet*
Ace_Impl::aceQuery( const char* query, AceView_AceHandle h ) {
  AceView_AceKeySet mySet = new AceView_AceKeySet.duplicate( ::aceQuery( query, (void*) h )); 
							     //  AceView_AceKeySet* result = ( AceView_AceKeySet* ) duplicate( ::aceQuery( query, (void*) h ));
  /*
  if ( result != 0 ) {
    return result;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }
  */
}

/*
AceView_AceKeySet*
Ace_Impl::aceFilterKeys( AceView_AceKeySet* src, const char* predicate, AceView_AceHandle h ) {
  AceView_AceKeySet* result = ( AceView_AceKeySet* ) _duplicate( ::aceFilterKeys( src, predicate, (void*) h ));
  if ( result != 0 ) {
    return result;
  } else {
    char* errmess = CORBA_string_dup( ::aceErrorMessage( 0 ));
    throw AceView_aceException( errmess );
  }

}

*/
/*
AceView_AceKeySet*
Ace_Impl::aceClassExtent(const char* classname) {
  // ***not defined yet
  return NULL;
  //  AceKeyset ks = ::aceClassExtent((char*)classname,0);
  //if (ks) {
  //  AceView_AceKeyset* keys = new AceView_AceKeyset(keySetMax(ks));
  //  for(int i=0;i<keySetMax(ks);i++)
  //    keys[i] = keySet(ks,i);
  //  return keys;
  //}
  //else
  //  return NULL;
}


*/










