📄 buffer.pas
字号:
unit Buffer;
interface
uses
SPPO10, SMGP13, cmpp20, SGIP12, Windows, Classes, SysUtils;
type
TMtBuffer = packed record
Mt: TSPPO_MT; //消息中心到网关的下行数据包
preprced: byte; //是否已预处理
PrePrcResult: byte; //预处理结果0,正常,1无效的逻辑业务代码
OutMsgType: byte; //SMGP20消息类别
OutServiceID: array[0..9] of char; //smgp20计费代码
OutFeeType: array[0..1] of char; //smgp20费用类别
OutFixedFee: array[0..5] of char; //smgp20固定费用
OutFeeCode: array[0..5] of char; //smgp20费用
RealFeeCode: Cardinal; //实际费用
RecTime: TDateTime; //数据包接收时间
Status: Cardinal; //网关的应答状态
OutMtMsgid: array[0..9] of char; //外部MsgId
Prced: byte; //是否已成功处理
PrcTimes: byte; //向网关发送的次数
LastPrcTime: TDateTime; //最后向网关发送的时间
IsUsed: byte; //缓冲是否已用
end;
//SMGP MO 缓冲
TMoBuffer = packed record
mo: TSMGP13_DELIVER;
MoInMsgId: TINMSGID;
RecTime: TDateTime;
Prced: byte;
PrcTimes: byte;
LastPrcTime: TDateTime;
IsUsed: byte;
end;
//SMGP rpt
TRptBuffer = packed record
Rpt: TSMGP13_DELIVER;
RecTime: TDateTime;
MtLogicId: Cardinal;
MtInMsgId: TINMSGID;
MtSpAddr: TPHONENUM;
MtUserAddr: TPHONENUM;
Prced: byte;
PrcTimes: byte;
LastPrcTime: TDateTime;
IsUsed: byte;
end;
//SMGP OutMonitor
TOutMonitorBuffer = packed record
pac: TSMGP13_PACKET;
IsUsed: byte;
end;
//CMPP MO 缓冲
TMocmppBuffer = packed record
mo: TCMPP_DELIVER;
MoInMsgId: TINMSGID;
RecTime: TDateTime;
Prced: byte;
PrcTimes: byte;
LastPrcTime: TDateTime;
IsUsed: byte;
end;
//CMPP rpt
TRptcmppBuffer = packed record
Rpt: TCMPP_DELIVER;
RecTime: TDateTime;
MtLogicId: Cardinal;
MtInMsgId: TINMSGID;
MtSpAddr: TPHONENUM;
MtUserAddr: TPHONENUM;
Prced: byte;
PrcTimes: byte;
LastPrcTime: TDateTime;
IsUsed: byte;
end;
//cmpp OutMonitor
TOutMonitorCmppBuffer = packed record
pac: TCMPP20_PACKET;
IsUsed: byte;
end;
//SGIP mo 缓冲
TMoSgipBuffer = packed record
mo: TSGIP12_DELIVER;
MoInMsgId: TINMSGID;
RecTime: TDateTime;
Prced: byte;
PrcTimes: byte;
LastPrcTime: TDateTime;
IsUsed: byte;
end;
//SGIP rpt
TRptSgipBuffer = packed record
Rpt: TSGIP12_DELIVER;
RecTime: TDateTime;
MtLogicId: Cardinal;
MtInMsgId: TINMSGID;
MtSpAddr: TPHONENUM;
MtUserAddr: TPHONENUM;
Prced: byte;
PrcTimes: byte;
LastPrcTime: TDateTime;
IsUsed: byte;
end;
//SGIP OutMonitor
TOutMonitorSgipBuffer = packed record
pac: TSGIP12_PACKET;
IsUsed: byte;
end;
TInMonitorBuffer = packed record
pac: TSPPO_PACKET;
IsUsed: byte;
end;
//基本缓冲类
TBaseBufferObj = class(TObject)
private
Critical: TRTLCriticalSection; //临界区
WriteCursor: Cardinal; //写缓冲游标
ReadCursor: Cardinal; //读缓冲游标
HaveBuffer: boolean; //有可读缓冲
procedure lock;
procedure unlock;
public
constructor Create();
destructor destroy; override;
end;
//基本MT缓冲类
TBaseMtBufferObj = class(TBaseBufferObj)
private
Buffers: array of TMtBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TMtBuffer;
end;
//SMGP 小灵通 电信
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//TBaseMoBufferObj
TBaseMoBufferObj = class(TBaseBufferObj)
private
Buffers: array of TMoBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TMoBuffer;
end;
//TMoLogBufferObj
TMoLogBufferObj = class(TBaseMoBufferObj)
public
constructor Create();
destructor destroy; override;
function Add(Buffer: TMoBuffer): boolean;
function Get: integer;
procedure BakBuffer;
end;
//smgp mo buffer
TMoBufferObj = class(TBaseMoBufferObj)
LogBuffers: TMoLogBufferObj;
private
Seqid: Cardinal;
function GetSeqid: Cardinal;
procedure GetMsgId(var InMsgId: array of char);
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(pac: TSMGP13_PACKET): boolean;
procedure Update(i: integer);
procedure UpdateResp(i: integer);
procedure DelExpired; //处理过期
procedure BakBuffer;
end;
//smgp的mt log
TMtLogBufferObj = class(TBaseMtBufferObj)
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(Buffer: TMtBuffer): boolean;
procedure BakBuffer;
end;
//MT的缓冲类 smgp
TMtBufferObj = class(TBaseMtBufferObj)
LogBuffers: TMtLogBufferObj;
private
HavePrePrcBuffer: boolean;
PrePrcCursor: Cardinal;
MoReadCursor: Cardinal; //用于MO引起MT的读游标
MoHaveBuffer: boolean; //用于MO引起MT的状态字
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(pac: TSPPO_PACKET): boolean;
procedure Update(i: integer);
procedure UpdateResp(i: integer; MtOutMsgId: array of char; Status: Cardinal);
procedure DelExpired; //处理过期
function GetPrePrc: integer;
procedure UpdatePrePrced(i: integer; ServiceID: integer);
procedure UpdateFailPrePrced(i: integer; result: integer);
procedure BakBuffer;
end;
//SmGp 监控
TMonitorOutBufferObj = class(TBaseBufferObj)
Buffers: array of TOutMonitorBuffer;
public
constructor Create();
destructor destroy; override;
function Add(pac: TSMGP13_PACKET): boolean;
procedure Delete(i: integer);
end;
//smgp baserptbuffer
TBaseRptBufferObj = class(TBaseBufferObj)
private
Buffers: array of TRptBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TRptBuffer;
end;
//smgp rptbuffer
TRptBufferObj = class(TBaseRptBufferObj)
public
constructor Create();
destructor destroy; override;
function Add(Buffer: TRptBuffer): boolean;
function Get: integer;
procedure Update(i: integer);
procedure UpdateResp(i: integer);
procedure BakBuffer;
end;
//TRptLogBufferObj
TRptLogBufferObj = class(TBaseRptBufferObj)
SendBuffers: TRptBufferObj;
public
constructor Create();
destructor destroy; override;
function Add(pac: TSMGP13_PACKET): boolean;
function Get: integer;
procedure Update(i: integer);
procedure UpdateMsgId(i: integer; MtInMsgId: string; MtLogicId: Cardinal; MtSpAddr, MtUserAddr: string);
procedure BakBuffer;
procedure DelExpired; //处理过期
end;
//CMPP 移动
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//TBaseMocmppBufferObj
TBaseMocmppBufferObj = class(TBaseBufferObj)
private
Buffers: array of TMocmppBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TMocmppBuffer;
end;
//TMtCmppLogBufferObj
TMtCmppLogBufferObj = class(TBaseMtBufferObj)
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(Buffer: TMtBuffer): boolean;
procedure BakBuffer;
end;
//TMoLogcmppBufferObj
TMoLogcmppBufferObj = class(TBaseMocmppBufferObj)
public
constructor Create();
destructor destroy; override;
function Add(Buffer: TMocmppBuffer): boolean;
function Get: integer;
procedure BakBuffer;
end;
//cmpp mo buffer
TMocmppBufferObj = class(TBaseMocmppBufferObj)
LogBuffers: TMoLogcmppBufferObj;
private
Seqid: Cardinal;
function GetSeqid: Cardinal;
procedure GetMsgId(var InMsgId: array of char);
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(pac: TCMPP20_PACKET): boolean;
procedure Update(i: integer);
procedure UpdateResp(i: integer);
procedure DelExpired; //处理过期
procedure BakBuffer;
end;
//cMpp的mt缓冲类
TMtcmppBufferObj = class(TBaseMtBufferObj)
LogBuffers: TMtCmppLogBufferObj;
private
HavePrePrcBuffer: boolean;
PrePrcCursor: Cardinal;
MoReadCursor: Cardinal; //用于MO引起MT的读游标
MoHaveBuffer: boolean; //用于MO引起MT的状态字
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(pac: TSPPO_PACKET): boolean;
procedure Update(i: integer);
//procedure UpdateResp(i: integer; MtOutMsgId: array of char; Status: Cardinal);
procedure UpdateResp(i: integer; MtOutMsgId: Int64; Status: Cardinal);
procedure DelExpired; //处理过期
function GetPrePrc: integer;
procedure UpdatePrePrced(i: integer; ServiceID: integer);
procedure UpdateFailPrePrced(i: integer; result: integer);
procedure BakBuffer;
end;
//cmpp 监控
TMonitorOutCmppBufferObj = class(TBaseBufferObj)
Buffers: array of TOutMonitorCmppBuffer;
public
constructor Create();
destructor destroy; override;
function Add(pac: TCMPP20_PACKET): boolean;
procedure Delete(i: integer);
end;
//cmpp baserptbuffer
TBaseRptcmppBufferObj = class(TBaseBufferObj)
private
Buffers: array of TRptcmppBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TRptcmppBuffer;
end;
//cmpp rptbuffer
TRptcmppBufferObj = class(TBaseRptcmppBufferObj)
public
constructor Create();
destructor destroy; override;
function Add(Buffer: TRptcmppBuffer): boolean;
function Get: integer;
procedure Update(i: integer);
procedure UpdateResp(i: integer);
procedure BakBuffer;
end;
//TRptLogcmppBufferObj
TRptLogcmppBufferObj = class(TBaseRptcmppBufferObj)
SendcmppBuffers: TRptcmppBufferObj;
public
constructor Create();
destructor destroy; override;
function Add(pac: TCMPP20_PACKET): boolean;
function Get: integer;
procedure Update(i: integer);
procedure UpdateMsgId(i: integer; MtInMsgId: string; MtLogicId: Cardinal; MtSpAddr, MtUserAddr: string);
procedure BakBuffer;
procedure DelExpired; //处理过期
end;
//SGIP 联通
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//mo Sgip base buffer
TBaseMoSgipBufferObj = class(TBaseBufferObj)
private
Buffers: array of TMoSgipBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TMoSgipBuffer;
end;
//logSgip
TMoLogSgipBufferObj = class(TBaseMoSgipBufferObj)
public
constructor Create();
destructor destroy; override;
function Add(Buffer: TMoSgipBuffer): boolean;
function Get: integer;
procedure BakBuffer;
end;
//Sgip mo buffer
TMoSgipBufferObj = class(TBaseMoSgipBufferObj)
LogBuffers: TMoLogSgipBufferObj;
private
Seqid: Cardinal;
function GetSeqid: Cardinal;
procedure GetMsgId(var InMsgId: array of char);
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(pac: TSGIP12_PACKET): boolean;
procedure Update(i: integer);
procedure UpdateResp(i: integer);
procedure DelExpired; //处理过期
procedure BakBuffer;
end;
//Sgip的mt log
TMtSgipLogBufferObj = class(TBaseMtBufferObj)
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(Buffer: TMtBuffer): boolean;
procedure BakBuffer;
end;
//Sgip的mt缓冲类
TMtSgipBufferObj = class(TBaseMtBufferObj)
LogBuffers: TMtSgipLogBufferObj;
private
HavePrePrcBuffer: boolean;
PrePrcCursor: Cardinal;
MoReadCursor: Cardinal; //用于MO引起MT的读游标
MoHaveBuffer: boolean; //用于MO引起MT的状态字
public
constructor Create();
destructor destroy; override;
function Get: integer;
function Add(pac: TSPPO_PACKET): boolean;
procedure Update(i: integer);
//procedure UpdateResp(i: integer; MtOutMsgId: array of char; Status: Cardinal);
procedure UpdateResp(i: integer; MtOutMsgId: Int64; Status: Cardinal);
procedure DelExpired; //处理过期
function GetPrePrc: integer;
procedure UpdatePrePrced(i: integer; ServiceID: integer);
procedure UpdateFailPrePrced(i: integer; result: integer);
procedure BakBuffer;
end;
//Sgip 监控
TMonitorOutSgipBufferObj = class(TBaseBufferObj)
Buffers: array of TOutMonitorSgipBuffer;
public
constructor Create();
destructor destroy; override;
function Add(pac: TSGIP12_PACKET): boolean;
procedure Delete(i: integer);
end;
//Sgip baserptbuffer
TBaseRptSgipBufferObj = class(TBaseBufferObj)
private
Buffers: array of TRptSgipBuffer;
procedure LoadFromFile(FileName: string; BlockSize: integer);
procedure SaveToFile(FileName: string; BlockSize: integer);
public
constructor Create();
destructor destroy; override;
function Count: integer;
function BufferSize: integer;
procedure Delete(i: integer);
function Read(i: integer): TRptSgipBuffer;
end;
//Sgip rptbuffer
TRptSgipBufferObj = class(TBaseRptSgipBufferObj)
public
constructor Create();
destructor destroy; override;
function Add(Buffer: TRptSgipBuffer): boolean;
function Get: integer;
procedure Update(i: integer);
procedure UpdateResp(i: integer);
procedure BakBuffer;
end;
//Sgip
TRptLogSgipBufferObj = class(TBaseRptSgipBufferObj)
SendSgipBuffers: TRptSgipBufferObj;
public
constructor Create();
destructor destroy; override;
function Add(pac: TSGIP12_PACKET): boolean;
function Get: integer;
procedure Update(i: integer);
procedure UpdateMsgId(i: integer; MtInMsgId: string; MtLogicId: Cardinal; MtSpAddr, MtUserAddr: string);
procedure BakBuffer;
procedure DelExpired; //处理过期
end;
//OUTHER
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TMonitorInBufferObj = class(TBaseBufferObj)
Buffers: array of TInMonitorBuffer;
public
constructor Create();
destructor destroy; override;
function Add(pac: TSPPO_PACKET): boolean;
procedure Delete(i: integer);
end;
implementation
uses
Global, DateUtils;
//基本
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
{ TBaseBufferObj }
constructor TBaseBufferObj.Create;
begin
inherited;
InitializeCriticalSection(Critical);
WriteCursor := 1;
ReadCursor := 1;
HaveBuffer := True;
end;
destructor TBaseBufferObj.destroy;
begin
DeleteCriticalSection(Critical);
inherited;
end;
procedure TBaseBufferObj.lock;
begin
EnterCriticalSection(Critical);
end;
procedure TBaseBufferObj.unlock;
begin
LeaveCriticalSection(Critical);
end;
{ TBaseMtBufferObj }
function TBaseMtBufferObj.BufferSize: integer;
begin
result := high(Buffers);
end;
function TBaseMtBufferObj.Count: integer;
var
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -