/* -*- C++ -*- */
// sfp.idl,v 1.11 2004/07/26 12:20:41 jwillemsen Exp

#ifndef TAO_SFP_IDL
#define TAO_SFP_IDL

module flowProtocol
{
  typedef sequence <unsigned long> my_seq_ulong;
  enum MsgType
  {
    // The MsgTypes Start and struct Start,StartReply and struct
    // StartReply conflicts. 
    // Also there are case-only differences for enumerator Credit and struct credit. 
    // We suffix _Msg to all enumerators until the AVStreams RTF fixes these.
    // Messages in the forward direction 
    //    Start,
    Start_Msg,
    EndofStream_Msg,
    SimpleFrame_Msg,
    SequencedFrame_Msg,
    Frame_Msg,
    SpecialFrame_Msg,
    // Messages in the reverse direction
    //    StartReply,
    StartReply_Msg,
    Credit_Msg,
    // Addition of type for a fragment.
    Fragment_Msg
  }; 
  
  struct frameHeader
  { 
    char magic_number[4];
    //    my_seq_char magic_number;
    // '=', 'S', 'F', 'P' 
    octet flags;   
    // bit 0 = byte order, 
    // 1 = fragments, 2-7 always 0 
    octet message_type; 
    unsigned long message_size; 
    // Size following this header 
  }; 
  
  struct fragment
  { 
    //    my_seq_char magic_number; 
    char magic_number[4];
    // 'F', 'R', 'A', 'G' 
    octet flags; 
    // bit 1 = more fragments, %%bit 0 = byteorder 
    unsigned long frag_number; 
    // 1,..,n 
    unsigned long sequence_num;
    unsigned long frag_sz; 
    unsigned long source_id; 
    // Required for UDP multicast with multiple sources 
  };                    
  
  struct Start
  { 
    char magic_number[4];
    //    my_seq_char magic_number;
    // '=', 'S', 'T', 'A' 
    octet major_version; 
    octet minor_version; 
    octet flags; 
    // bit 0 = byte order 
  }; 
  
  // Acknowledge successful processing of 
  // Start 
  
  struct StartReply
  { 
    //    my_seq_char magic_number;
    char magic_number[4];
    // "=",'S','T','R'
    octet flags; 
    // bit 0 = byte order, 1 = exception 
  }; 
  
  // If the message_type in frameHeader is sequencedFrame 
  // the the frameHeader will be followed by this 
  // (See also RTP note) 
  
  struct sequencedFrame
  { 
    unsigned long sequence_num; 
  }; 
  // If the message_type is Frame then 
  // the frameHeader is followed by this 
  // See also RTP note 
  
  struct frame
  { 
    unsigned long timestamp; 
    unsigned long synchSource;
    my_seq_ulong source_ids;
    unsigned long sequence_num;
  };

  // XXX:The spec hasn't defined frameID.
  typedef unsigned long frameID;
  struct specialFrame
  {
    frameID context_id;
    sequence<octet> context_data;
  };
  
  struct credit
  {
    //    my_seq_char magic_number;
    char magic_number[4];
    // "=",'C','R','E'
    unsigned long cred_num;
  };
  
};

#endif /* TAO_SFP_IDL */
