_uf_xoc_downloader.pas

unit _uf_xoc_downloader;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, ExtCtrls, FileCtrl, ScktComp, ShellApi, ImgList;


Const

_c_MAX_BUFFER_SIZE = 2048;

type
  T_FXOC_DOWNLOADER = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Image2: TImage;
    AA_0569_btnClose: TButton;
    AA_0570_Label2: TLabel;
    ee_filename: TLabel;
    AA_0571_Label4: TLabel;
    ee_filesiza: TLabel;
    AA_0577_Label6: TLabel;
    ee_readen: TLabel;
    AA_0578_Label8: TLabel;
    ee_speed: TLabel;
    AA_0602_Label10: TLabel;
    ee_progress_bar: TProgressBar;
    AA_0604_Label1: TLabel;
    ee_percent: TLabel;
    ee_dwStat: TLabel;
    AA_0603_Label5: TLabel;
    AA_0601_Label3: TLabel;
    ee_ctype: TLabel;
    ee_server: TLabel;
    ee_dl_folder: TLabel;
    AA_0580_Label7: TLabel;
    ccAutoResume: TCheckBox;
    Shape2: TShape;
    pnLwebxocLINK: TPanel;
    Shape1: TShape;
    AA_0569_wwbtnCancel: TButton;
    AA_0596_wwbtnGo: TButton;
    edXocini: TEdit;
    AA_0595_Label9: TLabel;
    wxTitle: TLabel;
    imgeInvalid: TImage;
    ccConex: TClientSocket;
    imgDwXoc: TImage;
    Shape3: TShape;
    AA_0605_Label11: TLabel;
    eStatPaneL: TLabel;
    imageNoAccess: TImage;
    imageIzPrivate: TImage;
    imgsAnimator: TImageList;
    PanelCompleted: TPanel;
    Image3: TImage;
    zFileIconImage: TImage;
    AA_0581_eRunFILE: TButton;
    AA_0582_eOpenFOLDER: TButton;
    Shape4: TShape;
    TmKBS: TTimer;
    Shape5: TShape;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure AA_0569_btnCloseClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormShow(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure AA_0581_eRunFILEClick(Sender: TObject);
    procedure AA_0582_eOpenFOLDERClick(Sender: TObject);
    procedure AA_0569_wwbtnCancelClick(Sender: TObject);
    procedure ccConexConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ccConexDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure ccConexError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ccConexRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure AA_0596_wwbtnGoClick(Sender: TObject);
    procedure TmKBSTimer(Sender: TObject);
  private
    _THE_DOWNLOADING_IS_ABORTED:Boolean;
    sOnActivatedDONE : Boolean;
    sDomain,sPort,sPathSekPlusTekFile:string;
    zzID:integer;
  protected
   procedure CreateParams(var Params: TCreateParams); override;

  public
    __FILE_NAME              :String;
    __REAL_FULL_DOWNLOAD_URL :String;
    __FILE_SIZE              :String;
    __LOCAL_DOWNLOAD_FOLDER  :String;

    _vPORT,_vDOMAIN,_vPATHFILE:string;

    __TheLastLeft,__TheReaden :Int64;

    _ZUNDER_IS_WEB_XOC_LINK   :Boolean;
    _File_DL_NOT_OK   :Boolean;

  end;





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



type

  THTTP_DOWLOADER_THREAD = class(TThread)
   private
    _FCCC         :TClientSocket;
    _FMxDataFile  :TFileStream;
    _WinSkDw      :TWinSocketStream;
    sTempHdr,_StrErrorDL  :string;       // sBarrage
    _StatCodeDw  :integer;



     _ServerANYHOWHeader : string;
        
    _ss_Server_STATUS_CODE  :String[3];
    _ss_Server_NAME         :String;
    _ss_Server_LOCATION_URL :String;
    _ss_Server_CONTENT_TYPE :String;
    _ss_Server_CONTENT_LENGTH_FILESIZE  : Int64;


    _RemoteHTTPdtxGetFileSIZE : Int64;
    _RcvDownloadedBytes       : Int64;
    _FixedResumeBYTES         : Int64;
    _TempFileNameFullPath,_HTTP_HEADER_DWL : String;

    _ccKKDetection           : Boolean;
    _DwIzCANCELED            : Boolean;
    _HTTPHeaderDataFileIsOK  : Boolean;
    procedure ShaWaConnectingInitialization;
    procedure ShaWaHeaderInitialization;
    procedure ShaWaBB;
    procedure OnDwTerminated(Sender: TObject);
    procedure GetHeaderNAMES(sData:string);
  protected
    procedure Execute; override;

  public

    _FileNameSek2Dw        : string;
    _THE_DWL_FORM          : T_FXOC_DOWNLOADER;



    //_GLOBAL_DWLS_USED_CLIENT_ID    : String[8];
    //_GLOBAL_DWLS_USED_CLIENT_AGENT : String[2];

    constructor Create;
    destructor Destroy; override;

  end;










implementation

uses _uc_refs_vars, _uc_refs_consts, _uc_funcs, Unit1, _uc_ip_codecs,
  _uc_GuiLanG;

{$R *.DFM}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.CreateParams(var Params: TCreateParams);
begin

Inherited CreateParams(Params);
Params.WndParent := GetDesktopWindow;
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.AA_0569_btnCloseClick(Sender: TObject);
begin

if AA_0569_btnClose.Tag=0 then _THE_DOWNLOADING_IS_ABORTED:=true
else begin
     if (not _File_DL_NOT_OK)and(not ccAutoResume.Checked) then DeleteFile(Hint); // del temp file
     Close;
     end;
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=(Tag=1);
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.FormShow(Sender: TObject);
var
s:string;
p:integer;
begin


ee_dl_folder.Caption:=__LOCAL_DOWNLOAD_FOLDER;
AA_0582_eOpenFOLDER.Hint:=__LOCAL_DOWNLOAD_FOLDER+'Completed\';


if (_ZUNDER_IS_WEB_XOC_LINK) then exit; // dont bother we'll get fresh info



ee_filename.Caption:=__FILE_NAME;
ee_filesiza.Caption:=__FILE_SIZE;



// http://www.crystalxp.net:2084/galerie/img/th2_573.jpg
s:=__REAL_FULL_DOWNLOAD_URL;

p:=pos('://',s);
delete(s,1,p+2);
// s = www.crystalxp.net:2084/galerie/img/th2_573.jpg

p:=pos('/',s);
_vDOMAIN:=copy(s,1,p-1);
// vDOMAIN = www.crystalxp.net

delete(s,1,p-1);
_vPATHFILE:=stringreplace(s,' ','%20',[rfReplaceAll]);   // /galerie/img/th2_573.jpg   + Url-htttp-enode fix! %20


if (pos(':',_vDOMAIN)>0) then    // www.crystalxp.net:2084
begin
s:=_vDOMAIN; // re-use s
p:=pos(':',s);
_vDOMAIN:=copy(s,1,p-1);  // www.crystalxp.net

delete(s,1,p);  // remove : too
_vPORT:=s;
end
else _vPORT:='80';



end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.FormActivate(Sender: TObject);
var
//THTDWLER : THTTP_DOWLOADER_THREAD;
sLink,sXocID:string;
p:integer;
begin

Update;

if (sOnActivatedDONE) then exit;
    sOnActivatedDONE:=true;



// xoc web will re-create info and will start
if (_ZUNDER_IS_WEB_XOC_LINK) then
begin
sLink:=edXocini.Text;
SetForegroundWindow(Handle);  // to flash
BringToFront;

// xoc://communities.exosee.com/com/FC7A82EC2D6/DAMN Tools.zip

     if (sLink='')or(pos('xoc://',sLink)<>1)or(pos('/FC7A82EC',sLink)=0) then
     begin
     wxTitle.Caption:=___ccc__0088__InvalidXoc;
     AA_0596_wwbtnGo.Visible:=false;
     AA_0569_wwbtnCancel.Caption:=___ccc__0072__Close;
     imgeInvalid.Visible:=true;
     end
     else begin
          Delete(sLink,1,6); //  communities.exosee.com:8080/com/FC7A82EC2D6/DAMN Tools.zip
          p:=pos('/',sLink);
          sDomain:=copy(sLink,1,p-1);  //  communities.exosee.com:8080

          Delete(sLink,1,p-1);  //  /com/FC7A82EC2D6/DAMN Tools.zip
          p:=pos('/FC7A82EC',sLink);
          sPathSekPlusTekFile:=Copy(sLink,1,p)+_C_EXOSEE_WEB_TEK_FILE; //  /com/_xoc_com..tek

          Delete(sLink,1,p+8);  //  2D6/DAMN Tools.zip
          p:=pos('/',sLink);
          sXocID:=Copy(sLink,1,p-1);  //  2D6
          zzID:=StrToIntDef('$'+sXocID,0); // hex to int
          Dec(zzID,687); // dec the xoc-magic number

          Delete(sLink,1,p);
          wxTitle.Caption:=sLink; // DAMN Tools.zip
          imgDwXoc.Visible:=true;


                 if (pos(':',sDomain)>0) then    // communities.exosee.com:8080
                 begin
                 sLink:=sDomain; // re-use sLink
                 p:=pos(':',sLink);
                 sDomain:=copy(sLink,1,p-1);  // communities.exosee.com

                 Delete(sLink,1,p);  // remove ':' too        8080
                 sPort:=sLink;
                 end
                 else sPort:='80';




             //sDebug:=edXocini.Text+ret+sDomain+ret+sPathSekPlusTekFile+ret+sPort+ret+sXocID+'-'+IntToStr(zzID);
             //_DoDebugLOG(sep+ret+'Web_xoc_LinkDebug:'+ret+sDebug+ret+sep);


          end;

//_vPATHFILE:=stringreplace(s,' ','%20',[rfReplaceAll]);
exit; //
end;





  // internal db download   !! no use !! server contact is needed !
  (*
  THTDWLER:=THTTP_DOWLOADER_THREAD.Create;
  THTDWLER._FileNameSek2Dw        :=__FILE_NAME;
  THTDWLER._THE_DWL_FORM          :=Self;
  THTDWLER.Priority               :=tpHigher;

  THTDWLER.Resume;
  *)
//
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.FormCreate(Sender: TObject);
begin

GoSetLANG(Self); //----- go loadLang --- if ok  (1st here)

Caption:='ExoSee - '+___ccc__0600__XOCDownloader;

_ZUNDER_IS_WEB_XOC_LINK:=false;
_File_DL_NOT_OK:=false;


// check and validate DL folders
if not DirectoryExists(_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER)
then _VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER:=ExtractFilePath(ParamStr(0));

if not DirectoryExists(_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'Completed\')
  then CreateDir(_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'Completed\');

imgsAnimator.GetIcon(0,icon);

end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.AA_0581_eRunFILEClick(Sender: TObject);
begin
ShellExecute(0,'open',pchar(TButton(Sender).Hint),nil,nil,SW_SHOWNORMAL);
close;
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.AA_0582_eOpenFOLDERClick(Sender: TObject);
begin
ShellExecute(0,'explore',pchar(TButton(Sender).Hint),nil,nil,SW_SHOWNORMAL);
close;
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.AA_0569_wwbtnCancelClick(Sender: TObject);
begin
tag:=1;
close;
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.ccConexConnect(Sender: TObject; Socket: TCustomWinSocket);
var
ss:string;
begin

// send &_UI >>> user-pc-id for db xoc-access-rights



        ss:='GET '+sPathSekPlusTekFile+'?e=_T5&_CD='+IntToStr(zzID)+'&_UI='+_VV_LOCAL_USER_PC_ID+' HTTP/1.0'+ret+
            'User-Agent: '+_C_EXOSEE_WEB_TEK_USER_MERDA+ret+
            'Host: '+sDomain+ret+
            'Connection: close'+ret+ret;


Socket.SendText(ss);

end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.ccConexDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
_StrDATA,s:String;
p,p1,p2:integer;
okCONTINUE:Boolean;
THTDWLER : THTTP_DOWLOADER_THREAD;
begin


AA_0596_wwbtnGo.Visible:=false;
AA_0569_wwbtnCancel.Caption:=___ccc__0072__Close;

okCONTINUE:=false;
eStatPaneL.Caption:='.';
_StrDATA:=Socket._StokenStr;

//_DoDebugLOG('xocLinkResp:'+ret+_StrDATA);


if (_StrDATA='') then
begin
ShowMessage(___ccc__0079__ConnectionError+ret+ret+___ccc__0080__CheckYourInternet);
exit;
end;




eStatPaneL.Font.Style:=[fsBold];
//ShowMessage(_StrDATA); exit;

//500 = only members
//501 = xoc-private > only members
//502 = ok
   if pos('_SC_500',_StrDATA)>0 then
   begin
   eStatPaneL.Caption:=___ccc__0089__SorryPrivateDL+'. '+___ccc__0086__OnlyMembersHasAccess;
   imageNoAccess.Visible:=true;
   exit;
   end;


   if pos('_SC_501',_StrDATA)>0 then
   begin
   eStatPaneL.Caption:=___ccc__0085__SorryXocIsPrivate+'. '+___ccc__0086__OnlyMembersHasAccess;
   imageIzPrivate.Visible:=true;
   exit;
   end;



   if pos('_SC_502',_StrDATA)>0 then
   begin
          // £c2AeN_zk218ò[[x°ADAMN Tools.zip°B6470706C362F2A76656C°Cx]]_SC_467_ER_END
          p1:=pos('[[x',_StrDATA);
          p2:=pos('x]]',_StrDATA);
          if (Not (p1>0)and(p2>p1) )then
          begin
          eStatPaneL.Caption:='_SC_467_DataBuffer_Error!';
          exit;
          end;


   __FILE_NAME:=copy(_StrDATA,pos('°A',_StrDATA)+2,pos('°B',_StrDATA)-(pos('°A',_StrDATA)+2));
   __REAL_FULL_DOWNLOAD_URL:=copy(_StrDATA,pos('°B',_StrDATA)+2,pos('°C',_StrDATA)-(pos('°B',_StrDATA)+2));
   okCONTINUE:=true;
   end
   else
   ShowMessage('Server_xoc_Error.');



if NOT(okCONTINUE) then exit;




pnLwebxocLINK.Visible:=false;
Update;
Application.ProcessMessages;




// the real url Decoded now !
__REAL_FULL_DOWNLOAD_URL:=TIpCodecs._DeCodeTheHEXStringV2(__REAL_FULL_DOWNLOAD_URL);


ee_filename.Caption:=__FILE_NAME;
ee_filesiza.Caption:='--';



     // http://www.crystalxp.net:2084/galerie/img/th2_573.jpg
     s:=__REAL_FULL_DOWNLOAD_URL;

     p:=pos('://',s);
     delete(s,1,p+2); // s = www.crystalxp.net:2084/galerie/img/th2_573.jpg

     p:=pos('/',s);
     _vDOMAIN:=copy(s,1,p-1); // vDOMAIN = www.crystalxp.net:2084

     delete(s,1,p-1);
     _vPATHFILE:=stringreplace(s,' ','%20',[rfReplaceAll]);   // /galerie/img/th2_573.jpg   + Url-htttp-enode fix! %20


     if (pos(':',_vDOMAIN)>0) then    // www.crystalxp.net:2084
     begin
     s:=_vDOMAIN; // re-use s
     p:=pos(':',s);
     _vDOMAIN:=copy(s,1,p-1);  // www.crystalxp.net
     delete(s,1,p);  // remove ':' too
     _vPORT:=s;
     end
     else _vPORT:='80';




  // internal db download
  THTDWLER:=THTTP_DOWLOADER_THREAD.Create;
  THTDWLER._FileNameSek2Dw        :=__FILE_NAME;
  THTDWLER._THE_DWL_FORM          :=Self;
  THTDWLER.Priority               :=tpHigher;

  THTDWLER.Resume;

end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.ccConexError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close; // to  trigger OnDisconnect
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.ccConexRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket._StokenStr:=Socket._StokenStr+Socket.ReceiveText;
eStatPaneL.Caption:='...';
end;

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.AA_0596_wwbtnGoClick(Sender: TObject);
begin

AA_0596_wwbtnGo.Enabled:=false;
imgsAnimator.GetIcon(1,icon);

eStatPaneL.Caption:=___ccc__0045__Connecting;

ccConex.Host_name         :=sDomain;
ccConex.Port              :=StrToInt(sPort);
ccConex.Socket._StokenStr :='';  // free data if any
ccConex.Tag               :=0; // data length
ccConex.Active            :=true;

end;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
constructor THTTP_DOWLOADER_THREAD.Create;
begin

inherited Create(True); // Intially suspended

FreeOnTerminate   := True;
OnTerminate       := OnDwTerminated;
_FCCC             := TClientSocket.Create(nil);
_FCCC.ClientType  := ctBlocking;

end;

//------------------------------------------------------------------------------
destructor THTTP_DOWLOADER_THREAD.Destroy;
begin

  _FCCC.Free;
  inherited;
end;

//------------------------------------------------------------------------------
procedure THTTP_DOWLOADER_THREAD.ShaWaConnectingInitialization;
begin

_THE_DWL_FORM.ee_dwStat.Caption:=___ccc__0090__Connecting2FileServer;

Application.ProcessMessages;
end;

//------------------------------------------------------------------------------
procedure THTTP_DOWLOADER_THREAD.ShaWaHeaderInitialization;
begin

_THE_DWL_FORM.imgsAnimator.GetIcon(5,_THE_DWL_FORM.icon);

_THE_DWL_FORM.ee_dwStat.Caption:=___ccc__0091__ConnectOkInitalization;
_THE_DWL_FORM.ee_progress_bar.Max:=_ss_Server_CONTENT_LENGTH_FILESIZE; // ( resume fix ok)
_THE_DWL_FORM.ee_progress_bar.Position:=_RcvDownloadedBytes;     // this has resume bytes
_THE_DWL_FORM.ee_readen.Caption:=IntToStr(_RcvDownloadedBytes);

_THE_DWL_FORM.ee_filesiza.Caption:=IntToStr(_ss_Server_CONTENT_LENGTH_FILESIZE)+'  ['+_octos(_ss_Server_CONTENT_LENGTH_FILESIZE)+']';
_THE_DWL_FORM.ee_server.Caption:=_ss_Server_NAME;
_THE_DWL_FORM.ee_percent.Caption:=IntToStr(_percenty(_RcvDownloadedBytes,_ss_Server_CONTENT_LENGTH_FILESIZE))+' %';
_THE_DWL_FORM.ee_ctype.Caption:=_ss_Server_CONTENT_TYPE;
_THE_DWL_FORM.TmKBS.Enabled:=true;
(*
TLogger.Log('---------------'+ret+
            _ss_Server_STATUS_CODE+ret+
            _ss_Server_NAME+ret+
            _ss_Server_LOCATION_URL+ret+
            _ss_Server_CONTENT_TYPE+ret+
            IntToStr(_ss_Server_CONTENT_LENGTH_FILESIZE)+ret+
            '---------------');
*)
Application.ProcessMessages;
end;

//------------------------------------------------------------------------------
procedure THTTP_DOWLOADER_THREAD.ShaWaBB;
begin

_THE_DWL_FORM.ee_dwStat.Caption         :=___ccc__0092__Downloading;
_THE_DWL_FORM.ee_progress_bar.Position  :=_RcvDownloadedBytes;
_THE_DWL_FORM.ee_readen.Caption         :=IntToStr(_RcvDownloadedBytes);
_THE_DWL_FORM.ee_percent.Caption        :=_percentyV2(_RcvDownloadedBytes,_ss_Server_CONTENT_LENGTH_FILESIZE);

_THE_DWL_FORM.__TheReaden := _RcvDownloadedBytes;

Application.ProcessMessages;

if _THE_DWL_FORM._THE_DOWNLOADING_IS_ABORTED then _DwIzCANCELED:=true;


end;

//------------------------------------------------------------------------------
procedure THTTP_DOWLOADER_THREAD.OnDwTerminated(Sender: TObject);
var
j:integer;
z,s,f:string;
vColor:TColor;
begin


_THE_DWL_FORM.TmKBS.Enabled:=false;


vColor:=clWindowText;

_THE_DWL_FORM.Tag:=1; // enable form close;
_THE_DWL_FORM.AA_0569_btnClose.Tag:=1; //  close;
_THE_DWL_FORM.AA_0569_btnClose.Caption:=___ccc__0072__Close;

_THE_DWL_FORM.ee_dwStat.Caption:='.';

_THE_DWL_FORM.imgsAnimator.GetIcon(11,_THE_DWL_FORM.icon);


//_DoDebugLOG('_HTTP_HEADER_DWL:'+_HTTP_HEADER_DWL);
//_DoDebugLOG(_ServerANYHOWHeader+ret);
//_DoDebugLOG('_StatCodeDw:'+IntToStr(_StatCodeDw)+ret+'_StrErrorDL:'+ret+_StrErrorDL);

_THE_DWL_FORM.ee_dwStat.Font.Style:=[fsBold];


if _DwIzCANCELED  then _StatCodeDw :=2;
if _ccKKDetection then _StatCodeDw :=5;


       Case _StatCodeDw of

         1 : s:=___ccc__0079__ConnectionError;
         2 : s:=___ccc__0093__DownloadAborted;
         3 : s:=___ccc__0079__ConnectionError;
         4 : begin
             s:=___ccc__0094__DownloadCompleted;
             vColor:=$00008A00;
             _THE_DWL_FORM.PanelCompleted.Top:=130;
             _THE_DWL_FORM.PanelCompleted.Visible:=true;
             //_THE_DWL_FORM.ee_dwStat.Left:=200;
             //_THE_DWL_FORM.ee_dwStat.Width:=180;

            
             //_TempFileNameFullPath     :=_THE_DWL_FORM.__LOCAL_DOWNLOAD_FOLDER+'__$$__'+_FileNameSek2Dw+'.xoc';

                    j:=0;
                    z:='';
                    while FileExists(_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'Completed\'+z+_FileNameSek2Dw) do
                          begin
                          inc(j);
                          z:='['+inttostr(j)+'] ';
                          end;
                    f:=_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'Completed\'+z+_FileNameSek2Dw;

                    if (MoveFile(pchar(_TempFileNameFullPath),pchar(f))) then
                    _SetFileAssocIcon(f,_THE_DWL_FORM.zFileIconImage.Picture.Icon);


             //ShowMessage('okkkk');
             //Application.ProcessMessages;

             _THE_DWL_FORM.AA_0581_eRunFILE.Hint:=f;
             end;

         5 : s:='DataReceptionError!: [0 bytes]';
         9 : s:='HttpError: ResumeOnCompletedFile';
       end;


_THE_DWL_FORM.ee_dwStat.Caption:=s;

    if (_StatCodeDw in [1,2,3,5,9]) then
    begin
    vColor:=$000000CA;
    _THE_DWL_FORM.ccAutoResume.Visible:=true;
    _THE_DWL_FORM.ee_dwStat.Left:=112;
    _THE_DWL_FORM.ee_dwStat.Width:=272;
    _THE_DWL_FORM.Hint:=_TempFileNameFullPath; // stok temp file
    end;



_THE_DWL_FORM.ee_dwStat.Font.Color:=vColor;

//_DoDebugLOG('sBarrageEnd:'+sBarrage);

//sleep(400); // fix matter !//time to rename and make dw_dtx ready !!

//if _StatCodeDw = 4 then  // decompress only if dl is ok !!!



end;


//------------------------------------------------------------------------------
procedure THTTP_DOWLOADER_THREAD.Execute;
var
//St : string;
PDWBuFF: PByteArray;
TheSIZIN,BufSize, rcv: Integer;
p1: Integer;
LeftHttpDataSIZE : Int64;
begin




_StatCodeDw               :=0;
_RemoteHTTPdtxGetFileSIZE :=0;
LeftHttpDataSIZE          :=0;
_RcvDownloadedBytes       :=0;
_ccKKDetection            :=false;
_DwIzCANCELED             :=false;
_HTTPHeaderDataFileIsOK   :=false;
_TempFileNameFullPath     :=_THE_DWL_FORM.__LOCAL_DOWNLOAD_FOLDER+'__$$__'+_FileNameSek2Dw+'.xoc';



                       // solution even for big files = no PHP for files giving , we'll use Apache direct
                       // 1 contact master : give lasr file info ( for inc traffic ) & get dl info direct


try //----------------t1


      Synchronize(ShaWaConnectingInitialization);

      _FCCC.Host_name := _THE_DWL_FORM._vDOMAIN;
      _FCCC.Port      := StrToIntDef(_THE_DWL_FORM._vPORT,80);
      _FCCC.Active    := True;

          if _FCCC.Socket.Connected then
          begin

              if FileExists(_TempFileNameFullPath) then
              _FMxDataFile :=TFileStream.Create(_TempFileNameFullPath,fmOpenWrite or fmShareDenyWrite)else
              _FMxDataFile :=TFileStream.Create(_TempFileNameFullPath,fmCreate or fmShareDenyWrite);
              _FMxDataFile.Position :=_FMxDataFile.Size;  // http resume
              _RcvDownloadedBytes   :=_FMxDataFile.Position;
              _FixedResumeBYTES     :=_RcvDownloadedBytes;


              _WinSkDw := TWinSocketStream.Create(_FCCC.Socket, 8000);
              try ////----------------t2
              _HTTP_HEADER_DWL:= 'GET '+_THE_DWL_FORM._vPATHFILE+' HTTP/1.0'+ret+
                                 'Accept: */*'+ret+
                                 'Accept-Language: en'+ret+
                                 //'Referer: http://'+_THE_DWL_FORM._vDOMAIN+'/'+ret+ // later add clean path
                                 'Range: bytes='+IntToStr(_RcvDownloadedBytes)+'-'+ret+
                                 'Request-Range: bytes='+IntToStr(_RcvDownloadedBytes)+'-'+ret+
                                 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'+ret+
                                 'Host: '+_THE_DWL_FORM._vDOMAIN+ret+
                                 'Connection: Keep-Alive'+ret+     // 
                                 ret;



                       (*   response
                       HTTP/1.1 200 OK
                       Date: Thu, 14 Dec 2006 20:56:28 GMT
                       Server: Apache/2.0.58 (Unix) mod_ssl/2.0.58 OpenSSL/0.9.7i
                       Last-Modified: Fri, 19 May 2006 12:33:03 GMT
                       ETag: "6a81eb-8e08d-414235a957dc0"
                       Accept-Ranges: bytes
                       Content-Length: 581773
                       Connection: close
                       Content-Type: image/jpeg

                       ÿØÿà
                       *)

              _FCCC.Socket.SendText(_HTTP_HEADER_DWL);       // send header

              if _WinSkDw.WaitForData(10000) then
              begin
              sTempHdr:=_FCCC.Socket.ReceiveText;         // sTempHdr = all 1st time grabbed (header+data)
              p1:=pos(ret+ret,sTempHdr);

               if (copy(sTempHdr,1,4)='HTTP')and(p1>0) then
               begin
               _ServerANYHOWHeader:=sTempHdr;//copy(sTempHdr,1,p1);  // save header any how !! for errors ...etc

               GetHeaderNAMES(copy(sTempHdr,1,p1));  // sever respone info grab

                  if (_ss_Server_STATUS_CODE='416') then _StatCodeDw:=9  // http-error > resume on a completed file....// don't continue
                  else
                  begin

                    Inc(_ss_Server_CONTENT_LENGTH_FILESIZE,_FixedResumeBYTES); // FileSize SET OK ( local bytes + server bytes)
                    Synchronize(ShaWaHeaderInitialization);

                    // trunck sTempHdr   >> removes server header leting only primary included data
                    Delete(sTempHdr,1,p1+3);  //  --....+++
                    LeftHttpDataSIZE:=length(sTempHdr);
                                     
                    // write primary data
                    if (LeftHttpDataSIZE>0) then // bug fix !!! only if data <>''
                    inc(_RcvDownloadedBytes,_FMxDataFile.Write(sTempHdr[1], LeftHttpDataSIZE));


                    Synchronize(ShaWaBB);
                     _HTTPHeaderDataFileIsOK:=true;   // ok go enable
                    //////// else _StatCodeDw:=4;  // mark small file data Downolded Ok, we exit : LOOP won't continue

                  end;


               end;

              end;

                      if (_HTTPHeaderDataFileIsOK) then   // go only if header is ok !!
                      begin

                      // main size - whats just writen above with mixing header - _FixedResumeBYTES
                      TheSIZIN:=_ss_Server_CONTENT_LENGTH_FILESIZE-LeftHttpDataSIZE-_FixedResumeBYTES;
                     // _Log('TheSIZIN:'+inttostr(TheSIZIN));

                      //__________here we go ....._______________________
                      if TheSIZIN < _c_MAX_BUFFER_SIZE then
                       BufSize := TheSIZIN else BufSize := _c_MAX_BUFFER_SIZE;
                      
                      GetMem(PDWBuFF, BufSize);
                      try //------------4

                               while ( TheSIZIN >0 ) do
                               begin

                               if TheSIZIN > BufSize then rcv := BufSize else rcv := TheSIZIN;

                                    if _WinSkDw.WaitForData(10000) then
                                    begin

                                    rcv :=_WinSkDw.Read(PDWBuFF^, rcv);

                                    _ccKKDetection:=(rcv=0);
                                    if (_DwIzCANCELED or _ccKKDetection) then break;  // later add app_closing or such

                                    _FMxDataFile.Write(PDWBuFF^, rcv);

                                    Dec(TheSIZIN, rcv);
                                    inc(_RcvDownloadedBytes,rcv);

                                    Synchronize(ShaWaBB);
                                    end
                                    else _ccKKDetection:=true;



                               end;

                         if (TheSIZIN=0) then _StatCodeDw:=4;

                      finally FreeMem(PDWBuFF); end; //------------4

                      end;  // _HTTPHeaderIsOK end !
                    


              finally
              _FCCC.Socket.Close;
              _WinSkDw.Free;
              _FMxDataFile.Free;
              end; //----------------t2

          end
          else
          _StatCodeDw:=3; //_error_connection);




    Except

    on E: Exception do
    begin
     if not(ExceptObject is EAbort) then
      begin
      _StatCodeDw :=1;
      _StrErrorDL := E.Message;
      end;
    end;

    end;


end;




//------------------------------------------------------------------------------
procedure THTTP_DOWLOADER_THREAD.GetHeaderNAMES(sData:string);
var
xx:TStringList;
i:Integer;
s:string;
begin

if (copy(sData,1,5)<>'HTTP/') then exit;
                       (*   response
                       HTTP/1.1 200 OK
                       Date: Thu, 14 Dec 2006 20:56:28 GMT
                       Server: Apache/2.0.58 (Unix) mod_ssl/2.0.58 OpenSSL/0.9.7i
                       Last-Modified: Fri, 19 May 2006 12:33:03 GMT
                       ETag: "6a81eb-8e08d-414235a957dc0"
                       Accept-Ranges: bytes
                       Content-Length: 581773
                       Connection: close
                       Content-Type: image/jpeg

                       ÿØÿà
                       *)

xx:=TStringList.Create;
try


   xx.Text:=sData;
   s:=xx[0];
   Delete(s,1,pos(' ',s));
   s:=copy(s,1,pos(' ',s)-1);
   _ss_Server_STATUS_CODE:=s;


   for i:=1 to xx.Count-1 do
   begin
   s:=xx[i];

     if pos('server:',LowerCase(s))>0 then begin
                                Delete(s,1,pos(' ',s));
                                _ss_Server_NAME:=s;
                                Continue;
                                end;

     if pos('location:',LowerCase(s))>0 then begin
                                  Delete(s,1,pos(' ',s));
                                  _ss_Server_LOCATION_URL:=s;
                                  Continue;
                                  end;

     if pos('content-type:',LowerCase(s))>0 then begin
                                      Delete(s,1,pos(' ',s));
                                      _ss_Server_CONTENT_TYPE:=lowercase(s);
                                      Continue;
                                      end;

     if pos('content-length:',LowerCase(s))>0 then begin
                                        Delete(s,1,pos(' ',s));
                                        _ss_Server_CONTENT_LENGTH_FILESIZE:=StrToInt64Def(s,-1);
                                        Continue;
                                        end;
   end;

finally xx.Free; end;


end;

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

//------------------------------------------------------------------------------
procedure T_FXOC_DOWNLOADER.TmKBSTimer(Sender: TObject);
begin

ee_speed.Caption:=_octos(__TheReaden - __TheLastLeft)+'/s';
__TheLastLeft:=__TheReaden;

end;

end.





../delphi71code/exosee-code-source/uf_xoc_downloader-pas..