uMain.pas
上传用户:axbxcx
上传日期:2009-10-29
资源大小:15k
文件大小:15k
源码类别:

TAPI编程

开发平台:

Delphi

  1. unit uMain;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls, NetAudio, DblPxyTcp, uCall, uSelIP,
  6.   LMDCustomComponent, LMDWndProcComponent, LMDTrayIcon, Menus, LMDPopupMenu;
  7. type
  8.   TFormMain = class(TForm)
  9.     BtOpen: TBitBtn;
  10.     BtClose: TBitBtn;
  11.     BtCall: TBitBtn;
  12.     LbMyIP: TLabel;
  13.     LbCaller: TLabel;
  14.     Panel1: TPanel;
  15.     Panel2: TPanel;
  16.     Label3: TLabel;
  17.     Label5: TLabel;
  18.     EdSocksUser: TEdit;
  19.     Label6: TLabel;
  20.     EdSocksPass: TEdit;
  21.     RbSocks4: TRadioButton;
  22.     RbSocks5: TRadioButton;
  23.     CkSocks: TCheckBox;
  24.     CkHttp: TCheckBox;
  25.     Label1: TLabel;
  26.     Label7: TLabel;
  27.     EdHttpUser: TEdit;
  28.     Label8: TLabel;
  29.     EdHttpPass: TEdit;
  30.     Label9: TLabel;
  31.     EdListenPort: TEdit;
  32.     StatusBar: TStatusBar;
  33.     BtStop: TBitBtn;
  34.     CkPhone: TCheckBox;
  35.     CkSpeaker: TCheckBox;
  36.     ATimer: TTimer;
  37.     SbDelayTime: TScrollBar;
  38.     LbDelayTime: TLabel;
  39.     BtSaveSetup: TBitBtn;
  40.     EdSocksIP: TComboBox;
  41.     EdHttpIP: TComboBox;
  42.     TrayIcon: TLMDTrayIcon;
  43.     MenuPopup: TLMDPopupMenu;
  44.     MnDisplay: TMenuItem;
  45.     MnHide: TMenuItem;
  46.     N1: TMenuItem;
  47.     MnExit: TMenuItem;
  48.     procedure FormCreate(Sender: TObject);
  49.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  50.     procedure BtOpenClick(Sender: TObject);
  51.     procedure BtCloseClick(Sender: TObject);
  52.     procedure BtCallClick(Sender: TObject);
  53.     procedure BtStopClick(Sender: TObject);
  54.     procedure ATimerTimer(Sender: TObject);
  55.     procedure SbDelayTimeChange(Sender: TObject);
  56.     procedure CkPhoneClick(Sender: TObject);
  57.     procedure CkSpeakerClick(Sender: TObject);
  58.     procedure BtSaveSetupClick(Sender: TObject);
  59.     procedure MnDisplayClick(Sender: TObject);
  60.     procedure MnHideClick(Sender: TObject);
  61.     procedure MnExitClick(Sender: TObject);
  62.   private
  63.     { Private declarations }
  64.     IsOpen, IsBusy: Boolean;
  65.     Sock: TDblProxyTcpSocket;
  66.     Listen: TAudioListenThread;
  67.     Recv: TAudioRecvThread;
  68.     Send: TAudioSendThread;
  69.     FormCall: TFormCall;
  70.     FormSelIP: TFormSelIP;
  71.   public
  72.     { Public declarations }
  73.     procedure LoadConfigInfo;
  74.     procedure SaveConfigInfo;    
  75.     procedure DoCallFinal;
  76.     procedure DoListenFinal;
  77.     procedure UpdateButtons;
  78.     procedure OnConnected(var ms: TMessage); message WM_CONNECTED;
  79.     procedure OnClientConnect(var ms: TMessage); message WM_CLIENTCONNECT;
  80.     procedure OnStateMessage(var ms: TMessage); message WM_STATEMESSAGE;
  81.   end;
  82. var
  83.   FormMain: TFormMain;
  84. implementation
  85. uses blcksock;
  86. {$R *.dfm}
  87. {$I-}
  88. type
  89.   PConfigInfo = ^TConfigInfo;
  90.   TConfigInfo = packed record
  91.     Flags: string[19];
  92.     DelayTime: Integer;
  93.     Port: string[31];
  94.     ListenHttp, ListenSocks, ListenSocks4: Boolean;
  95.     ListenSocksIP, ListenSocksUser: string[63];
  96.     ListenHttpIP, ListenHttpUser: string[63];
  97.     CallHttp, CallSocks, CallSocks4: Boolean;
  98.     CallSocksIP, CallSocksUser: string[63];
  99.     CallHttpIP, CallHttpUser: string[63];
  100.   end;
  101. procedure TerminateThread(thread: TThread);
  102. begin
  103.   if Assigned(thread) then
  104.   begin
  105.     thread.Terminate;
  106.     try PostThreadMessage(thread.ThreadID, WM_TERMINATE, 0, 0);
  107.     except end;
  108.   end;
  109. end;
  110. procedure ParseIpPort(const addr: string; var ip, port: string);
  111. var i: Integer;
  112. begin
  113.   port := addr;
  114.   i := Pos(':', port);
  115.   ip := Copy(port, 1, i - 1);
  116.   Delete(port, 1, i);
  117. end;
  118. procedure TFormMain.LoadConfigInfo;
  119. var p: PConfigInfo;
  120.     f: file;
  121. begin
  122.   if not FileExists(ConfigFile) then Exit;
  123.   GetMem(p, Sizeof(TConfigInfo));
  124.   AssignFile(f, ConfigFile);
  125.   Reset(f, 1);
  126.   BlockRead(f, p^, Sizeof(TConfigInfo));
  127.   if IOResult <> 0 then
  128.   begin
  129.     CloseFile(f);
  130.     FreeMem(p, Sizeof(TConfigInfo));
  131.     Exit;
  132.   end;
  133.   CloseFile(f);
  134.   if p^.Flags = 'NET-IP-PHONE-CONFIG' then
  135.   begin
  136.     if (p^.DelayTime > 0) or (p^.DelayTime <= MAXDELAYTIME) then
  137.     begin
  138.       SbDelayTime.Position := p^.DelayTime;
  139.       SetDelayTime(p^.DelayTime);
  140.     end;
  141.     EdListenPort.Text := p^.Port;
  142.     CkSocks.Checked := p^.ListenSocks;
  143.     CkHttp.Checked := p^.ListenHttp;
  144.     RbSocks4.Checked := p^.ListenSocks4;
  145.     RbSocks5.Checked := not p^.ListenSocks4;
  146.     EdSocksIP.Text := p^.ListenSocksIP;
  147.     EdSocksUser.Text := p^.ListenSocksUser;
  148.     EdHttpIP.Text := p^.ListenHttpIP;
  149.     EdHttpUser.Text := p^.ListenHttpUser;
  150.     FormCall.CkSocks.Checked := p^.CallSocks;
  151.     FormCall.CkHttp.Checked := p^.CallHttp;
  152.     FormCall.RbSocks4.Checked := p^.CallSocks4;
  153.     FormCall.RbSocks5.Checked := not p^.CallSocks4;
  154.     FormCall.EdSocksIP.Text := p^.CallSocksIP;
  155.     FormCall.EdSocksUser.Text := p^.CallSocksUser;
  156.     FormCall.EdHttpIP.Text := p^.CallHttpIP;
  157.     FormCall.EdHttpUser.Text := p^.CallHttpUser;
  158.   end;
  159.   FreeMem(p, Sizeof(TConfigInfo));
  160. end;
  161. procedure TFormMain.SaveConfigInfo;
  162. var p: PConfigInfo;
  163.     f: file;
  164. begin
  165.   GetMem(p, Sizeof(TConfigInfo));
  166.   AssignFile(f, ConfigFile);
  167.   Rewrite(f, 1);
  168.   if IOResult <> 0 then
  169.   begin
  170.     ShowMessage('创建配置信息文件失败!');
  171.     FreeMem(p, Sizeof(TConfigInfo));
  172.     Exit;
  173.   end;
  174.   FillChar(p^, Sizeof(TConfigInfo), 0);
  175.   p^.Flags := 'NET-IP-PHONE-CONFIG';
  176.   p^.DelayTime := SbDelayTime.Position;
  177.   p^.Port := EdListenPort.Text;
  178.   p^.ListenSocks := CkSocks.Checked;
  179.   p^.ListenHttp := CkHttp.Checked;
  180.   p^.ListenSocks4 := RbSocks4.Checked;
  181.   p^.ListenSocksIP := EdSocksIP.Text;
  182.   p^.ListenSocksUser := EdSocksUser.Text;
  183.   p^.ListenHttpIP := EdHttpIP.Text;
  184.   p^.ListenHttpUser := EdHttpUser.Text;
  185.   p^.CallSocks := FormCall.CkSocks.Checked;
  186.   p^.CallHttp := FormCall.CkHttp.Checked;
  187.   p^.CallSocks4 := FormCall.RbSocks4.Checked;
  188.   p^.CallSocksIP := FormCall.EdSocksIP.Text;
  189.   p^.CallSocksUser := FormCall.EdSocksUser.Text;
  190.   p^.CallHttpIP := FormCall.EdHttpIP.Text;
  191.   p^.CallHttpUser := FormCall.EdHttpUser.Text;
  192.   BlockWrite(f, p^, Sizeof(TConfigInfo));
  193.   if IOResult <> 0 then ShowMessage('配置信息保存失败!')
  194.   else ShowMessage('配置信息成功保存到文件' + ConfigFile);
  195.   CloseFile(f);
  196.   FreeMem(p, Sizeof(TConfigInfo));
  197. end;
  198. procedure TFormMain.FormCreate(Sender: TObject);
  199. begin
  200.   IsOpen := False;
  201.   IsBusy := False;
  202.   Sock := nil;
  203.   Listen := nil;
  204.   Recv := nil;
  205.   Send := nil;
  206.   UpdateButtons;
  207.   FormCall := TFormCall.Create(nil);
  208.   FormSelIP := TFormSelIP.Create(nil);  
  209.   LoadConfigInfo;
  210.   if FileExists(SocksProxyFile) then EdSocksIP.Items.LoadFromFile(SocksProxyFile);
  211.   if FileExists(HttpProxyFile) then EdHttpIP.Items.LoadFromFile(HttpProxyFile);
  212. end;
  213. procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
  214. begin
  215.   ATimer.Enabled := False;
  216.   CloseAudioIn;
  217.   CloseAudioOut;
  218.   if Assigned(Listen) then Listen.Terminate;
  219.   if Assigned(Recv) then TerminateThread(Recv);
  220.   if Assigned(Send) then TerminateThread(Send);
  221.   FormCall.Free;
  222.   FormSelIP.Free;
  223.   if Assigned(Sock) then Sock.Free;
  224.   Action := caFree;
  225. end;
  226. procedure TFormMain.UpdateButtons;
  227. begin
  228.   BtOpen.Enabled := not IsOpen;
  229.   BtCall.Enabled := not IsBusy;
  230.   BtClose.Enabled := IsOpen;
  231.   BtStop.Enabled := IsBusy;
  232. end;
  233. procedure TFormMain.BtOpenClick(Sender: TObject);
  234. var ip, port: string;
  235. begin
  236.   IsOpen := True;
  237.   UpdateButtons;
  238.   Listen := TAudioListenThread.Create(Handle, EdListenPort.Text);
  239.   with Listen.Socket do
  240.   begin
  241.     SocksIP := '';
  242.     SocksPort := '';
  243.     SocksUsername := '';
  244.     SocksPassword := '';
  245.     SocksTimeout := 60000;
  246.     SocksType := ST_Socks4;
  247.     HTTPTunnelIP := '';
  248.     HTTPTunnelPort := '';
  249.     HTTPTunnelUser := '';
  250.     HTTPTunnelPass := '';
  251.     HTTPTunnelTimeout := 60000;
  252.     if CkSocks.Checked then
  253.     begin
  254.       ParseIpPort(EdSocksIP.Text, ip, port);
  255.       SocksIP := ip;
  256.       SocksPort := port;
  257.       SocksUsername := EdSocksUser.Text;
  258.       SocksPassword := EdSocksPass.Text;
  259.       if RbSocks5.Checked then SocksType := ST_Socks5;
  260.     end;
  261.     if CkHttp.Checked then
  262.     begin
  263.       ParseIpPort(EdHttpIP.Text, ip, port);
  264.       HTTPTunnelIP := ip;
  265.       HTTPTunnelPort := port;
  266.       HTTPTunnelUser := EdHttpUser.Text;
  267.       HTTPTunnelPass := EdHttpPass.Text;
  268.     end;
  269.   end;
  270.   Listen.Resume;
  271. end;
  272. procedure TFormMain.BtCloseClick(Sender: TObject);
  273. begin
  274.   if Assigned(Listen) then
  275.   begin
  276.     BtClose.Enabled := False;
  277.     Listen.Terminate;
  278.   end;
  279. end;
  280. procedure TFormMain.BtCallClick(Sender: TObject);
  281. var ip, port: string;
  282. begin
  283.   if FormCall.ShowModal <> mrOk then Exit;
  284.   with FormCall do 
  285.   begin
  286.     IsBusy := True;
  287.     UpdateButtons;
  288.     Sock := TDblProxyTcpSocket.Create; 
  289.     Sock.SocksIP := '';
  290.     Sock.SocksPort := '';
  291.     Sock.SocksUsername := '';
  292.     Sock.SocksPassword := '';
  293.     Sock.SocksTimeout := 30000;
  294.     Sock.SocksType := ST_Socks4;
  295.     Sock.HTTPTunnelIP := '';
  296.     Sock.HTTPTunnelPort := '';
  297.     Sock.HTTPTunnelUser := '';
  298.     Sock.HTTPTunnelPass := '';
  299.     Sock.HTTPTunnelTimeout := 30000;
  300.     if CkSocks.Checked then
  301.     begin
  302.       ParseIpPort(EdSocksIP.Text, ip, port);
  303.       Sock.SocksIP := ip;
  304.       Sock.SocksPort := port;
  305.       Sock.SocksUsername := EdSocksUser.Text;
  306.       Sock.SocksPassword := EdSocksPass.Text;
  307.       if RbSocks5.Checked then Sock.SocksType := ST_Socks5;
  308.     end;
  309.     if CkHttp.Checked then
  310.     begin
  311.       ParseIpPort(EdHttpIP.Text, ip, port);
  312.       Sock.HTTPTunnelIP := ip;
  313.       Sock.HTTPTunnelPort := port;
  314.       Sock.HTTPTunnelUser := EdHttpUser.Text;
  315.       Sock.HTTPTunnelPass := EdHttpPass.Text;
  316.     end;
  317.     ParseIpPort(EdIP.Text, ip, port);
  318.   end;
  319.   Recv := TAudioRecvThread.Create(Handle, Sock, tfDoConnect);
  320.   Recv.Host := ip;
  321.   Recv.Port := port;
  322.   Recv.SpeakerOpen := CkSpeaker.Checked;
  323.   Recv.Resume;
  324. end;
  325. procedure TFormMain.BtStopClick(Sender: TObject);
  326. begin
  327.   BtStop.Enabled := False;
  328.   CloseAudioIn;
  329.   CloseAudioOut;
  330.   if Assigned(Recv) then TerminateThread(Recv);
  331.   if Assigned(Send) then TerminateThread(Send);
  332.   if Assigned(Sock) then Sock.CloseSocket;
  333. end;
  334. procedure TFormMain.OnConnected(var ms: TMessage);
  335. begin
  336.   ATimer.Enabled := True;
  337.   StatusBar.Panels[1].Text := '通话中...';
  338.   LbCaller.Caption := '对方IP: ' + Sock.GetRemoteSinIP + ':' + IntToStr(Sock.GetRemoteSinPort);
  339.   Send := TAudioSendThread.Create(Handle, Sock, tfDoNothing);
  340.   Send.PhoneOpen := CkPhone.Checked;
  341.   Send.Resume;
  342.   OpenAudioIn(Send.ThreadID);
  343.   if AudioInOpened then StartAudioIn else ShowMessage('打开语音输入设备失败!');
  344.   OpenAudioOut(Recv.ThreadID);
  345.   if AudioOutOpened then StartAudioOut else ShowMessage('打开语音输出设备失败!');
  346. end;
  347. procedure TFormMain.OnClientConnect(var ms: TMessage);
  348. var s: TDblProxyTcpSocket;
  349.     t: TAudioRecvThread;
  350. begin
  351.   s := TDblProxyTcpSocket.Create;
  352.   s.Socket := ms.WParam;
  353.   s.GetSins;
  354.   if IsBusy then
  355.   begin
  356.     t := TAudioRecvThread.Create(Handle, s, tfDoBusy);
  357.     t.Resume;
  358.   end
  359.   else begin
  360.     IsBusy := True;
  361.     UpdateButtons;
  362.     if MessageDlg('是否接听来电? ' + s.GetRemoteSinIP + ':' + IntToStr(s.GetRemoteSinPort),
  363.       mtConfirmation, [mbYes,mbNo], 0) = mrYes then
  364.     begin
  365.       Sock := s;
  366.       Recv := TAudioRecvThread.Create(Handle, s, tfDoAgree);
  367.       Recv.SpeakerOpen := CkSpeaker.Checked;
  368.       Recv.Resume;
  369.     end
  370.     else begin
  371.       t := TAudioRecvThread.Create(Handle, s, tfDoRefuse);
  372.       t.Resume;
  373.       IsBusy := False;
  374.       UpdateButtons;
  375.     end;
  376.   end;
  377. end;
  378. procedure TFormMain.OnStateMessage(var ms: TMessage);
  379. var s: string;
  380. begin
  381.   case ms.WParam of
  382.     mtListenStart: StatusBar.Panels[0].Text := '正在开机...';
  383.     mtListening:
  384.     begin
  385.       StatusBar.Panels[0].Text := '已开机';
  386.       s := Listen.Socket.GetLocalSinIP;
  387.       if s <> cAnyHost then
  388.         LbMyIP.Caption := '我的IP: ' + s + ':' + IntToStr(Listen.Socket.GetLocalSinPort)
  389.       else LbMyIP.Caption := '我的IP: 所有本机地址:' + IntToStr(Listen.Socket.GetLocalSinPort);
  390.     end;
  391.     mtListenFail:
  392.     begin
  393.       DoListenFinal;
  394.       ShowMessage('开机失败!');
  395.     end;
  396.     mtListenClose: DoListenFinal;
  397.     mtConnecting: StatusBar.Panels[1].Text := '正在连接...';
  398.     mtConnectFail:
  399.     begin
  400.       Recv := nil;
  401.       DoCallFinal;
  402.       ShowMessage('连接失败!');
  403.     end;
  404.     mtRecvFail, mtRecvClose:
  405.     begin
  406.       Recv := nil;
  407.       if Assigned(Send) then TerminateThread(Send)
  408.       else DoCallFinal;
  409.     end;
  410.     mtSendFail, mtSendClose:
  411.     begin
  412.       Send := nil;
  413.       if Assigned(Recv) then TerminateThread(Recv)
  414.       else DoCallFinal;
  415.     end;
  416.     mtRefused:
  417.     begin
  418.       DoCallFinal;
  419.       ShowMessage('对不起,对方拒绝了你的电话!');
  420.     end;
  421.     mtInvConnect: DoCallFinal;
  422.     mtMustSelIP: with FormSelIP do
  423.     begin
  424.       LsAllIP.Items.Assign(TStringList(ms.LParam));
  425.       LsAllIP.ItemIndex := 0;
  426.       LbMySelIP.Caption := '我的选择是: ' + LsAllIP.Items[LsAllIP.ItemIndex];
  427.       if ShowModal = mrOk then
  428.       begin
  429.         if CkAll.Checked then Listen.IPIndex := LsAllIP.Count
  430.         else Listen.IPIndex := LsAllIP.ItemIndex;
  431.       end
  432.       else Listen.IPIndex := -1;
  433.     end;
  434.     mtPeerBusy:
  435.     begin
  436.       DoCallFinal;
  437.       ShowMessage('对方忙,请稍后再拨!');
  438.     end;
  439.   end;
  440. end;
  441. procedure TFormMain.DoCallFinal;
  442. begin
  443.   CloseAudioIn;
  444.   CloseAudioOut;
  445.   ATimer.Enabled := False;
  446.   Sock.Free;
  447.   Sock := nil;
  448.   IsBusy := False;
  449.   UpdateButtons;
  450.   StatusBar.Panels[1].Text := '没有连接';
  451.   LbCaller.Caption := '对方IP: 无';
  452. end;
  453. procedure TFormMain.DoListenFinal;
  454. begin
  455.   Listen := nil;
  456.   IsOpen := False;
  457.   UpdateButtons;
  458.   StatusBar.Panels[0].Text := '就绪';
  459.   LbMyIP.Caption := '我的IP: 无';
  460. end;
  461. procedure TFormMain.ATimerTimer(Sender: TObject);
  462. begin
  463.   if Assigned(Sock) then
  464.   begin
  465.     StatusBar.Panels[2].Text := '收到: ' + IntToStr(Sock.RecvCounter)
  466.       + '    发送: ' + IntToStr(Sock.SendCounter);
  467.   end;
  468. end;
  469. procedure TFormMain.SbDelayTimeChange(Sender: TObject);
  470. begin
  471.   SetDelayTime(sbDelayTime.Position);
  472.   LbDelayTime.Caption := '延时 ' + FloatToStr(0.1 * SbDelayTime.Position) + '秒'; 
  473. end;
  474. procedure TFormMain.CkPhoneClick(Sender: TObject);
  475. begin
  476.   if Assigned(Send) then Send.PhoneOpen := CkPhone.Checked;
  477. end;
  478. procedure TFormMain.CkSpeakerClick(Sender: TObject);
  479. begin
  480.   if Assigned(Recv) then Recv.SpeakerOpen := ckSpeaker.Checked;
  481. end;
  482. procedure TFormMain.BtSaveSetupClick(Sender: TObject);
  483. begin
  484.   SaveConfigInfo;
  485.   if EdSocksIP.Items.Count > 0 then EdSocksIP.Items.SaveToFile(SocksProxyFile);
  486.   if EdHttpIP.Items.Count > 0 then EdHttpIP.Items.SaveToFile(HttpProxyFile);
  487.   if FormCall.EdIP.Items.Count > 0 then FormCall.EdIP.Items.SaveToFile(HistoryCall);
  488. end;
  489. procedure TFormMain.MnDisplayClick(Sender: TObject);
  490. begin
  491.   Show;
  492. end;
  493. procedure TFormMain.MnHideClick(Sender: TObject);
  494. begin
  495.   Hide;
  496. end;
  497. procedure TFormMain.MnExitClick(Sender: TObject);
  498. begin
  499.   TrayIcon.Active := False;
  500.   Close;
  501. end;
  502. end.