G'Day,

See below for the class declarations and the encode and decode methods that
I am using. I am not compressing anything so this should be a plain write
component to a stream and read it back again. However when I read the
component again from the stream I can only see properties that are from
TNamMessageForComms so for instance I can see Boo2, Payload, Header. But all
the properties for these subcomponents are not there. So for instance
Payload.Boo is always an empty string. What am I missing here that is not
making the sub components of TNamMessageForComms stream correctly. 

Any pointers etc. greatly appreciated.

TIA


function TNamMessageForCommsEncDec.Encode(const ACompression :
TCompressionRange;
  const ASourceStream : TMemoryStream; var AOutputStream : TMemoryStream) :
TEncodeDecodeError;
////////////////////////////////////////////////////////////////////////////
////
// PURPOSE: Encodes the supplied data into a stream for transmission. This
// method is called by all the other overloaded methods of the same name. It
// makes use of the TNamMessageForComms
// HISTORY:
//   DJE 10/07/2003 #   Initial Creation
begin
  //Default behaviour
  result := MSG_DECODE_ERR_UNKNOWN;
  AOutputStream.Clear;

  //Header
  FMessage.Header.MessageType := MSG_REGULAR;

  //Payload
  //Clear
  FMessage.Payload.Data_Clear;
  //Compression
  FMessage.Payload.Compressed := ACompression;
  //Assign
  FMessage.Payload.Data_Set(ASourceStream);

  //Now place on the output stream
  AOutputStream.WriteComponent(FMessage);

  //Show success
  result := MSG_DECODE_ERR_NONE;
end;

function TNamMessageForCommsEncDec.Decode(ASourceStream : TMemoryStream;
  var AOutputStream : TMemoryStream) : TEncodeDecodeError;
////////////////////////////////////////////////////////////////////////////
////
// PURPOSE: Decodes a byte stream that was placed into the source stream
// originally by Encode.
// HISTORY:
//   DJE 10/07/2003 #   Initial Creation
begin
  //Default behaviour
  result := MSG_DECODE_ERR_UNKNOWN;
  AOutputStream.Clear;

  //First get the component in its entirey
  ASourceStream.Position := 0;
  FMessage := TNamMessageForComms(ASourceStream.ReadComponent(nil));

  //Decompress it if required
  //The class is optomised to deal with this assignment so there is no
performance
  //penalty
  FMessage.Payload.Compressed := COMPRESSION_NONE;

  //Now return the payload ontothe stream supplied
  AOutputStream.Write(FMessage.Payload.Data, SizeOf(FMessage.Payload.Data));

  //Show success
  result := MSG_DECODE_ERR_NONE;
end;


initialization
  RegisterClass(TNamMessageForComms);
  RegisterClass(TNamMessageForCommsHeader);
  RegisterClass(TNamMessageForCommsPayload);
finalization
  UnRegisterClass(TNamMessageForComms);
  UnRegisterClass(TNamMessageForCommsHeader);
  UnRegisterClass(TNamMessageForCommsPayload);
end.


  ENamMessageForCommsHeader = class(Exception);
  TNamMessageForCommsHeader = class(TComponent)
 
////////////////////////////////////////////////////////////////////////////
//
    // This class contains all the META or header information for a
particular
    // message. See TNamMessageForComms for more detail on why we are using
a
    // TComponent descendant. Keep this as small as possible as it will be
prepended
    // to each message sent.
  private
    FMessageType : TMessageType;        //Indicates the type of message
    property MessageType : TMessageType read FMessageType write
FMessageType;
  published
  end;

  //Byte stream containing the data
  TPlayloadData = array of byte;

  ENamMessageForCommsPayload = class(Exception);
  TNamMessageForCommsPayload = class(TComponent)
 
////////////////////////////////////////////////////////////////////////////
//
    // This class contains all the data payload for a message. See
TNamMessageForComms
    // for more detail on why we are using a TComponent descendant
  private
    FBoo : string;
    FCompressed : TCompressionRange;
    FData : TPlayloadData;
    FZipper : TVCLZip;
    FZipTmpFileName : TFileName;
    procedure Set_Compressed(const Value : TCompressionRange);
    function Stream_Compress(ACompressionLevel : TCompressionRange; const
AOriginalStream : TMemoryStream;
      var ACompressedStream : TMemoryStream) : boolean;
    function Stream_DeCompress(const AOriginalStream : TMemoryStream;
      var ADeCompressedStream : TMemoryStream) : boolean;
    function Stream_ToDataInternal(AStream : TMemoryStream) : boolean;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    procedure Data_Clear;
    procedure Data_Set(const AStream : TMemoryStream);
    property Compressed : TCompressionRange read FCompressed write
Set_Compressed;
  published
    property Data : TPlayloadData read FData;
    property Boo : string read FBoo;
  end;

  ENamMessageForComms = class(Exception);
  TNamMessageForComms = class(TComponent)
 
////////////////////////////////////////////////////////////////////////////
//
    // This is the structure that is used to manage a message that is
transmitted
    // and received by the NamMessage framework. We are using a TComponent
    // descendant deliberately here as we can use Delphi's built in
streaming
    // mechanism to place this class onto and off a stream. Consequently all
things
    // we want to be able to stream must be declared as publihed
  private
    FHeader : TNamMessageForCommsHeader;
    FPayload : TNamMessageForCommsPayload;
    FBoo2: string;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property Boo2 : string read FBoo2 write FBoo2;
    property Header : TNamMessageForCommsHeader read FHeader;
    property Payload : TNamMessageForCommsPayload read FPayload;
  end;

-- Donovan J. Edye
----------------------------------------------------------------------
Namadgi Systems
Voice: +61-2-6285-3460
Fax: +61-2-6285-3459
----------------------------------------------------------------------
SetiStats - Get your SETI statistics delivered to your mailbox daily.
http://www.edye.wattle.id.au/p.php?page=/delphi/setistats
<http://www.edye.wattle.id.au/p.php?page=/delphi/setistats> 
----------------------------------------------------------------------

<<attachment: winmail.dat>>

Reply via email to