//   NOTE: this is a machine generated file--editing not recommended
//
// sm_x501if.h - class definitions for ASN.1 module InformationFramework
//
//   This file was generated by snacc on Mon Apr 22 22:34:19 2002
//   UBC snacc by Mike Sample
//   A couple of enhancements made by IBM European Networking Center

#ifndef _sm_x501if_h_
#define _sm_x501if_h_


//------------------------------------------------------------------------------
// class declarations:

class AttributeTypeAndDistinguishedValueSetOfSeqSetOf;
class AttributeTypeAndDistinguishedValueSetOfSeq;
class AttributeTypeAndDistinguishedValueSetOf;
class AttributeSetOf;
class Attribute;
class AttributeTypeAndDistinguishedValue;
class RelativeDistinguishedName;
class RDNSequence;
class Attributes;
class Name;

//------------------------------------------------------------------------------
// class definitions:

typedef enum InformationFrameworkAnyId
{

} InformationFrameworkAnyId;


/* OBJECT IDENTIFIER */
typedef AsnOid AttributeType;

/* ANY */
typedef AsnAny AttributeValue;

class AttributeTypeAndDistinguishedValueSetOfSeqSetOf: public AsnType
{
protected:
  unsigned long int	count;
  struct AsnListElmt
  {
    AsnListElmt	*next;
    AsnListElmt	*prev;
    AsnAny	*elmt;
  }			*first, *curr, *last;

public:
			AttributeTypeAndDistinguishedValueSetOfSeqSetOf() { count = 0; first = curr = last = NULL; }
			AttributeTypeAndDistinguishedValueSetOfSeqSetOf (const AttributeTypeAndDistinguishedValueSetOfSeqSetOf &);
  virtual		~AttributeTypeAndDistinguishedValueSetOfSeqSetOf();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  AttributeTypeAndDistinguishedValueSetOfSeqSetOf		&operator = (const AttributeTypeAndDistinguishedValueSetOfSeqSetOf &);
  void		SetCurrElmt (unsigned long int index);
  unsigned long int	GetCurrElmtIndex();
  void		SetCurrToFirst() { curr = first; }
  void		SetCurrToLast()  { curr = last; }
  // reading member fcns
  int			Count() const	{ return count; }
  // NOTE: if your compiler complains about these NULLs, its definition of NULL is broken (and you better change it there!)
  AsnAny	*First() const	{ return count > 0 ? first->elmt : NULL; }
  AsnAny	*Last() const	{ return count > 0 ? last->elmt : NULL; }
  AsnAny	*Curr() const	{ return curr ? curr->elmt : NULL; }
  AsnAny	*Next() const	{ return curr && curr->next ? curr->next->elmt : NULL; }
  AsnAny	*Prev() const	{ return curr && curr->prev ? curr->prev->elmt : NULL; }

  // routines that move the curr elmt
  AsnAny	*GoNext() { if (curr) curr = curr->next; return Curr(); }
  AsnAny	*GoPrev() { if (curr) curr = curr->prev; return Curr(); }

  // write & alloc fcns - returns new elmt
  AsnAny	*Append();  // add elmt to end of list
  AsnAny	*Prepend(); // add elmt to beginning of list
  AsnAny	*InsertBefore(); //insert elmt before current elmt
  AsnAny	*InsertAfter(); //insert elmt after current elmt

  // write & alloc & copy - returns list after copying elmt
  AttributeTypeAndDistinguishedValueSetOfSeqSetOf	&AppendCopy (AsnAny &elmt);  // add elmt to end of list
  AttributeTypeAndDistinguishedValueSetOfSeqSetOf	&PrependCopy (AsnAny &elmt); // add elmt to beginning of list
  AttributeTypeAndDistinguishedValueSetOfSeqSetOf	&InsertBeforeAndCopy (AsnAny &elmt); //insert elmt before current elmt
  AttributeTypeAndDistinguishedValueSetOfSeqSetOf	&InsertAfterAndCopy (AsnAny &elmt); //insert elmt after current elmt

  // removing the current elmt from the list
  void		RemoveCurrFromList();

  // encode and decode routines    
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  PDU_MEMBER_MACROS
  void		Print (ostream &os) const;
};


class AttributeTypeAndDistinguishedValueSetOfSeq: public AsnType
{
public:
  AsnOid		*distingAttrValue;
  AttributeTypeAndDistinguishedValueSetOfSeqSetOf		contextList;

			AttributeTypeAndDistinguishedValueSetOfSeq();
			AttributeTypeAndDistinguishedValueSetOfSeq (const AttributeTypeAndDistinguishedValueSetOfSeq &);
  virtual		~AttributeTypeAndDistinguishedValueSetOfSeq();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  AttributeTypeAndDistinguishedValueSetOfSeq		&operator = (const AttributeTypeAndDistinguishedValueSetOfSeq &);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  void		Print (ostream &os) const;
};


class AttributeTypeAndDistinguishedValueSetOf: public AsnType
{
protected:
  unsigned long int	count;
  struct AsnListElmt
  {
    AsnListElmt	*next;
    AsnListElmt	*prev;
    AttributeTypeAndDistinguishedValueSetOfSeq	*elmt;
  }			*first, *curr, *last;

public:
			AttributeTypeAndDistinguishedValueSetOf() { count = 0; first = curr = last = NULL; }
			AttributeTypeAndDistinguishedValueSetOf (const AttributeTypeAndDistinguishedValueSetOf &);
  virtual		~AttributeTypeAndDistinguishedValueSetOf();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  AttributeTypeAndDistinguishedValueSetOf		&operator = (const AttributeTypeAndDistinguishedValueSetOf &);
  void		SetCurrElmt (unsigned long int index);
  unsigned long int	GetCurrElmtIndex();
  void		SetCurrToFirst() { curr = first; }
  void		SetCurrToLast()  { curr = last; }
  // reading member fcns
  int			Count() const	{ return count; }
  // NOTE: if your compiler complains about these NULLs, its definition of NULL is broken (and you better change it there!)
  AttributeTypeAndDistinguishedValueSetOfSeq	*First() const	{ return count > 0 ? first->elmt : NULL; }
  AttributeTypeAndDistinguishedValueSetOfSeq	*Last() const	{ return count > 0 ? last->elmt : NULL; }
  AttributeTypeAndDistinguishedValueSetOfSeq	*Curr() const	{ return curr ? curr->elmt : NULL; }
  AttributeTypeAndDistinguishedValueSetOfSeq	*Next() const	{ return curr && curr->next ? curr->next->elmt : NULL; }
  AttributeTypeAndDistinguishedValueSetOfSeq	*Prev() const	{ return curr && curr->prev ? curr->prev->elmt : NULL; }

  // routines that move the curr elmt
  AttributeTypeAndDistinguishedValueSetOfSeq	*GoNext() { if (curr) curr = curr->next; return Curr(); }
  AttributeTypeAndDistinguishedValueSetOfSeq	*GoPrev() { if (curr) curr = curr->prev; return Curr(); }

  // write & alloc fcns - returns new elmt
  AttributeTypeAndDistinguishedValueSetOfSeq	*Append();  // add elmt to end of list
  AttributeTypeAndDistinguishedValueSetOfSeq	*Prepend(); // add elmt to beginning of list
  AttributeTypeAndDistinguishedValueSetOfSeq	*InsertBefore(); //insert elmt before current elmt
  AttributeTypeAndDistinguishedValueSetOfSeq	*InsertAfter(); //insert elmt after current elmt

  // write & alloc & copy - returns list after copying elmt
  AttributeTypeAndDistinguishedValueSetOf	&AppendCopy (AttributeTypeAndDistinguishedValueSetOfSeq &elmt);  // add elmt to end of list
  AttributeTypeAndDistinguishedValueSetOf	&PrependCopy (AttributeTypeAndDistinguishedValueSetOfSeq &elmt); // add elmt to beginning of list
  AttributeTypeAndDistinguishedValueSetOf	&InsertBeforeAndCopy (AttributeTypeAndDistinguishedValueSetOfSeq &elmt); //insert elmt before current elmt
  AttributeTypeAndDistinguishedValueSetOf	&InsertAfterAndCopy (AttributeTypeAndDistinguishedValueSetOfSeq &elmt); //insert elmt after current elmt

  // removing the current elmt from the list
  void		RemoveCurrFromList();

  // encode and decode routines    
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  PDU_MEMBER_MACROS
  void		Print (ostream &os) const;
};


class AttributeSetOf: public AsnType
{
protected:
  unsigned long int	count;
  struct AsnListElmt
  {
    AsnListElmt	*next;
    AsnListElmt	*prev;
    AttributeValue	*elmt;
  }			*first, *curr, *last;

public:
			AttributeSetOf() { count = 0; first = curr = last = NULL; }
			AttributeSetOf (const AttributeSetOf &);
  virtual		~AttributeSetOf();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  AttributeSetOf		&operator = (const AttributeSetOf &);
  void		SetCurrElmt (unsigned long int index);
  unsigned long int	GetCurrElmtIndex();
  void		SetCurrToFirst() { curr = first; }
  void		SetCurrToLast()  { curr = last; }
  // reading member fcns
  int			Count() const	{ return count; }
  // NOTE: if your compiler complains about these NULLs, its definition of NULL is broken (and you better change it there!)
  AttributeValue	*First() const	{ return count > 0 ? first->elmt : NULL; }
  AttributeValue	*Last() const	{ return count > 0 ? last->elmt : NULL; }
  AttributeValue	*Curr() const	{ return curr ? curr->elmt : NULL; }
  AttributeValue	*Next() const	{ return curr && curr->next ? curr->next->elmt : NULL; }
  AttributeValue	*Prev() const	{ return curr && curr->prev ? curr->prev->elmt : NULL; }

  // routines that move the curr elmt
  AttributeValue	*GoNext() { if (curr) curr = curr->next; return Curr(); }
  AttributeValue	*GoPrev() { if (curr) curr = curr->prev; return Curr(); }

  // write & alloc fcns - returns new elmt
  AttributeValue	*Append();  // add elmt to end of list
  AttributeValue	*Prepend(); // add elmt to beginning of list
  AttributeValue	*InsertBefore(); //insert elmt before current elmt
  AttributeValue	*InsertAfter(); //insert elmt after current elmt

  // write & alloc & copy - returns list after copying elmt
  AttributeSetOf	&AppendCopy (AttributeValue &elmt);  // add elmt to end of list
  AttributeSetOf	&PrependCopy (AttributeValue &elmt); // add elmt to beginning of list
  AttributeSetOf	&InsertBeforeAndCopy (AttributeValue &elmt); //insert elmt before current elmt
  AttributeSetOf	&InsertAfterAndCopy (AttributeValue &elmt); //insert elmt after current elmt

  // removing the current elmt from the list
  void		RemoveCurrFromList();

  // encode and decode routines    
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  PDU_MEMBER_MACROS
  void		Print (ostream &os) const;
};


class Attribute: public AsnType
{
public:
  AttributeType		type;
  AttributeSetOf		values;

			Attribute();
			Attribute (const Attribute &);
  virtual		~Attribute();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  Attribute		&operator = (const Attribute &);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  void		Print (ostream &os) const;
};


class AttributeTypeAndDistinguishedValue: public AsnType
{
public:
  AsnOid		type;
  AsnAny		value;
  AsnBool		*primaryDistinguished;
  AttributeTypeAndDistinguishedValueSetOf		*valuesWithContext;

			AttributeTypeAndDistinguishedValue();
			AttributeTypeAndDistinguishedValue (const AttributeTypeAndDistinguishedValue &);
  virtual		~AttributeTypeAndDistinguishedValue();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  AttributeTypeAndDistinguishedValue		&operator = (const AttributeTypeAndDistinguishedValue &);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  void		Print (ostream &os) const;
};


class RelativeDistinguishedName: public AsnType
{
protected:
  unsigned long int	count;
  struct AsnListElmt
  {
    AsnListElmt	*next;
    AsnListElmt	*prev;
    AttributeTypeAndDistinguishedValue	*elmt;
  }			*first, *curr, *last;

public:
			RelativeDistinguishedName() { count = 0; first = curr = last = NULL; }
			RelativeDistinguishedName (const RelativeDistinguishedName &);
  virtual		~RelativeDistinguishedName();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  RelativeDistinguishedName		&operator = (const RelativeDistinguishedName &);
  void		SetCurrElmt (unsigned long int index);
  unsigned long int	GetCurrElmtIndex();
  void		SetCurrToFirst() { curr = first; }
  void		SetCurrToLast()  { curr = last; }
  // reading member fcns
  int			Count() const	{ return count; }
  // NOTE: if your compiler complains about these NULLs, its definition of NULL is broken (and you better change it there!)
  AttributeTypeAndDistinguishedValue	*First() const	{ return count > 0 ? first->elmt : NULL; }
  AttributeTypeAndDistinguishedValue	*Last() const	{ return count > 0 ? last->elmt : NULL; }
  AttributeTypeAndDistinguishedValue	*Curr() const	{ return curr ? curr->elmt : NULL; }
  AttributeTypeAndDistinguishedValue	*Next() const	{ return curr && curr->next ? curr->next->elmt : NULL; }
  AttributeTypeAndDistinguishedValue	*Prev() const	{ return curr && curr->prev ? curr->prev->elmt : NULL; }

  // routines that move the curr elmt
  AttributeTypeAndDistinguishedValue	*GoNext() { if (curr) curr = curr->next; return Curr(); }
  AttributeTypeAndDistinguishedValue	*GoPrev() { if (curr) curr = curr->prev; return Curr(); }

  // write & alloc fcns - returns new elmt
  AttributeTypeAndDistinguishedValue	*Append();  // add elmt to end of list
  AttributeTypeAndDistinguishedValue	*Prepend(); // add elmt to beginning of list
  AttributeTypeAndDistinguishedValue	*InsertBefore(); //insert elmt before current elmt
  AttributeTypeAndDistinguishedValue	*InsertAfter(); //insert elmt after current elmt

  // write & alloc & copy - returns list after copying elmt
  RelativeDistinguishedName	&AppendCopy (AttributeTypeAndDistinguishedValue &elmt);  // add elmt to end of list
  RelativeDistinguishedName	&PrependCopy (AttributeTypeAndDistinguishedValue &elmt); // add elmt to beginning of list
  RelativeDistinguishedName	&InsertBeforeAndCopy (AttributeTypeAndDistinguishedValue &elmt); //insert elmt before current elmt
  RelativeDistinguishedName	&InsertAfterAndCopy (AttributeTypeAndDistinguishedValue &elmt); //insert elmt after current elmt

  // removing the current elmt from the list
  void		RemoveCurrFromList();

  // encode and decode routines    
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  PDU_MEMBER_MACROS
  void		Print (ostream &os) const;
};


class RDNSequence: public AsnType
{
protected:
  unsigned long int	count;
  struct AsnListElmt
  {
    AsnListElmt	*next;
    AsnListElmt	*prev;
    RelativeDistinguishedName	*elmt;
  }			*first, *curr, *last;

public:
			RDNSequence() { count = 0; first = curr = last = NULL; }
			RDNSequence (const RDNSequence &);
  virtual		~RDNSequence();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  RDNSequence		&operator = (const RDNSequence &);
  void		SetCurrElmt (unsigned long int index);
  unsigned long int	GetCurrElmtIndex();
  void		SetCurrToFirst() { curr = first; }
  void		SetCurrToLast()  { curr = last; }
  // reading member fcns
  int			Count() const	{ return count; }
  // NOTE: if your compiler complains about these NULLs, its definition of NULL is broken (and you better change it there!)
  RelativeDistinguishedName	*First() const	{ return count > 0 ? first->elmt : NULL; }
  RelativeDistinguishedName	*Last() const	{ return count > 0 ? last->elmt : NULL; }
  RelativeDistinguishedName	*Curr() const	{ return curr ? curr->elmt : NULL; }
  RelativeDistinguishedName	*Next() const	{ return curr && curr->next ? curr->next->elmt : NULL; }
  RelativeDistinguishedName	*Prev() const	{ return curr && curr->prev ? curr->prev->elmt : NULL; }

  // routines that move the curr elmt
  RelativeDistinguishedName	*GoNext() { if (curr) curr = curr->next; return Curr(); }
  RelativeDistinguishedName	*GoPrev() { if (curr) curr = curr->prev; return Curr(); }

  // write & alloc fcns - returns new elmt
  RelativeDistinguishedName	*Append();  // add elmt to end of list
  RelativeDistinguishedName	*Prepend(); // add elmt to beginning of list
  RelativeDistinguishedName	*InsertBefore(); //insert elmt before current elmt
  RelativeDistinguishedName	*InsertAfter(); //insert elmt after current elmt

  // write & alloc & copy - returns list after copying elmt
  RDNSequence	&AppendCopy (RelativeDistinguishedName &elmt);  // add elmt to end of list
  RDNSequence	&PrependCopy (RelativeDistinguishedName &elmt); // add elmt to beginning of list
  RDNSequence	&InsertBeforeAndCopy (RelativeDistinguishedName &elmt); //insert elmt before current elmt
  RDNSequence	&InsertAfterAndCopy (RelativeDistinguishedName &elmt); //insert elmt after current elmt

  // removing the current elmt from the list
  void		RemoveCurrFromList();

  // encode and decode routines    
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  PDU_MEMBER_MACROS
  void		Print (ostream &os) const;
};


class Attributes: public AsnType
{
protected:
  unsigned long int	count;
  struct AsnListElmt
  {
    AsnListElmt	*next;
    AsnListElmt	*prev;
    Attribute	*elmt;
  }			*first, *curr, *last;

public:
			Attributes() { count = 0; first = curr = last = NULL; }
			Attributes (const Attributes &);
  virtual		~Attributes();
  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  Attributes		&operator = (const Attributes &);
  void		SetCurrElmt (unsigned long int index);
  unsigned long int	GetCurrElmtIndex();
  void		SetCurrToFirst() { curr = first; }
  void		SetCurrToLast()  { curr = last; }
  // reading member fcns
  int			Count() const	{ return count; }
  // NOTE: if your compiler complains about these NULLs, its definition of NULL is broken (and you better change it there!)
  Attribute	*First() const	{ return count > 0 ? first->elmt : NULL; }
  Attribute	*Last() const	{ return count > 0 ? last->elmt : NULL; }
  Attribute	*Curr() const	{ return curr ? curr->elmt : NULL; }
  Attribute	*Next() const	{ return curr && curr->next ? curr->next->elmt : NULL; }
  Attribute	*Prev() const	{ return curr && curr->prev ? curr->prev->elmt : NULL; }

  // routines that move the curr elmt
  Attribute	*GoNext() { if (curr) curr = curr->next; return Curr(); }
  Attribute	*GoPrev() { if (curr) curr = curr->prev; return Curr(); }

  // write & alloc fcns - returns new elmt
  Attribute	*Append();  // add elmt to end of list
  Attribute	*Prepend(); // add elmt to beginning of list
  Attribute	*InsertBefore(); //insert elmt before current elmt
  Attribute	*InsertAfter(); //insert elmt after current elmt

  // write & alloc & copy - returns list after copying elmt
  Attributes	&AppendCopy (Attribute &elmt);  // add elmt to end of list
  Attributes	&PrependCopy (Attribute &elmt); // add elmt to beginning of list
  Attributes	&InsertBeforeAndCopy (Attribute &elmt); //insert elmt before current elmt
  Attributes	&InsertAfterAndCopy (Attribute &elmt); //insert elmt after current elmt

  // removing the current elmt from the list
  void		RemoveCurrFromList();

  // encode and decode routines    
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);

  PDU_MEMBER_MACROS
  void		Print (ostream &os) const;
};


class Name: public AsnType
{
public:
  enum ChoiceIdEnum
  {
     rDNSequenceCid = 0
  };

  enum ChoiceIdEnum	choiceId;
  union
  {
     RDNSequence		*rDNSequence;
  };


			Name();
			Name (const Name &);
  virtual		~Name();

  virtual AsnType	*Clone() const;

  virtual AsnType	*Copy() const;

  Name		&operator = (const Name &);
  AsnLen		BEncContent (BUF_TYPE b);
  void			BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen, AsnLen &bytesDecoded, ENV_TYPE env);
  AsnLen		BEnc (BUF_TYPE b);
  void			BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env);
  void			Print (ostream &os) const;
};


/* RDNSequence */
typedef RDNSequence DistinguishedName;

//------------------------------------------------------------------------------
// externs for value defs

//------------------------------------------------------------------------------

#endif /* conditional include of sm_x501if.h */
