📄 djbase.pas
字号:
unit DjBase;
interface
uses SyncObjs,SysUtils,ExtCtrls,Classes,messages;
const
MaxChannel = 100;
const
WM_ReceiveMessage = WM_USER + 501 ;
WM_Test = WM_USER + 502 ;
WM_SEATSTATECHANGE = WM_USER +503 ;
WM_HANGUP = WM_USER + 504;
WM_HANGOFF = WM_USER + 505 ;
WM_OFFHOOK = WM_USER + 506 ;
WM_CALLOUT = WM_USER + 507 ;
WM_KEEP = WM_USER + 508 ;
WM_GETKEEP = WM_USER + 509 ;
WM_BEGINTHREECALL = WM_USER + 510 ;
WM_ENDTHREECALL = WM_USER + 511 ;
WM_ENJOY = WM_USER + 512 ;
WM_STOPENJOY = WM_USER + 513 ;
const
DjE_InitError = 0 ;
DjE_FinalError = 1 ;
DjE_LoadDriveFailed = 2 ;
DjE_InitDjCardFailed =3 ;
DjE_NoDialInFun = 4 ;
DjE_IsNotForm = 5 ;
DjE_NoManager= 6 ;
DjE_LINKTHREE = 7 ;
const
S_TimeOut = 0;
type
TDjException = class(Exception)
private
FErrorCode :Integer;
public
constructor Create(ErrorCode:Integer);
property ErrorCode:integer read FErrorCode;
end;
type
TRecordType =
(
ShengKong, //声控
YaKong //压控
);
TPlayState =
(
Playing,
NotPlay
);
TRecord = record
IsRecord :Boolean;
Recording:boolean;
RecordChannel:Integer;
RecordType : TRecordType ;
IsAGC:boolean;
FileName:array[0..159] of char;
end;
type
TChannelState =
(
Idle, //空闲 (软件挂机)
occupy, //占用
Calling, //(呼出)
CallNuming, //呼出拨号阶段
Dailing, //呼入
Speck, //通话
keep,
DailEnd,
disabled, //禁止使用
NotingState
);
type
TChannelType = //通道内型
(
UserChannel,
TrunkChannel,
Nothing,
RecordChannel
);
type
TConnectState =
(
Ringing,
Connected,
OneConnect,
ThreeState,
MeetingState,
Keeping,
NotingConnect
);
type
TConnectStep =
(
InitStep = 0 ,
ringstep
);
type
TPhoneState =
(
HangState, //挂机
HookState //摘机
);
type
//区分主动摘机,被动摘机
TCallActor =
(
CallerActor,
DialerActor
);
//主动挂机/被动挂机
TDialActor =
(
MasterActor,
Slaveactor
);
type
TConnectChannel = record
ConState : TConnectState ;
ConChnlId : Integer;
CallActive:boolean;
CallerPhone:string;
Channeler :pointer;
DailerPhone:string;
end;
type
PMeeting = ^TMeeting;
TMeeting = record
IsUse :boolean;
MeetingID:integer;
ChannelList:TList;
end;
type
PChannel = ^TChannel;
TChannel = record
ChannelID:integer;
State: TChannelState;
Ringing: boolean; //通道是否正在振铃
ChannelType: TChannelType;
ConnectChannel: TConnectChannel; //与本通道连接的通道
Dtmf: string; //本通道收到的DTMF码
Step: integer;
Phone:string; //本通道分配的电话号码
IsUse :Boolean ;
PhoneState:TPhoneState;
IsMeeting:Boolean;
Meeting:PMeeting;
Recorded:TRecord ;
PlayState:TPlayState;
CallActor:TCallActor;
DialActor:TDialActor;
end;
type
TMeetingList = class
private
MeetGroup:array[0..9] of PMeeting;
function GetMeeting(Index:integer):PMeeting;
protected
public
constructor Create;
destructor Destroy;override;
function GetFreeMeeting:PMeeting ;
property items[index:integer] :PMeeting read GetMeeting ;
end;
type
TChannelList = class(TThreadList)
private
function GetCount :Integer;
function GetItems(Index:integer):PChannel;
protected
public
constructor Create;
destructor Destroy;override;
property Count :integer read GetCount;
property Items[Index:integer]:PChannel read GetItems;
function GetChannelFromPhone(Phone:string):PChannel ;
//function GetChannelFromCallerPhone(Phone:string):PChannel ;
function GetFreeTurnk:PChannel;
end;
var
ChannelList :TChannelList;
implementation
{ TChannelList }
{-------------------------------------------------------------------------------
过程名: TChannelList.Create
作者: fengfan
日期: 2006.08.29
参数: 无
返回值: 无
-------------------------------------------------------------------------------}
constructor TChannelList.Create;
begin
inherited;
end;
{-------------------------------------------------------------------------------
过程名: TChannelList.Destroy
作者: fengfan
日期: 2006.08.29
参数: 无
返回值: 无
-------------------------------------------------------------------------------}
destructor TChannelList.Destroy;
begin
inherited;
end;
{-------------------------------------------------------------------------------
过程名: TChannelList.SetChannel
作者: fengfan
日期: 2006.08.29
参数: Index: integer; Channel: PChannel
返回值: 无
-------------------------------------------------------------------------------}
//function TChannelList.GetCount: Integer;
//var
// List :TList ;
//begin
// List := LockList;
// Result := List.Count;
// UnlockList;
//end;
{ TDjException }
constructor TDjException.Create(ErrorCode: Integer);
begin
inherited CreateRes(ErrorCode);
FErrorCode := ErrorCode;
end;
function TChannelList.GetChannelFromPhone(Phone: string): PChannel;
var
List:TList ;
Channel:PChannel ;
i:integer;
begin
Result := nil ;
List := LockList;
try
for i:=0 to List.Count -1 do
begin
Channel := List.Items[i];
if Channel.Phone = Phone then
begin
Result := Channel;
break;
end;
end;
finally
UnlockList ;
end;
end;
function TChannelList.GetCount: Integer;
var
List:TList;
begin
List := LockList ;
result := List.Count ;
UnlockList;
end;
function TChannelList.GetFreeTurnk: PChannel;
var
List:TList ;
i:integer;
Channel :PChannel ;
begin
Result := nil ;
List := LockList;
for i:=0 to List.Count -1 do
begin
Channel := List.items[i];
if (Channel.ChannelType = TrunkChannel) and (Channel.IsUse) then
if Channel.State = Idle then
begin
Result := Channel ;
break;
end;
end;
UnlockList;
end;
function TChannelList.GetItems(Index: integer): PChannel;
var
List:TList ;
begin
List := LockList;
if Index < List.Count then
begin
Result := (List.items[index]);
end
else
begin
result := nil;
end;
UnlockList;
end;
{ TMeetingList }
constructor TMeetingList.Create;
var
i:integer;
// Meeting:PMeeting;
begin
inherited create;
for i := low(MeetGroup) to High(MeetGroup) do
begin
new(MeetGroup[i]);
MeetGroup[i].IsUse := False ;
MeetGroup[i].MeetingID := i+1 ;
MeetGroup[i].ChannelList:= TList.Create;
end;
end;
destructor TMeetingList.Destroy;
begin
inherited;
end;
function TMeetingList.GetFreeMeeting: PMeeting;
var
i:integer;
Meeting:PMeeting;
begin
Meeting:= nil;
for i := low(MeetGroup) to High(MeetGroup) do
begin
if Assigned(MeetGroup[i]) then
begin
if not MeetGroup[i].IsUse then
begin
Meeting := MeetGroup[i] ;
break;
end;
end;
end;
Result := Meeting ;
end;
function TMeetingList.GetMeeting(Index: integer): PMeeting;
begin
if Index in [Low(MeetGroup)..High(MeetGroup)] then
Result := MeetGroup[Index]
else
Result := nil ;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -