unit uBase.MessageType; interface uses classes, windows; const PackLen = 1024 * 4; type //消息类型 TMsgType = (MT_Command, MT_Text, MT_File, MT_IPQuery, MT_None); TMsgState = (MS_Start, MS_Sending, MS_End, MS_Use, Ms_UnUse); //缓冲区定义 BufferArray = array[0..PackLen-1] of char; //消息基类 TBaseMessage = class(TComponent) private FMsgType: TMsgType; FMsgState: TMsgState; FMsgID: string; FSize: Integer; FBuffer: BufferArray; FSendIP: string; FSendPort: Integer; FRecIP: string; FRecPort: Integer; procedure ReadMsgID(Reader: TReader); procedure WriteMsgID(Writer: TWriter); procedure ReadSize(Reader: TReader); procedure WriteSize(Writer: TWriter); procedure ReadMsgType(Reader: TReader); procedure WriteMsgType(Writer: TWriter); procedure ReadMsgState(Reader: TReader); procedure WriteMsgState(Writer: TWriter); procedure ReadSendIP(Reader: TReader); procedure WriteSendIP(Writer: TWriter); procedure ReadSendPort(Reader: TReader); procedure WriteSendPort(Writer: TWriter); procedure ReadRecIP(Reader: TReader); procedure WriteRecIP(Writer: TWriter); procedure ReadRecPort(Reader: TReader); procedure WriteRecPort(Writer: TWriter); procedure ReadBuffer(Stream: TStream); procedure WriteBuffer(Stream: TStream); protected procedure DefineProperties(Filer: TFiler); override; public constructor create(AOwner: TComponent); override; destructor destroy; override; property MsgID: string read FMsgID write FMsgID; property Size: Integer read FSize write FSize; property MsgType: TMsgType read FMsgType write FMsgType; property MsgState: TMsgState read FMsgState write FMsgState; property SendIP: string read FSendIP write FSendIP; property SendPort: Integer read FSendPort write FSendPort; property RecIP: string read FRecIP write FRecIP; property RecPort: Integer read FRecPort write FRecPort; property Buffer: BufferArray read FBuffer write FBuffer; end; TCmdType = (CT_Login, CT_UpLine, CT_DownLine, CT_LeaveLine, CT_ClaimFile, CT_CancelFile, CT_FileAcceptEnd, CT_ReSendFile); //命令消息 TCommandMsg = class(TBaseMessage) private FCommandType: TCmdType; FMemo: string; public function GetCmdType: TCmdType; // procedure SetCmdType(vType: TCmdType); // published property CommandTpye: TCmdType read FCommandType write FCommandType; property Memo: string read FMemo write FMemo; end; //文本消息 TTextMsg = class(TBaseMessage) private FTextSize: Integer; procedure SetText(vText: string); function GetText: string; public property Text: string read GetText write SetText; published property TextSize: Integer read FTextSize write FTextSize; end; //文件消息 TFileMsg = class(TBaseMessage) private FFileName: string; FFileSize: Integer; published property FileName: string read FFileName write FFileName; property FileSize: Integer read FFileSize write FFileSize; end; //IP信息 TIPOption = class(TBaseMessage) private FLocalIP: string; FLocalPort: Integer; published property LocalIP: string read FLocalIP write FLocalIP; property LocalPort: Integer read FLocalPort write FLocalPort; end; implementation { TBaseMessage } constructor TBaseMessage.create(AOwner: TComponent); begin inherited; ZeroMemory(@FBuffer, PackLen); end; procedure TBaseMessage.DefineProperties(Filer: TFiler); begin inherited; Filer.DefineProperty('MsgID', ReadMsgID, WriteMsgID, True); Filer.DefineProperty('Size', ReadSize, WriteSize, True); Filer.DefineProperty('MsgState', ReadMsgState, WriteMsgState, True); Filer.DefineProperty('MsgType', ReadMsgType, WriteMsgType, True); Filer.DefineProperty('SendIP', ReadSendIP, WriteSendIP, True); Filer.DefineProperty('SendPort', ReadSendPort, WriteSendPort, True); Filer.DefineProperty('RecIP', ReadRecIP, WriteRecIP, True); Filer.DefineProperty('RecPort', ReadRecPort, WriteRecPort, True); Filer.DefineBinaryProperty('Buffer', ReadBuffer, WriteBuffer, True); end; destructor TBaseMessage.destroy; begin inherited; end; procedure TBaseMessage.ReadBuffer(Stream: TStream); begin Stream.Read(FBuffer, FSize) end; procedure TBaseMessage.ReadMsgID(Reader: TReader); begin FMsgID := Reader.ReadString; end; procedure TBaseMessage.ReadMsgState(Reader: TReader); begin FMsgState := TMsgState(Reader.ReadInteger); end; procedure TBaseMessage.ReadMsgType(Reader: TReader); begin FMsgType := TMsgType(Reader.ReadInteger); end; procedure TBaseMessage.ReadRecIP(Reader: TReader); begin FRecIP := Reader.ReadString; end; procedure TBaseMessage.ReadRecPort(Reader: TReader); begin FRecPort := Reader.ReadInteger; end; procedure TBaseMessage.ReadSendIP(Reader: TReader); begin FSendIP := Reader.ReadString; end; procedure TBaseMessage.ReadSendPort(Reader: TReader); begin FSendPort := Reader.ReadInteger; end; procedure TBaseMessage.ReadSize(Reader: TReader); begin FSize := Reader.ReadInteger; end; procedure TBaseMessage.WriteBuffer(Stream: TStream); begin Stream.Write(FBuffer, FSize); end; procedure TBaseMessage.WriteMsgID(Writer: TWriter); begin Writer.WriteString(FMsgID); end; procedure TBaseMessage.WriteMsgState(Writer: TWriter); begin Writer.WriteInteger(Integer(FMsgState)); end; procedure TBaseMessage.WriteMsgType(Writer: TWriter); begin Writer.WriteInteger(Integer(FMsgType)); end; procedure TBaseMessage.WriteRecIP(Writer: TWriter); begin Writer.WriteString(FRecIP); end; procedure TBaseMessage.WriteRecPort(Writer: TWriter); begin Writer.WriteInteger(FRecPort); end; procedure TBaseMessage.WriteSendIP(Writer: TWriter); begin Writer.WriteString(FSendIP); end; procedure TBaseMessage.WriteSendPort(Writer: TWriter); begin Writer.WriteInteger(FSendPort); end; procedure TBaseMessage.WriteSize(Writer: TWriter); begin Writer.WriteInteger(FSize); end; { TCommandMsg } function TCommandMsg.GetCmdType: TCmdType; var MS: TMemoryStream; begin try MS := TMemoryStream.Create; MS.Write(FBuffer, Size); MS.Position := 0; MS.Read(Result, Size); finally MS.Free; end; end; procedure TCommandMsg.SetCmdType(vType: TCmdType); var MS: TMemoryStream; begin try Size := SizeOf(Integer); MS := TMemoryStream.Create; MS.Write(vType, Size); MS.Position := 0; MS.Read(FBuffer, Size); finally MS.Free; end; end; { TTextMsg } function TTextMsg.GetText: string; begin //Result := Copy(FBuffer, 0, Size); SetLength(Result, Size); CopyMemory(@Result, @FBuffer, Size); { } end; procedure TTextMsg.SetText(vText: string); begin ZeroMemory(@FBuffer, Size); Size := Length(vText); CopyMemory(@FBuffer, Pchar(vText), Size); end; end.