// File: IOP_N.idl
// These definitions are intended to be added to the IOP module in 
//    version "N" of CORBA. At that time, all references to the IOP_N 
//    module should be changed appropriately and this file should not
//    be separate from <IOP.idl>.

#ifndef _IOP_N_IDL_
#define _IOP_N_IDL_

#ifndef CORBA3
#define local  
#endif

#include <orb.idl>
#include <IOP.idl>

#pragma prefix "omg.org"
module IOP_N {
  typedef sequence<IOP::TaggedComponent> TaggedComponentSeq;

  interface Codec {
    exception InvalidTypeForEncoding {};
    exception FormatMismatch {};
    exception TypeMismatch {};

    CORBA::OctetSeq encode (in any data) raises (InvalidTypeForEncoding);
    any decode (in CORBA::OctetSeq data) raises (FormatMismatch);
    CORBA::OctetSeq encode_value (in any data) raises (InvalidTypeForEncoding);
    any decode_value (in CORBA::OctetSeq data, in CORBA::TypeCode tc)
      raises (FormatMismatch, TypeMismatch);
  };

  typedef short EncodingFormat;
  const EncodingFormat ENCODING_CDR_ENCAPS = 0;

  struct Encoding {
    EncodingFormat format;
    octet major_version;
    octet minor_version;
  };

  interface CodecFactory {
    exception UnknownEncoding {};

    Codec create_codec (in Encoding enc) raises (UnknownEncoding);
  };
};

#endif // _IOP_N_IDL_
