unit UnitSample;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls,
  unitPOS_CIDR, UnitPhoneButton;

type
  TFormSample = class(TForm)
    ListBoxLog: TListBox;
    PanelPhones: TPanel;
    CheckBoxAutoRecord: TCheckBox;
    ListViewDescription: TListView;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure PanelPhonesResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    myPhones: TList;
    procedure myCallback(line: Int32; msg: WideString);
    procedure AddPhones(newCount: Integer);
    procedure PhoneButtonMouse(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SaveLine(line: Integer);
    procedure AddDescription(line:Integer; desc: String);
  public
    procedure AddLog(str: String);
  end;

var
  FormSample: TFormSample;

implementation

{$R *.dfm}

procedure TFormSample.FormCreate(Sender: TObject);
begin
  myPhones:= Tlist.Create;
end;

procedure TFormSample.FormShow(Sender: TObject);
var
  dll_ver: WideString;
  temp: Integer;
begin
  if (not CIDR_Loaded) then
  begin
    MessageDlg('Device driver is not installed!'#13#10+
      'لطفا درايور دستگاه را نصب نموده و حداقل يکبار دستگاه را به کامپيوتر متصل نماييد'
    , mtError, [mbOK], 0);
    Halt;
  end;

  CIDR_GetInfo(dll_ver, temp);
  AddLog(dll_ver);

  AddLog('Registering Callback');
  CIDR_RegisterMethod(myCallback, 5);
end;

procedure TFormSample.AddLog(str: String);
var
  t: String;
begin
  t:= FormatDateTime('YY-MM-dd HH:mm:ss.zzz', Now);
  ListBoxLog.Items.Add(t + ': ' + str);
  ListBoxLog.Selected[ListBoxLog.Items.Count-1]:= true;
end;

procedure TFormSample.AddDescription(line:Integer; desc: String);
var
  t: String;
  item: TListItem;
begin
  t:= FormatDateTime('YY-MM-dd HH:mm:ss.zzz', Now);
  item:= ListViewDescription.items.Add;
  item.Caption:= t;
  if (line>0) then
    item.SubItems.Add(IntToStr(line))
  else
    item.SubItems.Add('SYS');
  item.SubItems.Add(desc);
  item.MakeVisible(False);
end;


procedure TFormSample.myCallback(line: Int32; msg: WideString);
var
  code: WideChar;
  thePhone: TPhoneButton;
  tempW: WideString;
  temp, temp2: String;
  lines: Integer;
  stopSave: Boolean;
  description: String;
begin
  AddLog('[' + IntToStr(line) + '] ' + msg);
  //Exit;
  if (line=0) then  // System Event !!!
  begin
    // refresh system info
    CIDR_GetInfo(tempW, lines);
    if (myPhones.Count<lines) then
      AddPhones(lines);
  end
  else if (msg<>'') then   // Line Event
  begin
    code:= msg[1];
    thePhone:= TPhoneButton(myPhones[line-1]);
    stopSave:= False;

    case code of
      'C':  // شماره تماس گيرنده
        begin
          temp:= Copy(msg, 2, Pos(',', msg)-2);
          // شماره تماس گيرنده
          thePhone.CallerID:= temp;
          temp2:= Copy(msg, Pos(',', msg)+1, 8);
          Insert(':', temp2, 7);
          Insert(' ', temp2, 5);
          Insert('/', temp2, 3);
          // تاريخ و ساعت تماس بر اساس مخابرات
          description:= 'شماره تماس گيرنده ' + temp + ' ساعت و تاريخ مخابرات ' + temp2;
          AddDescription(line, description);
        end;
      'D':  // فشرده شدن دکمه
        begin
          temp:= Copy(msg, 2, 1);
          // دکمه ي فشرده شده
          description:= 'دکمه فشرده شده ' + temp;
          thePhone.AddDialed(temp);
          AddDescription(line, description);
        end;
      'X':  // مسير تلفن قطع است
        begin
          thePhone.State:= psNoLine;
          stopSave:= True;
          description:= 'خط تلفن قطع است';
          AddDescription(line, description);
        end;
      'Q':  // ارتباط دستگاه قطع است
        begin
          thePhone.State:= psNoDevice;
          stopSave:= True;
          description:= 'دستگاه مربوطه متصل نيست';
          AddDescription(line, description);
        end;
      'F':  // گوشي برداشته شده است
        begin
          thePhone.State:= psHookOff;
          if CheckBoxAutoRecord.Checked and not thePhone.Recording then
            SaveLine(line);
          description:= 'گوشي برداشته شده است';
          AddDescription(line, description);
        end;
      'N':  // گوشي گذاشته شده است
        begin
          if (thePhone.State=psHookOff) then
          begin
            temp:= Copy(msg, 2, Pos('D', msg)-2);
            // زمان برداشته بودن گوشي بر حسب ثانيه
            temp2:= Copy(msg, Pos('D', msg)+1, MaxInt);
            // دکمه هاي فشرده شده
            description:= 'گوشي پس از ' + temp + ' ثانيه';
            if (temp2<>'') then
              description:= description + ' و شماره گيري ' + temp2;
            description:= description + ' گذاشته شده است';
          end
          else
            description:= 'گوشي گذاشته شده است';

          stopSave:= True;
          thePhone.State:= psHookOn;
          AddDescription(line, description);
        end;
      'R':  // زنگ ميخورد
        begin
          temp:= Copy(msg, 2, MaxInt);
          // تعداد زنگها
          thePhone.State:= psRing;
          description:= 'در حال زنگ خوردن ' + temp + ' بار';
          AddDescription(line, description);
        end;
      'I':  // اطلاعات در مورد ذخيره سازي
        begin
          temp:= UpperCase(Copy(msg, 2, 5));
          if (temp='SAVES') then
          begin
            thePhone.Recording:= False;
            description:= 'ذخيره سازي متوقف شده است';
            AddDescription(line, description);
          end
          else if (temp='SAVE ') then
          begin
            thePhone.Recording:= True;
            temp:= Copy(msg, 7, MaxInt);
            // اسم فايل در حال ذخيره شدن
            description:= 'ذخيره سازي شروع شده است ' + temp;
            AddDescription(line, description);
          end;
        end;
    end;

    if CheckBoxAutoRecord.Checked and stopSave then
      CIDR_SaveLine(line, '', '');

  end;
end;

procedure TFormSample.AddPhones(newCount: Integer);
var
  obj: TPhoneButton;
begin
  while (myPhones.Count<newCount) do
  begin
    obj:= TPhoneButton.Create(myPhones.Count+1, PanelPhones);
    obj.OnMouseUp:= PhoneButtonMouse;
    myPhones.Add(obj);
  end;
  PanelPhonesResize(self);
end;

procedure TFormSample.PanelPhonesResize(Sender: TObject);
var
  i: Integer;
  Step, W, H: Integer;
  X, Y: Integer;
begin
  if (myPhones.Count=0) then
    Exit;

  H:= PanelPhones.ClientHeight - 10;
  Y:= (PanelPhones.ClientHeight - H ) div 2;
  Step:= PanelPhones.ClientWidth div myPhones.Count;
  W:= Step - 10;
  X:= (W - Step) div 2+10;

  for i:= 0 to myPhones.Count-1 do
  begin
    TControl(myPhones[i]).SetBounds(X, Y, W, H);
    X:= X + Step;
  end;
end;

procedure TFormSample.SaveLine(line: Integer);
var
  fname: WideString;
begin
  fname:= ExtractFilePath(Application.ExeName) + 'Calls\'+ FormatDateTime('YY-MM-dd-HH-mm-ss', Now)+' ['+IntToStr(line)+ '].mp3'+#0;
  CIDR_SaveLine(line, PWideChar(fname), '');
end;

procedure TFormSample.PhoneButtonMouse(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i, k: Integer;
  v: Boolean;
begin
  if (Sender is TPhoneButton) then
  begin
    if (Button=mbLeft) then
    begin
      v:= TPhoneButton(Sender).Playing;
      if (v) then
        k:= 0
      else
        k:= TPhoneButton(Sender).Tag;

      for i:=1 to myPhones.Count do
        TPhoneButton(myPhones[i-1]).Playing:= False;

      if (CIDR_PlayLine(k)>0) and (k>0) then  // successful
        TPhoneButton(myPhones[k-1]).Playing:= True;
    end
    else if (Button=mbRight) then
    begin
      v:= TPhoneButton(Sender).Recording;
      k:= TPhoneButton(Sender).Tag;
      if (v) then
      begin
        CIDR_SaveLine(k, '', '');
        TPhoneButton(Sender).Recording:= False;
      end
      else
        SaveLine(k);
    end;
  end;
end;

procedure TFormSample.Button1Click(Sender: TObject);
begin
  ShowMessage(CIDR_Info());
end;

end.
