
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_CORBA_CdrEncapsCodecImpl__
#define __gnu_CORBA_CdrEncapsCodecImpl__

#pragma interface

#include <org/omg/CORBA/LocalObject.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace CDR
      {
          class BufferedCdrOutput;
          class BufferredCdrInput;
      }
        class CdrEncapsCodecImpl;
        class Version;
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Any;
          class ORB;
          class TypeCode;
      }
    }
  }
}

class gnu::CORBA::CdrEncapsCodecImpl : public ::org::omg::CORBA::LocalObject
{

public:
  CdrEncapsCodecImpl(::org::omg::CORBA::ORB *, ::gnu::CORBA::Version *);
  virtual JArray< ::java::lang::String * > * _ids();
  virtual ::org::omg::CORBA::Any * decode(JArray< jbyte > *);
private:
  ::gnu::CORBA::CDR::BufferredCdrInput * createEncapsulation(JArray< jbyte > *, ::gnu::CORBA::CDR::BufferredCdrInput *);
public:
  virtual JArray< jbyte > * encode(::org::omg::CORBA::Any *);
  virtual ::org::omg::CORBA::Any * decode_value(JArray< jbyte > *, ::org::omg::CORBA::TypeCode *);
private:
  ::org::omg::CORBA::Any * readAny(::org::omg::CORBA::TypeCode *, ::gnu::CORBA::CDR::BufferredCdrInput *);
public:
  virtual JArray< jbyte > * encode_value(::org::omg::CORBA::Any *);
private:
  ::gnu::CORBA::CDR::BufferedCdrOutput * createOutput(::org::omg::CORBA::Any *);
  void checkTypePossibility(::java::lang::String *, ::org::omg::CORBA::TypeCode *);
  ::gnu::CORBA::CDR::BufferredCdrInput * createInput(JArray< jbyte > *);
public:
  virtual jboolean hasLengthIndicator();
  virtual void setUseLengthIndicator(jboolean);
private:
  static const jlong serialVersionUID = 1LL;
  jboolean __attribute__((aligned(__alignof__( ::org::omg::CORBA::LocalObject)))) noWide;
  ::gnu::CORBA::Version * version;
public: // actually protected
  ::org::omg::CORBA::ORB * orb;
private:
  jboolean lengthIndicator;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_CdrEncapsCodecImpl__
