#ifndef _COSTRANSACTIONS_IDL
#define _COSTRANSACTIONS_IDL

#pragma prefix "omg.org"

module CosTransactions { 

// DATATYPES 
  enum Status { 
    StatusActive,
    StatusMarkedRollback,
    StatusPrepared,
    StatusCommitted,
    StatusRolledBack,
    StatusUnknown,
    StatusNoTransaction,
    StatusPreparing,
    StatusCommitting,
    StatusRollingBack
  }; 
  
  enum Vote { 
    VoteCommit,
    VoteRollback, 
    VoteReadOnly 
  };

  // Forward references for interfaces defined later in module 
  interface Control; 
  interface Terminator; 
  interface Coordinator; 
  interface Resource; 
  interface RecoveryCoordinator; 
  interface SubtransactionAwareResource; 
  interface TransactionFactory;
  interface TransactionalObject; 
  //  interface Synchronization;

  // Structure definitions
  struct otid_t {
    long formatID; /*format identifier. 0 is OSI TP */
    long bqual_length;
    sequence <octet> tid;
  };
  struct TransIdentity {
    Coordinator coord;
    Terminator term;
    otid_t otid;
  };
  struct PropagationContext {
    unsigned long timeout;
    TransIdentity current;
    sequence <TransIdentity> parents;
    any implementation_specific_data;
  };
  //  interface Current;
  
  // Standard exceptions
  // Defined in orber/include/corba.hrl
  //  exception TransactionRequired {};
  //  exception TransactionRolledBack {};
  //  exception InvalidTransaction {};
  
  // Heuristic exceptions
  exception HeuristicRollback {}; 
  exception HeuristicCommit {}; 
  exception HeuristicMixed {}; 
  exception HeuristicHazard {}; 

  // Exception from Orb operations
  exception WrongTransaction {};

  // Other transaction-specific exceptions 
  exception SubtransactionsUnavailable {}; 
  exception NotSubtransaction {}; 
  exception Inactive {}; 
  exception NotPrepared {}; 
  exception NoTransaction {}; 
  exception InvalidControl {}; 
  exception Unavailable {}; 
  exception SynchronizationUnavailable {};

  interface TransactionFactory { 
    Control create(in unsigned long time_out); 
    Control recreate(in PropagationContext ctx); 
  }; 
  
  interface Control { 
    Terminator get_terminator() 
      raises(Unavailable); 
    Coordinator get_coordinator() 
      raises(Unavailable); 
  }; 
  
  interface Terminator {
    void commit(in boolean report_heuristics) 
      raises( HeuristicMixed, 
	      HeuristicHazard ); 
    void rollback(); 
  }; 
  
  interface Coordinator {

    Status get_status();
    Status get_parent_status();
    Status get_top_level_status();

    boolean is_same_transaction(in Coordinator tc);
    boolean is_related_transaction(in Coordinator tc);
    boolean is_ancestor_transaction(in Coordinator tc);
    boolean is_descendant_transaction(in Coordinator tc);
    boolean is_top_level_transaction();
    
    unsigned long hash_transaction();
    unsigned long hash_top_level_tran();
    
    RecoveryCoordinator register_resource(in Resource r)
      raises(Inactive);
    
//     void register_synchronization (in Synchronization sync)
//       raises(Inactive, SynchronizationUnavailable);
    
    void register_subtran_aware(in SubtransactionAwareResource r)
      raises(Inactive, NotSubtransaction);
    
    void rollback_only()
      raises(Inactive);
    
    string get_transaction_name();
    Control create_subtransaction()
      raises(SubtransactionsUnavailable, Inactive);

    PropagationContext get_txcontext ()
      raises(Unavailable);
  };


  interface RecoveryCoordinator { 
    Status replay_completion(in Resource r) 
      raises(NotPrepared); 
  }; 
  
  interface Resource { 
    Vote prepare()
      raises(HeuristicMixed,
	     HeuristicHazard);
    void rollback() 
      raises( HeuristicCommit, 
	      HeuristicMixed, 
	      HeuristicHazard ); 
    void commit() 
      raises( NotPrepared, 
	      HeuristicRollback, 
	      HeuristicMixed, 
	      HeuristicHazard ); 
    void commit_one_phase() 
      raises( HeuristicHazard,
	      HeuristicRollback, 
	      HeuristicMixed); 
    void forget(); 
  }; 
  
//   interface TransactionalObject { 
//   }; 
  
//   interface Synchronization : TransactionalObject {
//     void before_completion();
//     void after_completion(in CosTransactions::Status status);
//   };

  interface SubtransactionAwareResource : Resource {
    void commit_subtransaction(in Coordinator parent); 
    void rollback_subtransaction(); 
  }; 
 
}; // End of CosTransactions Module

module ETraP { 

  // interface Server
    interface Server :
	CosTransactions::Coordinator, CosTransactions::Resource,
	CosTransactions::RecoveryCoordinator, CosTransactions::Control {
    };
//     interface Server :
// 	CosTransactions::Coordinator, CosTransactions::Resource,
// 	CosTransactions::RecoveryCoordinator, CosTransactions::Control,
// 	CosTransactions::Synchronization {
//     };
    
}; // End of ETraP Module

#endif
