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>>
