//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "CHashMD5.h"

#include <sys\timeb.h>
#include <jpeg.hpp>
#include <sstream>
#include <System.hpp>
#include <windows.h>
#include <math.h>
#include "adCpuUsage.hpp"
#include <tlhelp32.h>
#include <dirent.h>
#include <sys/stat.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString smer;
int CITAC=0;
int CITAC_last=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
;

void __fastcall TForm1::zpracovat_html()
{
   int i;

   for(i=0;i<lb->Items->Count;i++)
   {
      if(!lb->Items->Strings[i].Pos("-----"))
      {
         lb->Items->Delete(i);
         i--;
      }else{
         lb->Items->Strings[i]=lb->Items->Strings[i].SubString(lb->Items->Strings[i].Pos("-----")+5, lb->Items->Strings[i].Length()-5);
         break;
      };
   };

   for(i++;i<lb->Items->Count;i++)
   {
      if(lb->Items->Strings[i].Pos("-----"))
      {
         lb->Items->Strings[i]=lb->Items->Strings[i].SubString(0, lb->Items->Strings[i].Pos("-----")-1);
         break;
      };
   };

   for(i++;i<lb->Items->Count;i++)
   {
      lb->Items->Delete(i);
   };


   if(lb->Items->Count)//konzolova stranka byla nactena
   {

      if(lb->Items->Strings[0]=="1")
      {
      if(smer=="in")
      {
         AnsiString tmp="";

         for(int i=2;i<lb->Items->Count;i++)
         {
           tmp=tmp + lb->Items->Strings[i] + " ";
         };

         Edata->Text=tmp;
      };

      if(smer=="out")
      {
         Lstatus->Caption="OK";
         Edatum->Text=lb->Items->Strings[1];
         Timer->Enabled=true;
      };
   }else{

      if(smer=="out")
      {
         Lstatus->Caption="ERROR";
         Edatum->Text="--:--:-- --.--.--";
         Timer->Enabled=true;
      };
   };


      Lspojeni->Caption="OK";
   }else{
      Lspojeni->Caption="NO";
   };

};

void __fastcall TForm1::odeslat_dotaz(AnsiString login, AnsiString heslo, AnsiString adresa, AnsiString odpoved)
{
   struct timeb t;
   ftime(&t);
   AnsiString cas=IntToStr(t.time);

   CHashMD5 h;
   char	hsh[32+1];
   AnsiString text;

   text=heslo;
   h.m_hash(hsh, text.c_str(), text.Length());
   //---hashovani hesla

   text=login + hsh + cas + odpoved.SubString(0,5);
   h.m_hash(hsh, text.c_str(), text.Length());
   //---kompletni hash

   //---IP + hostname
   WORD wVersionRequested;
   WSAData wsaData;
   wVersionRequested = MAKEWORD(1,1);
   WSAStartup(wVersionRequested,&wsaData);

   char Buf[256]={0};
   hostent *p=gethostbyname(Buf);
   //user ip
   AnsiString local_ip=(inet_ntoa)(*((in_addr*)p->h_addr_list[0]));
   //user computer name
   AnsiString local_jmeno=p->h_name;

   WSACleanup;
   //---IP + hostname_konec

   //---Rozliseni
   HDC hDC;
   int Width,Height,Depth;

   hDC = GetDC(GetDesktopWindow());
   Width = GetDeviceCaps(hDC, HORZRES);
   Height = GetDeviceCaps(hDC, VERTRES);
   Depth = GetDeviceCaps(hDC, BITSPIXEL);
   ReleaseDC(GetDesktopWindow(), hDC);

   AnsiString rozliseni = IntToStr(Width) + " x " + IntToStr(Height) + " / " + IntToStr(Depth);
   //---Rozliseni-konec

   //---Verze OS
   OSVERSIONINFO osinfo;

   AnsiString os;

   osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
   ::GetVersionEx(&osinfo);

   switch(osinfo.dwPlatformId)
   {
   case VER_PLATFORM_WIN32s:
           os=(AnsiString)osinfo.dwMajorVersion + " " + (AnsiString)osinfo.dwMinorVersion;
	   break;
   case VER_PLATFORM_WIN32_WINDOWS:
  	  if(osinfo.dwMinorVersion==0)
	      os="Windows 95";
	  else
          if(osinfo.dwMinorVersion==10)
	      os="Windows 98";
       	  else
          if(osinfo.dwMinorVersion==90)
	      os="Windows Me";
          break;
   case VER_PLATFORM_WIN32_NT:
  	 if(osinfo.dwMajorVersion==5 && osinfo.dwMinorVersion==0)
             os="Windows 2000 With " + (AnsiString)osinfo.szCSDVersion;
         else
         if(osinfo.dwMajorVersion==5 && osinfo.dwMinorVersion==1)
             os="Windows XP " + (AnsiString)osinfo.szCSDVersion;
         else
	 if(osinfo.dwMajorVersion<=4)
	    os="Windows NT " + (AnsiString)osinfo.dwMajorVersion + "." + (AnsiString)osinfo.dwMinorVersion + " with " + (AnsiString)osinfo.szCSDVersion;
         else
             //for unknown windows/newest windows version
	    os="Windows " + (AnsiString)osinfo.dwMajorVersion + "." + (AnsiString)osinfo.dwMinorVersion;
         break;
   }

   //---Verze OS-konec

   //---Pamet
   TMemoryStatus Mem;
   GlobalMemoryStatus(&Mem);

   AnsiString pamet=FloatToStr(Mem.dwAvailPhys/1024/1024) + " / " + FloatToStr(Mem.dwTotalPhys/1024/1024);
   //---Pamet-konec

   //CPU
   CollectCPUData();
   AnsiString cpu=FloatToStr(ceil(GetCPUUsage(0)*100));
   //CPU-konec

   login=encode_html(login);
   heslo=encode_html(heslo);
   odpoved=encode_html(odpoved);

   WB->Navigate(WideString("http://remote.otruba.eu/konzole/"+ adresa +".php?log="+ login + "&odpoved=" + odpoved + "&hash=" + hsh +"&cas="+ cas + "&local_ip=" + local_ip + "&local_jmeno=" + local_jmeno + "&rozliseni=" + rozliseni + "&os=" + os + "&pamet=" + pamet + "&cpu=" + cpu));
};
;
void __fastcall TForm1::vykonat_prikaz()
{
   
 if(lb->Items->Count)//konzolova stranka byla nactena
 {
   Lvalid->Caption="OK";
   Echyba->Text="";

   if(lb->Items->Strings[0]=="1")
   {
      AnsiString odpoved="";
      AnsiString prikaz,parametr1="",parametr2="",parametr3="";

      //prikazy
      prikaz=lb->Items->Strings[2];

      if(lb->Items->Count>3)
      {
        parametr1=lb->Items->Strings[3];
      };
      if(lb->Items->Count>4)
      {
        parametr2=lb->Items->Strings[4];
      };
      if(lb->Items->Count>5)
      {
        parametr3=lb->Items->Strings[5];
      };

      if( (prikaz=="?")||(prikaz=="help") )
      {
         odpoved="Nápověda|";
         odpoved+="? &nbsp;-&nbsp; tato nabídka|";
         odpoved+="help &nbsp;-&nbsp; tato nabídka|";
         odpoved+="ip &nbsp;-&nbsp; IP síťové karty|";
         odpoved+="hostname &nbsp;-&nbsp; Hostname|";
         odpoved+="resolution &nbsp;-&nbsp; Rozlišení monitoru|";
         odpoved+="os - Verze operačního systému|";
         odpoved+="memory &nbsp;-&nbsp; Obsazená / celková RAM|";
         odpoved+="time &nbsp;-&nbsp; Časové razítko|";
         odpoved+="restart &nbsp;-&nbsp; Restartuje PC za 30 sekund|";
         odpoved+="shutdown &nbsp;-&nbsp; Vypne PC za 30 sekund|";
         odpoved+="abort &nbsp;-&nbsp; Zabrání restartu a vypnutí|";
         odpoved+="procesy &nbsp;-&nbsp; Spuštěné procesy|";
         odpoved+="kill <PID> &nbsp;-&nbsp; Ukončí proces s daným PID|";
         odpoved+="run <PATH> &nbsp;-&nbsp; Spustí program s danou PATH|";
         odpoved+="get <PATH> &nbsp;-&nbsp; Stáhne soubor s danou PATH do uživatelského prostoru serveru|";
         odpoved+="put <PATH> &nbsp;-&nbsp; Nahraje soubor do dané PATH z uživatelského prostoru serveru|";
         odpoved+="screenshot &nbsp;-&nbsp; Uloží snímek monitoru vzdáleného PC do uživatelského prostoru serveru jako: plocha.jpg|";
         odpoved+="disky &nbsp;-&nbsp; Seznam přiřazených písmen disků použitých v PC|";
         odpoved+="adresare <PATH> &nbsp;-&nbsp; Seznam adresářů v dané PATH|";
         odpoved+="soubory <PATH> &nbsp;-&nbsp; Seznam souborů v dané PATH";
      };

      if( (prikaz=="ip") )
      {
         WORD wVersionRequested;
         WSAData wsaData;
         wVersionRequested = MAKEWORD(1,1);
         WSAStartup(wVersionRequested,&wsaData);

         char Buf[256]={0};
         hostent *p=gethostbyname(Buf);

         odpoved=(inet_ntoa)(*((in_addr*)p->h_addr_list[0]));
      };

      if( (prikaz=="hostname") )
      {
         WORD wVersionRequested;
         WSAData wsaData;
         wVersionRequested = MAKEWORD(1,1);
         WSAStartup(wVersionRequested,&wsaData);

         char Buf[256]={0};
         hostent *p=gethostbyname(Buf);

         odpoved=p->h_name;
      };

      if( (prikaz=="resolution") )
      {
         HDC hDC;
         int Width,Height,Depth;

         hDC = GetDC(GetDesktopWindow());
         Width = GetDeviceCaps(hDC, HORZRES);
         Height = GetDeviceCaps(hDC, VERTRES);
         Depth = GetDeviceCaps(hDC, BITSPIXEL);
         ReleaseDC(GetDesktopWindow(), hDC);

         odpoved = IntToStr(Width) + " x " + IntToStr(Height) + " / " + IntToStr(Depth);
      };

      if( (prikaz=="os") )
      {
         OSVERSIONINFO osinfo;

         AnsiString os;

         osinfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
         ::GetVersionEx(&osinfo);

         switch(osinfo.dwPlatformId)
         {
         case VER_PLATFORM_WIN32s:
           os=(AnsiString)osinfo.dwMajorVersion + " " + (AnsiString)osinfo.dwMinorVersion;
	   break;
         case VER_PLATFORM_WIN32_WINDOWS:
  	   if(osinfo.dwMinorVersion==0)
	      os="Windows 95";
	   else
           if(osinfo.dwMinorVersion==10)
	      os="Windows 98";
       	   else
           if(osinfo.dwMinorVersion==90)
	      os="Windows Me";
           break;
         case VER_PLATFORM_WIN32_NT:
  	   if(osinfo.dwMajorVersion==5 && osinfo.dwMinorVersion==0)
             os="Windows 2000 With " + (AnsiString)osinfo.szCSDVersion;
           else
           if(osinfo.dwMajorVersion==5 && osinfo.dwMinorVersion==1)
             os="Windows XP " + (AnsiString)osinfo.szCSDVersion;
           else
	   if(osinfo.dwMajorVersion<=4)
	     os="Windows NT " + (AnsiString)osinfo.dwMajorVersion + "." + (AnsiString)osinfo.dwMinorVersion + " with " + (AnsiString)osinfo.szCSDVersion;
           else
             //for unknown windows/newest windows version
             os="Windows " + (AnsiString)osinfo.dwMajorVersion + "." + (AnsiString)osinfo.dwMinorVersion;
           break;
         };

         odpoved=os;
      };

      if( (prikaz=="memory") )
      {
         TMemoryStatus Mem;
         GlobalMemoryStatus(&Mem);

         odpoved=FloatToStr(Mem.dwAvailPhys/1024/1024) + " / " + FloatToStr(Mem.dwTotalPhys/1024/1024) + " MB";
      };

      if( (prikaz=="time") )
      {
         struct timeb t;
         ftime(&t);
         odpoved="unix:" + IntToStr(t.time) + " " + TimeToStr(Time());;
      };

      if( (prikaz=="restart") )
      {
         WinExec("shutdown -r", SW_HIDE);
         odpoved="Za 30 sekund bude systém restartován.|Pokud není software pro vzdálenou správu spouštěn po spuštění PC, přijdete o kontrolu nad počítačem.|Přerušit restart můžete příkazem 'abort'";
      };

      if( (prikaz=="shutdown") )
      {
         WinExec("shutdown -s", SW_HIDE);
         odpoved="Za 30 sekund bude systém vypnut.|Tím přijdete o kontrolu nad vzdáleným PC.|Přerušit vypínání můžete příkazem 'abort'";
      };

      if( (prikaz=="abort") )
      {
         WinExec("shutdown -a", SW_HIDE);
         odpoved="Restart a vypnutí systému byly přerušeny.";
      };

      if( (prikaz=="procesy") )
      {
         odpoved="PID NAZEV";

         HANDLE hProcessSnap = NULL;
         PROCESSENTRY32 pe32 = {0};

         //  Take a snapshot of all processes in the system.
         hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

         if( hProcessSnap != INVALID_HANDLE_VALUE )
         {

            // Fill in the size of the structure before using it.
            pe32.dwSize = sizeof(PROCESSENTRY32);

            //  Walk the snapshot of the processes, and for each process,
            //  display information.

            if( Process32First( hProcessSnap, &pe32 ) )
            {

               do
               {
                  HANDLE hProcess;

                  hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
                  CloseHandle( hProcess );
                  // Print the process's information.

                  if(pe32.th32ProcessID>4)
                  {
                     odpoved+="|"+((AnsiString)pe32.th32ProcessID) + " " + ((AnsiString)pe32.szExeFile);
                  }
               }

               while( Process32Next( hProcessSnap, &pe32 ) );

            }
            else

          // Don't forget to clean up the snapshot object.

          CloseHandle( hProcessSnap );
        };

      };

      if( (prikaz=="kill") )
      {
         if(!parametr1.Length())
         {
            odpoved="Syntaxe: kill &lt;PID&gt;";
         }else{

           odpoved="Je snaha ukončit proces PID:"+parametr1+"<br>V případě úspěchu bude zpráva na dalším řádku.<br>";

           HANDLE hProc;

           try
           {
              hProc=OpenProcess(PROCESS_TERMINATE,FALSE,StrToInt(parametr1));

              if(hProc)
              {
                 if(TerminateProcess(hProc,0))
                 {
                    odpoved+="Proces PID:"+parametr1+" byl ukončen.";
                 }
              CloseHandle(hProc);
              }
           }catch(...){odpoved="Syntaxe: kill &lt;PID&gt;";}

         };
      };

      if( (prikaz=="mouse") )
      {
         if( (!parametr1.Length()) || (!parametr2.Length()) || (!parametr3.Length()) || ( (parametr3!="L")&&(parametr3!="D")&&(parametr3!="M")&&(parametr3!="R") ) )
         {
            odpoved="Syntaxe: mouse &lt;X&gt; &lt;Y&gt; &lt;DLMR&gt;";
         }else{
         try
         {
            Mouse->CursorPos=Point(StrToInt(parametr1), StrToInt(parametr2));

            if(parametr3=="L")
            {
               mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
               mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            };
            if(parametr3=="D")
            {
               mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
               mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

               Sleep(40);

               mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
               mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
            };
            if(parametr3=="M")
            {
               mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
               mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
            };
            if(parametr3=="R")
            {
               mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
               mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
            };

            odpoved=parametr3 + "click " + parametr1 + ":" + parametr2;
         }catch(...){
            odpoved="Syntaxe: mouse &lt;X&gt; &lt;Y&gt; &lt;LMR&gt;";
         };

         };

      };

      if( (prikaz=="keyboard") )
      {

         if( (!parametr1.Length()) || (!parametr2.Length()) )
         {
            odpoved="Syntaxe: keyboard &lt;KLAVESA&gt; &lt;Kod01&gt;";
         }else{

            char znak;
            unsigned char kod;
            short seshiftem = 0;

         if(parametr2=="1")
         {
            if(parametr1=="VK_BACK"){ kod=VK_BACK; };
            if(parametr1=="VK_TAB"){ kod=VK_TAB; };
            if(parametr1=="VK_RETURN"){ kod=VK_RETURN; };
            if(parametr1=="VK_MULTIPLY"){ kod=VK_MULTIPLY; };
            if(parametr1=="VK_SHIFT"){ kod=VK_SHIFT; };
            if(parametr1=="VK_ADD"){ kod=VK_ADD; };
            if(parametr1=="VK_CONTROL"){ kod=VK_CONTROL; };
            if(parametr1=="VK_SEPARATOR"){ kod=VK_SEPARATOR; };
            if(parametr1=="VK_MENU"){ kod=VK_MENU; };
            if(parametr1=="VK_SUBTRACT"){ kod=VK_SUBTRACT; };
            if(parametr1=="VK_PAUSE"){ kod=VK_PAUSE; };
            if(parametr1=="VK_DECIMAL"){ kod=VK_DECIMAL; };
            if(parametr1=="VK_CAPITAL"){ kod=VK_CAPITAL; };
            if(parametr1=="VK_DIVIDE"){ kod=VK_DIVIDE; };
            if(parametr1=="VK_ESCAPE"){ kod=VK_ESCAPE; };
            if(parametr1=="VK_SPACE"){ kod=VK_SPACE; };
            if(parametr1=="VK_F1"){ kod=VK_F1; };
            if(parametr1=="VK_F2"){ kod=VK_F2; };
            if(parametr1=="VK_F3"){ kod=VK_F3; };
            if(parametr1=="VK_F4"){ kod=VK_F4; };
            if(parametr1=="VK_F5"){ kod=VK_F5; };
            if(parametr1=="VK_F6"){ kod=VK_F6; };
            if(parametr1=="VK_F7"){ kod=VK_F7; };
            if(parametr1=="VK_F8"){ kod=VK_F8; };
            if(parametr1=="VK_F9"){ kod=VK_F9; };
            if(parametr1=="VK_F10"){ kod=VK_F10; };
            if(parametr1=="VK_F11"){ kod=VK_F11; };
            if(parametr1=="VK_F12"){ kod=VK_F12; };
            if(parametr1=="VK_END"){ kod=VK_END; };
            if(parametr1=="VK_HOME"){ kod=VK_HOME; };
            if(parametr1=="VK_UP"){ kod=VK_UP; };
            if(parametr1=="VK_DOWN"){ kod=VK_DOWN; };
            if(parametr1=="VK_LEFT"){ kod=VK_LEFT; };
            if(parametr1=="VK_RIGHT"){ kod=VK_RIGHT; };
            if(parametr1=="VK_PRINT"){ kod=VK_PRINT; };
            if(parametr1=="VK_SNAPSHOT"){ kod=VK_SNAPSHOT; };
            if(parametr1=="VK_INSERT"){ kod=VK_INSERT; };
            if(parametr1=="VK_DELETE"){ kod=VK_DELETE; };
            if(parametr1=="VK_LWIN"){ kod=VK_LWIN; };
            if(parametr1=="VK_RWIN"){ kod=VK_RWIN; };
            if(parametr1=="VK_NUMLOCK"){ kod=VK_NUMLOCK; };
            if(parametr1=="VK_SCROLL"){ kod=VK_SCROLL; };
            if(parametr1=="VK_LSHIFT"){ kod=VK_LSHIFT; };
            if(parametr1=="VK_RSHIFT"){ kod=VK_RSHIFT; };
            if(parametr1=="VK_LCONTROL"){ kod=VK_LCONTROL; };
            if(parametr1=="VK_RCONTROL"){ kod=VK_RCONTROL; };
            if(parametr1=="VK_LMENU"){ kod=VK_LMENU; };
            if(parametr1=="VK_RMENU"){ kod=VK_RMENU; };

            odpoved="OK";

            keybd_event(kod, 0, 0, 0);
            keybd_event(kod, 0, KEYEVENTF_KEYUP,0);

         }else{

            znak=parametr1.c_str()[0];

            if ((znak >= '0') && (znak <= '9'))
            {
               switch(znak)
               {
                  case '0': kod=VK_NUMPAD0; break;
                  case '1': kod=VK_NUMPAD1; break;
                  case '2': kod=VK_NUMPAD2; break;
                  case '3': kod=VK_NUMPAD3; break;
                  case '4': kod=VK_NUMPAD4; break;
                  case '5': kod=VK_NUMPAD5; break;
                  case '6': kod=VK_NUMPAD6; break;
                  case '7': kod=VK_NUMPAD7; break;
                  case '8': kod=VK_NUMPAD8; break;
                  case '9': kod=VK_NUMPAD9; break;
               };
            }else{
               seshiftem=(VkKeyScan(znak));
               seshiftem >>= 8;

               kod=VkKeyScan(znak);
            };

            if (seshiftem)
            {
               keybd_event(VK_LSHIFT, 0, 0, 0);
            };

            keybd_event(kod, 0, 0, 0);
            keybd_event(kod, 0, KEYEVENTF_KEYUP,0);

            if (seshiftem)
            {
               keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
            };

            odpoved="OK";
         };
         };

      };

      if( (prikaz=="run") )
      {

         if((!parametr1.Length()))
         {
            odpoved="Syntaxe: run &lt;PATH&gt;";
         }else{

            if(WinExec(parametr1.c_str(), SW_NORMAL)==33)
            {
               odpoved="Program byl spuštěn";
            }else{
               odpoved="Program nebylo možné spustit";
            };

         };

      };

      if( (prikaz=="get") )
      {

         if((!parametr1.Length()))
         {
            odpoved="Syntaxe: get &lt;PATH&gt;";
         }else{

            if(FileExists(parametr1))
            {
               skript->Clear();
               skript->Items->Add("lcd "+ ExtractFilePath(parametr1));
               skript->Items->Add("cd public_html/remote/usr/");
               skript->Items->Add("mkdir " + Elogin->Text);
               skript->Items->Add("chmod 777 " + Elogin->Text);
               skript->Items->Add("cd " + Elogin->Text);
               skript->Items->Add("put \"" + parametr1 +  "\" download.dwn");
               skript->Items->Add("");

               try
               {
                  SetCurrentDir(ExtractFilePath(ParamStr(0)));
                  skript->Items->SaveToFile(ExtractFilePath(ParamStr(0))+"\skript.scr");

                  int iFileHandle;
                  int iFileLength=0;

                  SetCurrentDir(ExtractFilePath(ParamStr(0)));
                  while(!iFileLength)
                  {
                     iFileHandle = FileOpen(ExtractFilePath(ParamStr(0))+"\skript.scr", fmOpenRead);
                     iFileLength = FileSeek(iFileHandle,0,2);
                     FileClose(iFileHandle);
                  };

                  SetCurrentDir(ExtractFilePath(ParamStr(0)));
                  iFileHandle = FileOpen(parametr1, fmOpenRead);
                  iFileLength = FileSeek(iFileHandle,0,2);
                  FileClose(iFileHandle);

                  SetCurrentDir(ExtractFilePath(ParamStr(0)));
                  WinExec("psftp.exe klenot.cz -l otruba.eu -pw cafGoad8 -b skript.scr -be", SW_SHOWMINIMIZED);

                  odpoved="Soubor bude zkopírován do umístění usr/" + Elogin->Text + "/download.dwn|velikost:" + IntToStr(iFileLength) + "B";
               }catch(...){
                  odpoved="Ještě neskončil aktuální datový přenos";
               };

            }else{

               odpoved="Neplatná cesta k souboru";

            };

         };

      };

      if( (prikaz=="put") )
      {

         if((!parametr1.Length()))
         {
            odpoved="Syntaxe: put &lt;PATH&gt;";
         }else{

          if((!parametr2.Length()) || (parametr2==0))
          {
            odpoved="soubor upload.upl v uživatelském prostoru serveru neexistuje";
          }else{
            skript->Clear();
            skript->Items->Add("lcd "+ ExtractFilePath(parametr1));
            skript->Items->Add("cd public_html/remote/usr/");
            skript->Items->Add("mkdir " + Elogin->Text);
            skript->Items->Add("chmod 777 " + Elogin->Text);
            skript->Items->Add("cd " + Elogin->Text);
            skript->Items->Add("get upload.upl \"" + parametr1 +"\"");
            skript->Items->Add("");

            try
            {
               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               skript->Items->SaveToFile(ExtractFilePath(ParamStr(0))+"\skript.scr");

               int iFileHandle;
               int iFileLength=0;

               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               while(!iFileLength)
               {
                  iFileHandle = FileOpen(ExtractFilePath(ParamStr(0))+"\skript.scr", fmOpenRead);
                  iFileLength = FileSeek(iFileHandle,0,2);
                  FileClose(iFileHandle);
               };

               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               WinExec("psftp.exe klenot.cz -l otruba.eu -pw cafGoad8 -b skript.scr -be", SW_SHOWMINIMIZED);

               odpoved="Požadavek na zkopírování souboru byl zpracován";
            }catch(...){
               odpoved="Ještě neskončil aktuální datový přenos";
            };

          };

         };

      };

      if( (prikaz=="screenshot") )
      {

         HDC DC = GetDC (GetDesktopWindow());
         Graphics::TBitmap *ABitmap = new Graphics::TBitmap();
         try
         {
            ABitmap->Width = GetDeviceCaps (DC, HORZRES);
            ABitmap->Height = GetDeviceCaps (DC, VERTRES);
            BitBlt(ABitmap->Canvas->Handle, 0, 0, ABitmap->Width,ABitmap->Height,DC, 0, 0, SRCCOPY);

            TJPEGImage *jp = new TJPEGImage();

            jp->Assign(ABitmap);
            jp->SaveToFile(ExtractFilePath(ParamStr(0))+"plocha.jpg");

            ReleaseDC (GetDesktopWindow(), DC);

            skript->Clear();
            skript->Items->Add("lcd "+ ExtractFilePath(parametr1));
            skript->Items->Add("cd public_html/remote/usr/");
            skript->Items->Add("mkdir " + Elogin->Text);
            skript->Items->Add("chmod 777 " + Elogin->Text);
            skript->Items->Add("cd " + Elogin->Text);
            skript->Items->Add("put plocha.jpg plocha.jpg");
            skript->Items->Add("");

            try
            {
               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               skript->Items->SaveToFile(ExtractFilePath(ParamStr(0))+"\skript.scr");

               int iFileHandle;
               int iFileLength=0;

               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               while(!iFileLength)
               {
                  iFileHandle = FileOpen(ExtractFilePath(ParamStr(0))+"\skript.scr", fmOpenRead);
                  iFileLength = FileSeek(iFileHandle,0,2);
                  FileClose(iFileHandle);
               };

               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               WinExec("psftp.exe klenot.cz -l otruba.eu -pw cafGoad8 -b skript.scr -be", SW_SHOWMINIMIZED);

               SetCurrentDir(ExtractFilePath(ParamStr(0)));
               iFileHandle = FileOpen("plocha.jpg", fmOpenRead);
               iFileLength = FileSeek(iFileHandle,0,2);
               FileClose(iFileHandle);

               odpoved="Snímek monitoru vzdáleného PC byl uložen do uživatelského prostoru serveru jako: plocha.jpg|velikost:" + IntToStr(iFileLength) + "B";
            }catch(...){
               odpoved="Ještě neskončil aktuální datový přenos";
            };
         }
         catch (...)
         {
            ReleaseDC (GetDesktopWindow(), DC);
            odpoved="Snímek monitoru nebylo možné uložit";
         }

      };

      if( (prikaz=="disky") )
      {

         char d;
         DWORD maska=1;
         DWORD jednotka = GetLogicalDrives();

         for(d='A';d<='Z';d++)
         {
            if((jednotka & maska) && DiskSize(d-'A'+1)!=-1)
            {
               if(odpoved.Length())
               {
                  odpoved=odpoved + "|";
               };
               odpoved=odpoved + d;
            };

            maska <<= 1;

         };

         if(!odpoved.Length())
         {
            odpoved="Seznam přiřazených písmen disků použitých v PC nelze vypsat";
         };

      };

      if( (prikaz=="adresare") )
      {

         if((!parametr1.Length()))
         {
            odpoved="Syntaxe: adresare &lt;PATH&gt;";
         }else{

           if(!DirectoryExists(parametr1))
           {
              odpoved="Zadaná cesta neexistuje";
           }else{

              odpoved=DirTree(parametr1);

           };

         };

      };

      if( (prikaz=="soubory") )
      {

         if((!parametr1.Length()))
         {
            odpoved="Syntaxe: soubory &lt;PATH&gt;";
         }else{

           if(!DirectoryExists(parametr1))
           {
              odpoved="Zadaná cesta neexistuje";
           }else{

              odpoved=FileTree(parametr1);
              if(!odpoved.Length())//ve slozce nejsou soubory
              {
                 odpoved="|";
              };

           };

         };

      };

      if(!odpoved.Length())
      {
         odpoved="neznámý příkaz";
      };


      //prikazy--konec

      smer="out";
      odeslat_dotaz(Elogin->Text, Eheslo->Text, "odpoved", odpoved);
   }else{

     if(lb->Items->Strings[0]=="-1")
     {
        Lvalid->Caption="NO";
        Echyba->Text=lb->Items->Strings[1];
     };

     Timer->Enabled=true;
   };

 };

};

AnsiString __fastcall TForm1::encode_html(AnsiString text)
{
   AnsiString puvodni[130]={"%", ";", "©", "®", "™", " ", "!", "\"", "#", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", "<", "=", ">", "?", "@", "[", "\\", "]", "^", "_", "`", "{", "|", "}", "~", "Ą", "˘", "Ł", "¤", "Ľ", "Ś", "§", "¨", "Š", "Ş", "Ť", "Ź", "Ž", "Ż", "°", "ą", "˛", "ł", "´", "ľ", "ś", "ˇ", "¸", "š", "ş", "ť", "ź", "˝", "ž", "ż", "Ŕ", "Á", "Â", "Ă", "Ä", "Ĺ", "Ć", "Ç", "Č", "É", "Ę", "Ë", "Ě", "Í", "Î", "Ď", "Đ", "Ń", "Ň", "Ó", "Ô", "Ő", "Ö", "×", "Ř", "Ů", "Ú", "Ű", "Ü", "Ý", "Ţ", "ß", "ŕ", "á", "â", "ă", "ä", "ĺ", "ć", "ç", "č", "é", "ę", "ë", "ě", "í", "î", "ď", "đ", "ń", "ň", "ó", "ô", "ő", "ö", "÷", "ř", "ů", "ú", "ű", "ü", "ý", "ţ", "˙"};
   AnsiString nove[130]={"%25", "%3B", "%26%23169;", "%26%23174;", "%E2%84%A2", "%20", "%21", "%22", "%23", "%24", "%26", "%27", "%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F", "%3A", "%3C", "%3D", "%3E", "%3F", "%40", "%5B", "%5C", "%5D", "%5E", "%5F", "%60", "%7B", "%7C", "%7D", "%7E", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7", "%A8", "%A9", "%AA", "%AB", "%AC", "%AE", "%AF", "%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7", "%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF", "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7", "%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF", "%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7", "%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF", "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7", "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF", "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", "%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF"};

   AnsiString novy_text="";

   int pozice,i,j;

   for(i=0;i<130;i++)
   {
      while(pozice=text.Pos(puvodni[i]))//nalezen vyskyt znaku k zamene
      {
         novy_text=text.SubString(0,pozice-1);
         novy_text=novy_text + nove[i];
         novy_text=novy_text + text.SubString(pozice+puvodni[i].Length(),text.Length());

         text=novy_text;
      };
   };

   return text;
};

//---------------------------------------------------------------------------
void __fastcall TForm1::WBNavigateComplete2(TObject *Sender,
      LPDISPATCH pDisp, Variant *URL)
{
   TMemoryStream *ms=new TMemoryStream();
   IPersistStreamInit *psi;
   WB->Document->QueryInterface(&psi);
   if(psi)
     {
        TStreamAdapter *sa=new TStreamAdapter(ms,soReference);
        psi->Save(*sa,true);
        delete *sa;
     }
   ms->Seek(0,soFromBeginning);
   lb->Items->LoadFromStream(ms);

   delete ms;

   zpracovat_html();

   if(smer=="in")
   {
      vykonat_prikaz();
   };

};

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   WB->Hide();
}
//---------------------------------------------------------------------------

AnsiString __fastcall TForm1::DirTree(AnsiString slozka)
{
   DIR *dir;
   struct dirent *ent;
   AnsiString soucasna,vysledek="";
   bool prvni=true;

   if(slozka.SubString(slozka.Length(),1)==":")
   {
      slozka=slozka+ "\\";
   };

   dir = opendir((slozka).c_str());

   while((ent = readdir(dir))!=NULL)
   {
      if((DirectoryExists(slozka+"\\"+(AnsiString)ent->d_name)))
      {
         SetCurrentDir(slozka);
         soucasna=GetCurrentDir();

         if(soucasna.SubString(soucasna.Length(),1)!="\\")
         {
            soucasna+="\\";
         };

         if((prvni) && ((AnsiString)ent->d_name!="."))
         {
            if(vysledek.Length()){ vysledek=vysledek+ "|";};
            vysledek=vysledek+ soucasna+".";
         };

         if(vysledek.Length()){ vysledek=vysledek+ "|";};
         vysledek=vysledek+ soucasna+(AnsiString)ent->d_name;

         prvni=false;
      };
   };

   return vysledek;
}

//---------------------------------------------------------------------------

AnsiString __fastcall TForm1::FileTree(AnsiString slozka)
{
   DIR *dir;
   struct dirent *ent;

   AnsiString vysledek="";

   if(slozka.SubString(slozka.Length(),1)==":")
   {
      slozka=slozka+ "\\";
   };

   dir = opendir((slozka).c_str());

   while((ent = readdir(dir))!=NULL)
   {
      if((FileExists(slozka+"\\"+(AnsiString)ent->d_name)))
      {
         if(vysledek.Length()){ vysledek=vysledek+ "|";};
         vysledek=vysledek+ ent->d_name;
      };
   };

   return vysledek;
}


void __fastcall TForm1::TimerTimer(TObject *Sender)
{
   CITAC++;

   if(CITAC>10)
   {
      CITAC=0;
   };

   Timer->Enabled=false;
   odeslat_dotaz(Elogin->Text, Eheslo->Text, "prikaz","");
   smer="in";
}
//---------------------------------------------------------------------------



void __fastcall TForm1::WatchDogTimer(TObject *Sender)
{
   if(CITAC==CITAC_last)//pokud se za 5 sekund ani jednou nezavolala konzole, pak se detekuje chyba a silou se zavola konzole
   {
      Timer->Enabled=true;
   };

   CITAC_last=CITAC;
}
//---------------------------------------------------------------------------



