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.
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.