first commit (2004-06-30)
This commit is contained in:
commit
1c2734ad7b
BIN
bin/LiveUpdate.exe
Normal file
BIN
bin/LiveUpdate.exe
Normal file
Binary file not shown.
BIN
bin/LiveUpdate.tds
Normal file
BIN
bin/LiveUpdate.tds
Normal file
Binary file not shown.
5
bin/liveUpdate.INI
Normal file
5
bin/liveUpdate.INI
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[liveUpdate]
|
||||||
|
app=myTPV standard
|
||||||
|
# login=
|
||||||
|
# pass=
|
||||||
|
|
14
bin/versions.dat
Normal file
14
bin/versions.dat
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[status]
|
||||||
|
msg=Ok
|
||||||
|
[apps]
|
||||||
|
lineas=4
|
||||||
|
l1_app=
|
||||||
|
|
||||||
|
gestion.exe
|
||||||
|
l1_ver=1.0.0.21
|
||||||
|
l2_app=comercial.exe
|
||||||
|
l2_ver=1.0.0.0
|
||||||
|
l3_app=Incidencias.exe
|
||||||
|
l3_ver=1.0.0.0
|
||||||
|
l4_app=QR_Designer.exe
|
||||||
|
l4_ver=1.0.0.0
|
40
liveUpdate.txt
Normal file
40
liveUpdate.txt
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
17-jun-2004
|
||||||
|
23:21 Codificacion parcial del módulo PHP (lado del servidor), que valida las licencias por usuario
|
||||||
|
y controla los permisos de actualizaciones para las aplicaciones.
|
||||||
|
22:01 A ver, a ver...
|
||||||
|
25-abr-2004
|
||||||
|
14:49 Ya descarga tambien los ficheros, y aunque solo necesita un lavado
|
||||||
|
de cara en la interfaz, todo funciona como debería.
|
||||||
|
-- Pendiente:
|
||||||
|
Comprobar que el fichero que se ha bajado es correcto...
|
||||||
|
(y solo entonces sobreescribir con el otro)
|
||||||
|
Si el fichero no se puede sobreescribir porque esta en uso
|
||||||
|
acordarme que existe una entrada en el registro que permite
|
||||||
|
eliminar y renombrar ficheros, de forma automática una vez
|
||||||
|
reiniciado el sistema y proponer reiniciarlo una vez configurada
|
||||||
|
esta entrada.
|
||||||
|
|
||||||
|
Si el fichero estaba marcado con "Autoexec"
|
||||||
|
ejecutarlo una vez finalizada todas las descargas.
|
||||||
|
|
||||||
|
|
||||||
|
12:53 Haciendo que funcione...
|
||||||
|
22-abr-2004
|
||||||
|
17:10 que soñera
|
||||||
|
16:05 He estado compilando otras cosas, ahora si me pongo
|
||||||
|
con este proyecto...
|
||||||
|
15:47 a ver como nos lo montamos...
|
||||||
|
21-abr-2004
|
||||||
|
22:07 ... - iba a mirar algo, pero veamos otra cosa...
|
||||||
|
20-abr-2004
|
||||||
|
17:30 Ok! Casi listo para empezar a rellenar el código de descarga...
|
||||||
|
16:48 Despues de muchos cambios, casi voy haciendo que me funcione
|
||||||
|
aunque a veces, creo que sería mejor "reCodificar" por completo
|
||||||
|
todas las funciones para obtener los datos por internet, y mandar
|
||||||
|
a tomar "viento" a la pu..ta API de Microsoft.
|
||||||
|
(Y todo por la mierda de saber a priori, el tamaño de la descarga).
|
||||||
|
19-abr-2004
|
||||||
|
xx:xx Bueno, para que poner hora, si voy a estar TODO EL DÍA.
|
||||||
|
por fin comienzo el proyecto que tanto tiempo llebava en mente
|
||||||
|
y es que hoy día, si una aplicación (con tantas actualizaciones),
|
||||||
|
no posee un actualizador onLine, no esta completa...
|
153
src/LiveUpdate.bpr
Normal file
153
src/LiveUpdate.bpr
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8' ?>
|
||||||
|
<!-- C++Builder XML Project -->
|
||||||
|
<PROJECT>
|
||||||
|
<MACROS>
|
||||||
|
<VERSION value="BCB.06.00"/>
|
||||||
|
<PROJECT value="..\bin\LiveUpdate.exe"/>
|
||||||
|
<OBJFILES value="..\obj\LiveUpdate.obj ..\obj\interfaz.obj ..\obj\donwloads.obj
|
||||||
|
..\obj\TMD5.obj"/>
|
||||||
|
<RESFILES value="LiveUpdate.res"/>
|
||||||
|
<IDLFILES value=""/>
|
||||||
|
<IDLGENFILES value=""/>
|
||||||
|
<DEFFILE value=""/>
|
||||||
|
<RESDEPEN value="$(RESFILES) interfaz.dfm"/>
|
||||||
|
<LIBFILES value=""/>
|
||||||
|
<LIBRARIES value="rtl.lib vcl.lib"/>
|
||||||
|
<SPARELIBS value="vcl.lib rtl.lib"/>
|
||||||
|
<PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
|
||||||
|
vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
|
||||||
|
teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
|
||||||
|
dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
|
||||||
|
inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
|
||||||
|
bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
|
||||||
|
indy.bpi bcb2kaxserver.bpi ZCore.bpi ZParseSql.bpi ZPlain.bpi ZDbc.bpi
|
||||||
|
ZComponent.bpi"/>
|
||||||
|
<PATHCPP value=".;"/>
|
||||||
|
<PATHPAS value=".;"/>
|
||||||
|
<PATHRC value=".;"/>
|
||||||
|
<PATHASM value=".;"/>
|
||||||
|
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
|
||||||
|
<RELEASELIBPATH value="$(BCB)\lib\release"/>
|
||||||
|
<LINKER value="ilink32"/>
|
||||||
|
<USERDEFINES value="_DEBUG"/>
|
||||||
|
<SYSDEFINES value="NO_STRICT"/>
|
||||||
|
<MAINSOURCE value="LiveUpdate.cpp"/>
|
||||||
|
<INCLUDEPATH value=""C:\Archivos de programa\Borland\CBuilder6\Projects";"C:\Documents and Settings\jd\Mis documentos\CBuilder\LiveUpdate\src";$(BCB)\include;$(BCB)\include\vcl"/>
|
||||||
|
<LIBPATH value=""C:\Archivos de programa\Borland\CBuilder6\Projects";"C:\Documents and Settings\jd\Mis documentos\CBuilder\LiveUpdate\src";C:\programacion\VCLs\lib;$(BCB)\lib\obj;$(BCB)\lib"/>
|
||||||
|
<WARNINGS value="-w-par"/>
|
||||||
|
<OTHERFILES value=""/>
|
||||||
|
</MACROS>
|
||||||
|
<OPTIONS>
|
||||||
|
<IDLCFLAGS value="-I"C:\Archivos de programa\Borland\CBuilder6\Projects"
|
||||||
|
-I"C:\Documents and Settings\jd\Mis documentos\CBuilder\LiveUpdate\src"
|
||||||
|
-I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG -boa"/>
|
||||||
|
<CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -5 -b- -k -y -v -vi-
|
||||||
|
-c -tW -tWM"/>
|
||||||
|
<PFLAGS value="-N2..\obj -N0..\obj -$YD -$W -$O- -$A8 -v -JPHNE -M"/>
|
||||||
|
<RFLAGS value=""/>
|
||||||
|
<AFLAGS value="/mx /w2 /zd"/>
|
||||||
|
<LFLAGS value="-l..\obj -I..\obj -D"" -aa -Tpe -x -Gn -v"/>
|
||||||
|
<OTHERFILES value=""/>
|
||||||
|
</OPTIONS>
|
||||||
|
<LINKER>
|
||||||
|
<ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
|
||||||
|
<ALLRES value="$(RESFILES)"/>
|
||||||
|
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
|
||||||
|
<OTHERFILES value=""/>
|
||||||
|
</LINKER>
|
||||||
|
<FILELIST>
|
||||||
|
<FILE FILENAME="LiveUpdate.res" FORMNAME="" UNITNAME="LiveUpdate.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||||
|
<FILE FILENAME="LiveUpdate.cpp" FORMNAME="" UNITNAME="LiveUpdate" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||||
|
<FILE FILENAME="interfaz.cpp" FORMNAME="Form1" UNITNAME="interfaz" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||||
|
<FILE FILENAME="donwloads.cpp" FORMNAME="" UNITNAME="donwloads" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||||
|
<FILE FILENAME="TMD5.cpp" FORMNAME="" UNITNAME="TMD5" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
|
||||||
|
</FILELIST>
|
||||||
|
<BUILDTOOLS>
|
||||||
|
</BUILDTOOLS>
|
||||||
|
|
||||||
|
<IDEOPTIONS>
|
||||||
|
[Version Info]
|
||||||
|
IncludeVerInfo=1
|
||||||
|
AutoIncBuild=1
|
||||||
|
MajorVer=1
|
||||||
|
MinorVer=0
|
||||||
|
Release=0
|
||||||
|
Build=0
|
||||||
|
Debug=0
|
||||||
|
PreRelease=0
|
||||||
|
Special=0
|
||||||
|
Private=0
|
||||||
|
DLL=0
|
||||||
|
Locale=3082
|
||||||
|
CodePage=1252
|
||||||
|
|
||||||
|
[Version Info Keys]
|
||||||
|
CompanyName=
|
||||||
|
FileDescription=
|
||||||
|
FileVersion=1.0.0.0
|
||||||
|
InternalName=
|
||||||
|
LegalCopyright=
|
||||||
|
LegalTrademarks=
|
||||||
|
OriginalFilename=
|
||||||
|
ProductName=
|
||||||
|
ProductVersion=1.0.0.0
|
||||||
|
Comments=
|
||||||
|
|
||||||
|
[Excluded Packages]
|
||||||
|
c:\archivos de programa\borland\cbuilder6\Bin\dclite60.bpl=Borland Integrated Translation Environment
|
||||||
|
|
||||||
|
[HistoryLists\hlIncludePath]
|
||||||
|
Count=1
|
||||||
|
Item0=C:\Archivos de programa\Borland\CBuilder6\Projects;C:\Documents and Settings\jd\Mis documentos\CBuilder\LiveUpdate\src;$(BCB)\include;$(BCB)\include\vcl
|
||||||
|
|
||||||
|
[HistoryLists\hlLibraryPath]
|
||||||
|
Count=1
|
||||||
|
Item0=C:\Archivos de programa\Borland\CBuilder6\Projects;C:\Documents and Settings\jd\Mis documentos\CBuilder\LiveUpdate\src;C:\programacion\VCLs\lib;$(BCB)\lib\obj;$(BCB)\lib
|
||||||
|
|
||||||
|
[HistoryLists\hlDebugSourcePath]
|
||||||
|
Count=1
|
||||||
|
Item0=$(BCB)\source\vcl
|
||||||
|
|
||||||
|
[HistoryLists\hlConditionals]
|
||||||
|
Count=1
|
||||||
|
Item0=_DEBUG
|
||||||
|
|
||||||
|
[HistoryLists\hlIntOutputDir]
|
||||||
|
Count=1
|
||||||
|
Item0=..\obj
|
||||||
|
|
||||||
|
[HistoryLists\hlFinalOutputDir]
|
||||||
|
Count=2
|
||||||
|
Item0=..\bin\
|
||||||
|
Item1=..\bin
|
||||||
|
|
||||||
|
[HistoryLists\hIBPIOutputDir]
|
||||||
|
Count=1
|
||||||
|
Item0=..\obj
|
||||||
|
|
||||||
|
[Debugging]
|
||||||
|
DebugSourceDirs=$(BCB)\source\vcl
|
||||||
|
|
||||||
|
[Parameters]
|
||||||
|
RunParams=
|
||||||
|
Launcher=
|
||||||
|
UseLauncher=0
|
||||||
|
DebugCWD=
|
||||||
|
HostApplication=
|
||||||
|
RemoteHost=
|
||||||
|
RemotePath=
|
||||||
|
RemoteLauncher=
|
||||||
|
RemoteCWD=
|
||||||
|
RemoteDebug=0
|
||||||
|
|
||||||
|
[Compiler]
|
||||||
|
ShowInfoMsgs=0
|
||||||
|
LinkDebugVcl=0
|
||||||
|
LinkCGLIB=0
|
||||||
|
|
||||||
|
[CORBA]
|
||||||
|
AddServerUnit=1
|
||||||
|
AddClientUnit=1
|
||||||
|
PrecompiledHeaders=1
|
||||||
|
</IDEOPTIONS>
|
||||||
|
</PROJECT>
|
33
src/LiveUpdate.cpp
Normal file
33
src/LiveUpdate.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <vcl.h>
|
||||||
|
#pragma hdrstop
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
USEFORM("interfaz.cpp", Form1);
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Application->Initialize();
|
||||||
|
Application->CreateForm(__classid(TForm1), &Form1);
|
||||||
|
Application->Run();
|
||||||
|
}
|
||||||
|
catch (Exception &exception)
|
||||||
|
{
|
||||||
|
Application->ShowException(&exception);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
throw Exception("");
|
||||||
|
}
|
||||||
|
catch (Exception &exception)
|
||||||
|
{
|
||||||
|
Application->ShowException(&exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
BIN
src/LiveUpdate.res
Normal file
BIN
src/LiveUpdate.res
Normal file
Binary file not shown.
354
src/TMD5.cpp
Normal file
354
src/TMD5.cpp
Normal file
@ -0,0 +1,354 @@
|
|||||||
|
/*
|
||||||
|
Resumen MD5
|
||||||
|
Autor: José David Guillén
|
||||||
|
|
||||||
|
Basado en el fuente PASCAL de Dimka Maslov }
|
||||||
|
|
||||||
|
Derived from the RSA Data Security, Inc.
|
||||||
|
MD5 Message-Digest Algorithm described in RFC 1321
|
||||||
|
http://www.faqs.org/rfcs/rfc1321.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "TMD5.hpp"
|
||||||
|
|
||||||
|
#include <mem.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Constants for MD5Transform routine.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define S11 7
|
||||||
|
#define S12 12
|
||||||
|
#define S13 17
|
||||||
|
#define S14 22
|
||||||
|
#define S21 5
|
||||||
|
#define S22 9
|
||||||
|
#define S23 14
|
||||||
|
#define S24 20
|
||||||
|
#define S31 4
|
||||||
|
#define S32 11
|
||||||
|
#define S33 16
|
||||||
|
#define S34 23
|
||||||
|
#define S41 6
|
||||||
|
#define S42 10
|
||||||
|
#define S43 15
|
||||||
|
#define S44 21
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned char PADDING[64] = {
|
||||||
|
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
/* F, G, H and I are basic MD5 functions.
|
||||||
|
*/
|
||||||
|
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
|
||||||
|
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
|
||||||
|
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||||
|
#define I(x, y, z) ((y) ^ ((x) | (~z)))
|
||||||
|
|
||||||
|
/* ROTATE_LEFT rotates x left n bits.
|
||||||
|
*/
|
||||||
|
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
|
||||||
|
|
||||||
|
|
||||||
|
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
|
||||||
|
Rotation is separate from addition to prevent recomputation.
|
||||||
|
*/
|
||||||
|
#define FF(a, b, c, d, x, s, ac) { \
|
||||||
|
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
|
||||||
|
(a) = ROTATE_LEFT ((a), (s)); \
|
||||||
|
(a) += (b); \
|
||||||
|
}
|
||||||
|
#define GG(a, b, c, d, x, s, ac) { \
|
||||||
|
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
|
||||||
|
(a) = ROTATE_LEFT ((a), (s)); \
|
||||||
|
(a) += (b); \
|
||||||
|
}
|
||||||
|
#define HH(a, b, c, d, x, s, ac) { \
|
||||||
|
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
|
||||||
|
(a) = ROTATE_LEFT ((a), (s)); \
|
||||||
|
(a) += (b); \
|
||||||
|
}
|
||||||
|
#define II(a, b, c, d, x, s, ac) { \
|
||||||
|
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
|
||||||
|
(a) = ROTATE_LEFT ((a), (s)); \
|
||||||
|
(a) += (b); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5Encode(unsigned char *Output, UINT4 *Input, const unsigned int Len)
|
||||||
|
{
|
||||||
|
UINT4 i,j;
|
||||||
|
|
||||||
|
for (i = 0, j = 0; j < Len; i++, j += 4)
|
||||||
|
{
|
||||||
|
Output[j] = (unsigned char)(Input[i] & 0xFF);
|
||||||
|
Output[j+1] = (unsigned char)( (Input[i] >> 8 ) & 0xFF);
|
||||||
|
Output[j+2] = (unsigned char)( (Input[i] >> 16 ) & 0xFF);
|
||||||
|
Output[j+3] = (unsigned char)( (Input[i] >> 24 ) & 0xFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5Decode(UINT4 *Output, const unsigned char *Input, const UINT4 Len)
|
||||||
|
{
|
||||||
|
UINT4 i,j;
|
||||||
|
|
||||||
|
for (i = 0, j = 0; j < Len; i++, j += 4)
|
||||||
|
Output[i] = ((UINT4)(Input[j])) | ((UINT4)(Input[j+1]) << 8) |
|
||||||
|
((UINT4)(Input[j+2]) << 16) | ((UINT4)(Input[j+3]) << 24);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5_memcpy(PByteArray Output, const PByteArray Input, UINT4 Len)
|
||||||
|
{
|
||||||
|
memcpy( Output, Input, Len );
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5_memset(PByteArray Output, int Value, UINT4 Len)
|
||||||
|
{
|
||||||
|
setmem( Output, Len, (Byte)Value );
|
||||||
|
/*
|
||||||
|
for ( ; Len>0; Len-- )
|
||||||
|
Output[Len-1] = (Byte)Value;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5Transform(UINT4 State[4], const unsigned char Buffer[64])
|
||||||
|
{
|
||||||
|
UINT4 a,b,c,d;
|
||||||
|
UINT4 x[16];
|
||||||
|
|
||||||
|
a=State[0]; b=State[1]; c=State[2]; d=State[3];
|
||||||
|
|
||||||
|
MD5Decode( x, Buffer, 64);
|
||||||
|
|
||||||
|
/* Round 1 */
|
||||||
|
FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
|
||||||
|
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
|
||||||
|
FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
|
||||||
|
FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
|
||||||
|
FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
|
||||||
|
FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
|
||||||
|
FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
|
||||||
|
FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
|
||||||
|
FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
|
||||||
|
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
|
||||||
|
FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
|
||||||
|
FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
|
||||||
|
FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
|
||||||
|
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
|
||||||
|
FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
|
||||||
|
FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
|
||||||
|
|
||||||
|
/* Round 2 */
|
||||||
|
GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
|
||||||
|
GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
|
||||||
|
GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
|
||||||
|
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
|
||||||
|
GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
|
||||||
|
GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
|
||||||
|
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
|
||||||
|
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
|
||||||
|
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
|
||||||
|
GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
|
||||||
|
GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
|
||||||
|
|
||||||
|
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
|
||||||
|
GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
|
||||||
|
GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
|
||||||
|
GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
|
||||||
|
GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
|
||||||
|
|
||||||
|
/* Round 3 */
|
||||||
|
HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
|
||||||
|
HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
|
||||||
|
HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
|
||||||
|
HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
|
||||||
|
HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
|
||||||
|
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
|
||||||
|
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
|
||||||
|
HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
|
||||||
|
HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
|
||||||
|
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
|
||||||
|
HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
|
||||||
|
HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
|
||||||
|
HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
|
||||||
|
HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
|
||||||
|
HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
|
||||||
|
HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
|
||||||
|
|
||||||
|
/* Round 4 */
|
||||||
|
II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
|
||||||
|
II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
|
||||||
|
II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
|
||||||
|
II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
|
||||||
|
II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
|
||||||
|
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
|
||||||
|
II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
|
||||||
|
II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
|
||||||
|
II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
|
||||||
|
II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
|
||||||
|
II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
|
||||||
|
II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
|
||||||
|
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
|
||||||
|
II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
|
||||||
|
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
|
||||||
|
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
|
||||||
|
|
||||||
|
State[0] += a;
|
||||||
|
State[1] += b;
|
||||||
|
State[2] += c;
|
||||||
|
State[3] += d;
|
||||||
|
|
||||||
|
MD5_memset( (PByteArray)x, 0, sizeof(x) );
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5Init(TMD5Context *Context)
|
||||||
|
{
|
||||||
|
setmem( (void *)Context, sizeof(TMD5Context), 0);
|
||||||
|
|
||||||
|
Context->state[0] = 0x67452301;
|
||||||
|
Context->state[1] = 0xefcdab89;
|
||||||
|
Context->state[2] = 0x98badcfe;
|
||||||
|
Context->state[3] = 0x10325476;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5Update(TMD5Context *Context, const unsigned char *Input, const unsigned int InputLen)
|
||||||
|
{
|
||||||
|
unsigned int i, index, partLen;
|
||||||
|
|
||||||
|
/* Compute number of bytes mod 64 */
|
||||||
|
index = (unsigned int)((Context->count[0] >> 3) & 0x3F);
|
||||||
|
|
||||||
|
/* Update number of bits */
|
||||||
|
if ((Context->count[0] += ((UINT4)InputLen << 3)) < ((UINT4)InputLen << 3))
|
||||||
|
Context->count[1]++;
|
||||||
|
Context->count[1] += ((UINT4)InputLen >> 29);
|
||||||
|
|
||||||
|
partLen = 64 - index;
|
||||||
|
|
||||||
|
/* Transform as many times as possible.*/
|
||||||
|
if (InputLen >= partLen)
|
||||||
|
{
|
||||||
|
MD5_memcpy((PByteArray)&Context->buffer[index], (PByteArray)Input, partLen);
|
||||||
|
MD5Transform (Context->state, Context->buffer);
|
||||||
|
|
||||||
|
for (i = partLen; i + 63 < InputLen; i += 64)
|
||||||
|
MD5Transform (Context->state, &Input[i]);
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
/* Buffer remaining input */
|
||||||
|
MD5_memcpy((PByteArray)&Context->buffer[index], (PByteArray)&Input[i], InputLen-i);
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void __fastcall TMD5::MD5Final(unsigned char Digest[16], TMD5Context *Context)
|
||||||
|
{
|
||||||
|
unsigned char bits[8];
|
||||||
|
UINT4 index, padLen;
|
||||||
|
|
||||||
|
MD5Encode( bits, Context->count, 8);
|
||||||
|
|
||||||
|
index = (UINT4)( ( Context->count[0] >> 3) & 0x3F);
|
||||||
|
padLen = (index < 56) ? (56 - index) : (120 - index);
|
||||||
|
MD5Update(Context, PADDING, padLen);
|
||||||
|
|
||||||
|
MD5Update(Context, bits, 8);
|
||||||
|
|
||||||
|
MD5Encode(Digest, Context->state, 16);
|
||||||
|
|
||||||
|
MD5_memset((PByteArray)Context, 0, sizeof(*Context));
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
AnsiString __fastcall TMD5::MD5DigestToStr(const TMD5Digest &Digest)
|
||||||
|
{
|
||||||
|
AnsiString Result;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Result="";
|
||||||
|
for ( i=0; i<=15; i++ )
|
||||||
|
Result = Result + IntToHex(Digest.v[i], 2);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
TMD5Digest __fastcall TMD5::MD5String(const AnsiString S)
|
||||||
|
{
|
||||||
|
return MD5Buffer((PChar)S.c_str(), S.Length());
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
TMD5Digest __fastcall TMD5::MD5File(const AnsiString FileName)
|
||||||
|
{
|
||||||
|
TMD5Digest Result;
|
||||||
|
TFileStream *F;
|
||||||
|
|
||||||
|
F = new TFileStream(FileName, fmOpenRead);
|
||||||
|
try {
|
||||||
|
Result=MD5Stream(F);
|
||||||
|
} __finally {
|
||||||
|
delete F;
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/* Classes::*/
|
||||||
|
TMD5Digest __fastcall TMD5::MD5Stream(const Classes::TStream *Stream)
|
||||||
|
{
|
||||||
|
TMD5Context Context;
|
||||||
|
TMD5Digest Result;
|
||||||
|
Byte Buffer[4096];
|
||||||
|
int Size;
|
||||||
|
int ReadBytes;
|
||||||
|
int TotalBytes;
|
||||||
|
int SavePos;
|
||||||
|
|
||||||
|
MD5Init(&Context);
|
||||||
|
Size=Stream->Size;
|
||||||
|
SavePos=Stream->Position;
|
||||||
|
TotalBytes=0;
|
||||||
|
try {
|
||||||
|
Stream->Seek(0, soFromBeginning);
|
||||||
|
do {
|
||||||
|
ReadBytes=Stream->Read(Buffer, sizeof(Buffer));
|
||||||
|
TotalBytes+=ReadBytes;
|
||||||
|
MD5Update(&Context, Buffer, ReadBytes);
|
||||||
|
} while( !( (ReadBytes == 0) || (TotalBytes == Size) ) );
|
||||||
|
} __finally {
|
||||||
|
Stream->Seek(SavePos, soFromBeginning);
|
||||||
|
}
|
||||||
|
MD5Final((unsigned char *)&Result, &Context);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
TMD5Digest __fastcall TMD5::MD5Buffer(const void *Buffer, int Size)
|
||||||
|
{
|
||||||
|
TMD5Context Context;
|
||||||
|
TMD5Digest Result;
|
||||||
|
|
||||||
|
MD5Init(&Context);
|
||||||
|
MD5Update(&Context, (unsigned char *)Buffer, Size);
|
||||||
|
MD5Final((unsigned char *)&Result, &Context);
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
bool __fastcall TMD5::MD5DigestCompare(const TMD5Digest &Digest1, const TMD5Digest &Digest2)
|
||||||
|
{
|
||||||
|
bool Result;
|
||||||
|
|
||||||
|
Result=true;
|
||||||
|
if (Digest1.A != Digest2.A) Result=false;
|
||||||
|
if (Digest1.B != Digest2.B) Result=false;
|
||||||
|
if (Digest1.C != Digest2.C) Result=false;
|
||||||
|
if (Digest1.D != Digest2.D) Result=false;
|
||||||
|
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
76
src/TMD5.hpp
Normal file
76
src/TMD5.hpp
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#ifndef tmd5HPP
|
||||||
|
#define tmd5HPP
|
||||||
|
|
||||||
|
#include <Classes.hpp> // Pascal unit
|
||||||
|
#include <SysUtils.hpp> // Pascal unit
|
||||||
|
#include <Windows.hpp> // Pascal unit
|
||||||
|
#include <SysInit.hpp> // Pascal unit
|
||||||
|
#include <System.hpp> // Pascal unit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct TMD5Digest
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
Byte v[16];
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int A, B, C, D;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} *PMD5Digest;
|
||||||
|
|
||||||
|
/* TIPOS */
|
||||||
|
typedef unsigned long int UINT4;
|
||||||
|
/*
|
||||||
|
typedef UINT4 TArray4UINT4[4];
|
||||||
|
typedef TArray4UINT4 *PArray4UINT4;
|
||||||
|
typedef UINT4 TArray2UINT4[2];
|
||||||
|
typedef TArray2UINT4 *PArray2UINT4;
|
||||||
|
typedef Byte TArray16Byte[16];
|
||||||
|
typedef TArray16Byte *PArray16Byte;
|
||||||
|
typedef Byte TArray64Byte[64];
|
||||||
|
typedef TArray64Byte *PArray64Byte;
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
typedef Byte TByteArray;
|
||||||
|
typedef TByteArray *PByteArray;
|
||||||
|
*/
|
||||||
|
typedef UINT4 TUINT4Array;
|
||||||
|
typedef TUINT4Array *PUINT4Array;
|
||||||
|
|
||||||
|
struct TMD5Context
|
||||||
|
{
|
||||||
|
UINT4 state[4];
|
||||||
|
UINT4 count[2];
|
||||||
|
unsigned char buffer[64];
|
||||||
|
};
|
||||||
|
typedef TMD5Context *PMD5Context;
|
||||||
|
|
||||||
|
class TMD5 {
|
||||||
|
private:
|
||||||
|
/* FUNCIONES */
|
||||||
|
void __fastcall MD5Encode(unsigned char *Output, UINT4 *Input, const unsigned int Len);
|
||||||
|
void __fastcall MD5Decode(UINT4 *Output, const unsigned char *Input, const UINT4 Len);
|
||||||
|
void __fastcall MD5_memcpy(PByteArray Output, const PByteArray Input, UINT4 Len);
|
||||||
|
void __fastcall MD5_memset(PByteArray Output, int Value, UINT4 Len);
|
||||||
|
void __fastcall MD5Transform(UINT4 State[4], const unsigned char Buffer[64]);
|
||||||
|
void __fastcall MD5Init(TMD5Context *Context);
|
||||||
|
void __fastcall MD5Update(TMD5Context *Context, const unsigned char *Input, const unsigned int InputLen);
|
||||||
|
void __fastcall MD5Final(unsigned char *Digest, TMD5Context *Context);
|
||||||
|
|
||||||
|
public:
|
||||||
|
AnsiString __fastcall MD5DigestToStr(const TMD5Digest &Digest);
|
||||||
|
TMD5Digest __fastcall MD5String(const AnsiString S);
|
||||||
|
TMD5Digest __fastcall MD5File(const AnsiString FileName);
|
||||||
|
TMD5Digest __fastcall MD5Stream(const Classes::TStream* Stream);
|
||||||
|
TMD5Digest __fastcall MD5Buffer(const void *Buffer, int Size);
|
||||||
|
bool __fastcall MD5DigestCompare(const TMD5Digest &Digest1, const TMD5Digest &Digest2);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TMD5
|
394
src/donwloads.cpp
Normal file
394
src/donwloads.cpp
Normal file
@ -0,0 +1,394 @@
|
|||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <vcl.h>
|
||||||
|
#include <wininet.h>
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
// To resolve externals
|
||||||
|
// such as HttpOpenRequestA, InternetCrackUrlA,
|
||||||
|
// InternetReadFile, InternetCloseHandle,
|
||||||
|
// HttpSendRequestA, HttpQueryInfoA, and InternetOpenA
|
||||||
|
#pragma comment(lib, "WinInet.lib")
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "donwloads.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#pragma package(smart_init)
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Important: Methods and properties of objects in VCL can only be
|
||||||
|
// used in a method called using Synchronize, for example:
|
||||||
|
//
|
||||||
|
// Synchronize(UpdateCaption);
|
||||||
|
//
|
||||||
|
// where UpdateCaption could look like:
|
||||||
|
//
|
||||||
|
// void __fastcall downloads::UpdateCaption()
|
||||||
|
// {
|
||||||
|
// Form1->Caption = "Updated in a thread";
|
||||||
|
// }
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
__fastcall downloads::downloads(bool CreateSuspended)
|
||||||
|
: TThread(CreateSuspended)
|
||||||
|
{
|
||||||
|
// CreateSuspended = true;
|
||||||
|
file_target = NULL;
|
||||||
|
url_source = NULL;
|
||||||
|
validURL = false;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
bool __fastcall downloads::downloadFile( char *filename, char *url )
|
||||||
|
{
|
||||||
|
bGotFileSize = false;
|
||||||
|
file_target = filename;
|
||||||
|
url_source = url;
|
||||||
|
|
||||||
|
AnsiString m_sURLToDownload = AnsiString(url);
|
||||||
|
|
||||||
|
validURL=true;
|
||||||
|
//Validate the URL
|
||||||
|
URL_COMPONENTS uc;
|
||||||
|
TCHAR achHostName[256];
|
||||||
|
TCHAR achUrlPath[256];
|
||||||
|
memset( &uc, 0, sizeof(uc) );
|
||||||
|
uc.dwStructSize = sizeof(uc);
|
||||||
|
uc.lpszHostName = achHostName;
|
||||||
|
uc.dwHostNameLength = 256;
|
||||||
|
uc.lpszUrlPath = achUrlPath;
|
||||||
|
uc.dwUrlPathLength = 256;
|
||||||
|
|
||||||
|
if (!InternetCrackUrl((char *)m_sURLToDownload.data(), 0, ICU_ESCAPE, &uc ))
|
||||||
|
{
|
||||||
|
//Try sticking "http://" before it
|
||||||
|
m_sURLToDownload = AnsiString("http://") + m_sURLToDownload;
|
||||||
|
if (!InternetCrackUrl((char *)m_sURLToDownload.data(), m_sURLToDownload.Length(), 0, &uc ))
|
||||||
|
// if (!AfxParseURL(m_sURLToDownload, m_dwServiceType, m_sServer, m_sObject, m_nPort))
|
||||||
|
validURL=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( validURL )
|
||||||
|
{
|
||||||
|
m_dwServiceType = uc.nScheme;
|
||||||
|
m_sServer = uc.lpszHostName;
|
||||||
|
m_sObject = uc.lpszUrlPath;
|
||||||
|
m_nPort = uc.nPort;
|
||||||
|
m_sUserName = uc.lpszUserName;
|
||||||
|
m_sPassword = uc.lpszPassword;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return validURL;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void CALLBACK downloads::OnStatusCallBack(HINTERNET hInternet, DWORD dwContext, DWORD dwInternetStatus,
|
||||||
|
LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
|
||||||
|
{
|
||||||
|
//Convert from the SDK C world to the C++ world
|
||||||
|
downloads* pDlg = (downloads*) dwContext;
|
||||||
|
|
||||||
|
switch (dwInternetStatus)
|
||||||
|
{
|
||||||
|
case INTERNET_STATUS_RESOLVING_NAME:
|
||||||
|
{
|
||||||
|
pDlg->SetStatus((LPCTSTR) lpvStatusInformation); /*"RESOLVING_NAME:: ", */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case INTERNET_STATUS_NAME_RESOLVED:
|
||||||
|
{
|
||||||
|
pDlg->SetStatus((LPCTSTR) lpvStatusInformation); /*"RESOLVED_NAME:: ", */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case INTERNET_STATUS_CONNECTING_TO_SERVER:
|
||||||
|
{
|
||||||
|
pDlg->SetStatus((LPCTSTR) lpvStatusInformation); /*"CONNECTING:: ", */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case INTERNET_STATUS_CONNECTED_TO_SERVER:
|
||||||
|
{
|
||||||
|
pDlg->SetStatus((LPCTSTR) lpvStatusInformation); /*"CONNECTED:: ", */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case INTERNET_STATUS_REDIRECT:
|
||||||
|
{
|
||||||
|
pDlg->SetStatus((LPCTSTR) lpvStatusInformation); /*"REDIRECTING:: ", */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::SetStatus(const char *sCaption)
|
||||||
|
{
|
||||||
|
// Actualizar aqui la barra de estados
|
||||||
|
// m_ctrlStatus.SetWindowText(sCaption);
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::updateTimeLeft(void)
|
||||||
|
{
|
||||||
|
if ( labelTimeLeft )
|
||||||
|
labelTimeLeft->Caption=msg;
|
||||||
|
}
|
||||||
|
void __fastcall downloads::updateTransferRate(void)
|
||||||
|
{
|
||||||
|
if ( labelTransferRate )
|
||||||
|
labelTransferRate->Caption=msg;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::updateProgress(void)
|
||||||
|
{
|
||||||
|
if ( m_ctrlProgress )
|
||||||
|
m_ctrlProgress->Position=passINT;
|
||||||
|
}
|
||||||
|
void __fastcall downloads::SetPercentage(int nPercentage)
|
||||||
|
{
|
||||||
|
passINT = nPercentage;
|
||||||
|
Synchronize( updateProgress );
|
||||||
|
}
|
||||||
|
void __fastcall downloads::SetProgress(DWORD dwBytesRead)
|
||||||
|
{
|
||||||
|
passINT = dwBytesRead/1024;
|
||||||
|
Synchronize( updateProgress );
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::updateProgressRange()
|
||||||
|
{
|
||||||
|
if ( m_ctrlProgress )
|
||||||
|
m_ctrlProgress->Max=passINT;
|
||||||
|
}
|
||||||
|
void __fastcall downloads::SetProgressRange(DWORD dwFileSize)
|
||||||
|
{
|
||||||
|
passINT = (short)((dwFileSize+512)/1024);
|
||||||
|
Synchronize( updateProgressRange );
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::Execute()
|
||||||
|
{
|
||||||
|
//---- Place thread code here ----
|
||||||
|
if (!validURL) return;
|
||||||
|
HINTERNET m_hInternetSession, m_hHttpFile, m_hHttpConnection;
|
||||||
|
FILE *fout;
|
||||||
|
|
||||||
|
if ( (fout = fopen( file_target, "w" ))!=NULL )
|
||||||
|
{
|
||||||
|
|
||||||
|
//URLDownloadToFile(
|
||||||
|
|
||||||
|
try {
|
||||||
|
// while (!Terminated)
|
||||||
|
{
|
||||||
|
m_hInternetSession = InternetOpen("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
|
||||||
|
if ( m_hInternetSession )
|
||||||
|
{
|
||||||
|
// Configuramos la funcion "callback"
|
||||||
|
if(InternetSetStatusCallback(m_hInternetSession, OnStatusCallBack)!=INTERNET_INVALID_STATUS_CALLBACK)
|
||||||
|
{
|
||||||
|
// hFile = InternetOpenUrl( hINet, url_source, NULL, 0, 0, 0 ) ;
|
||||||
|
|
||||||
|
//Make the connection to the HTTP server
|
||||||
|
if (m_sUserName.data()!=NULL)
|
||||||
|
m_hHttpConnection = ::InternetConnect(m_hInternetSession, (char *)m_sServer.data(), m_nPort, (char *)m_sUserName.data(),
|
||||||
|
(char *)m_sPassword.data(), m_dwServiceType, 0, (DWORD) this);
|
||||||
|
else
|
||||||
|
m_hHttpConnection = ::InternetConnect(m_hInternetSession, (char *)m_sServer.data(), m_nPort, NULL,
|
||||||
|
NULL, m_dwServiceType, 0, (DWORD) this);
|
||||||
|
if ( m_hHttpConnection )
|
||||||
|
{
|
||||||
|
|
||||||
|
//Issue the request to read the file
|
||||||
|
char *ppszAcceptTypes[2]={"*/*",NULL};
|
||||||
|
|
||||||
|
// strcpy( ppszAcceptTypes[0], "*/*"); //We support accepting any mime file type since this is a simple download of a file
|
||||||
|
// ppszAcceptTypes[1] = NULL;
|
||||||
|
|
||||||
|
m_hHttpFile = HttpOpenRequest(m_hHttpConnection, NULL, (char *)m_sObject.data(), NULL, NULL, (const char **)ppszAcceptTypes, INTERNET_FLAG_RELOAD |
|
||||||
|
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_KEEP_CONNECTION, (DWORD) this);
|
||||||
|
|
||||||
|
if ( m_hHttpFile )
|
||||||
|
{
|
||||||
|
if ( ::HttpSendRequest(m_hHttpFile, NULL, 0, NULL, 0) )
|
||||||
|
{
|
||||||
|
//Check the HTTP status code
|
||||||
|
TCHAR szStatusCode[32];
|
||||||
|
DWORD dwInfoSize = 32;
|
||||||
|
if (HttpQueryInfo(m_hHttpFile, HTTP_QUERY_STATUS_CODE, szStatusCode, &dwInfoSize, NULL))
|
||||||
|
{
|
||||||
|
|
||||||
|
//Update the status control to reflect that we are getting the file information
|
||||||
|
SetStatus("Obteniendo informacion del archivo");
|
||||||
|
|
||||||
|
// Get the length of the file.
|
||||||
|
TCHAR szContentLength[32];
|
||||||
|
DWORD dwInfoSize = 32;
|
||||||
|
DWORD dwFileSize = 0;
|
||||||
|
BOOL bGotFileSize = FALSE;
|
||||||
|
if (HttpQueryInfo(m_hHttpFile, HTTP_QUERY_CONTENT_LENGTH, szContentLength, &dwInfoSize, NULL))
|
||||||
|
{
|
||||||
|
//Set the progress control range
|
||||||
|
bGotFileSize = true;
|
||||||
|
dwFileSize = (DWORD) AnsiString(szContentLength).ToDouble();
|
||||||
|
SetProgressRange(dwFileSize);
|
||||||
|
}
|
||||||
|
//Update the status to say that we are now downloading the file
|
||||||
|
SetStatus("Descargando fichero");
|
||||||
|
|
||||||
|
DWORD dwStartTicks = ::GetTickCount();
|
||||||
|
DWORD dwCurrentTicks = dwStartTicks;
|
||||||
|
DWORD dwBytesRead = 0;
|
||||||
|
char szReadBuf[1024];
|
||||||
|
DWORD dwBytesToRead = 1024;
|
||||||
|
DWORD dwTotalBytesRead = 0;
|
||||||
|
DWORD dwLastTotalBytes = 0;
|
||||||
|
DWORD dwLastPercentage = 0;
|
||||||
|
while ( !Terminated && InternetReadFile( m_hHttpFile, szReadBuf, dwBytesToRead, &dwBytesRead ) )
|
||||||
|
{
|
||||||
|
if ( dwBytesRead == 0 ) break;
|
||||||
|
fwrite( szReadBuf, dwBytesRead, 1, fout );
|
||||||
|
|
||||||
|
//Increment the total number of bytes read
|
||||||
|
dwTotalBytesRead += dwBytesRead;
|
||||||
|
UpdateControlsDuringTransfer(dwStartTicks, dwCurrentTicks, dwTotalBytesRead, dwLastTotalBytes,
|
||||||
|
dwLastPercentage, bGotFileSize, dwFileSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InternetCloseHandle( m_hHttpFile );
|
||||||
|
} // OpenRequest
|
||||||
|
InternetCloseHandle( m_hHttpConnection );
|
||||||
|
} // InternetConnect
|
||||||
|
} // InternetCallBack
|
||||||
|
InternetCloseHandle( m_hInternetSession );
|
||||||
|
} // InternetOpen
|
||||||
|
}
|
||||||
|
} catch(...) {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
|
fclose(fout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::UpdateControlsDuringTransfer(DWORD dwStartTicks, DWORD& dwCurrentTicks, DWORD dwTotalBytesRead, DWORD& dwLastTotalBytes,
|
||||||
|
DWORD& dwLastPercentage, BOOL bGotFileSize, DWORD dwFileSize)
|
||||||
|
{
|
||||||
|
if (bGotFileSize)
|
||||||
|
{
|
||||||
|
//Update the percentage downloaded in the caption
|
||||||
|
DWORD dwPercentage = (DWORD) (dwTotalBytesRead * 100.0 / dwFileSize);
|
||||||
|
if (dwPercentage != dwLastPercentage)
|
||||||
|
{
|
||||||
|
SetPercentage(dwPercentage);
|
||||||
|
dwLastPercentage = dwPercentage;
|
||||||
|
|
||||||
|
//Update the progress control bar
|
||||||
|
SetProgress(dwTotalBytesRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update the transfer rate amd estimated time left every second
|
||||||
|
DWORD dwNowTicks = GetTickCount();
|
||||||
|
DWORD dwTimeTaken = dwNowTicks - dwCurrentTicks;
|
||||||
|
if (dwTimeTaken > 1000)
|
||||||
|
{
|
||||||
|
double KbPerSecond = ((double)(dwTotalBytesRead) - (double)(dwLastTotalBytes)) / ((double)(dwTimeTaken));
|
||||||
|
SetTransferRate(KbPerSecond);
|
||||||
|
|
||||||
|
//Setup for the next time around the loop
|
||||||
|
dwCurrentTicks = dwNowTicks;
|
||||||
|
dwLastTotalBytes = dwTotalBytesRead;
|
||||||
|
|
||||||
|
if (bGotFileSize)
|
||||||
|
{
|
||||||
|
//Update the estimated time left
|
||||||
|
if (dwTotalBytesRead)
|
||||||
|
{
|
||||||
|
DWORD dwSecondsLeft = (DWORD) (((double)dwNowTicks - dwStartTicks) / dwTotalBytesRead *
|
||||||
|
(dwFileSize - dwTotalBytesRead) / 1000);
|
||||||
|
SetTimeLeft(dwSecondsLeft, dwTotalBytesRead, dwFileSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::SetTransferRate(double KbPerSecond)
|
||||||
|
{
|
||||||
|
AnsiString sRate;
|
||||||
|
if (KbPerSecond < 1)
|
||||||
|
{
|
||||||
|
sRate.printf("%0.0f Bytes/seg", KbPerSecond*1024);
|
||||||
|
}
|
||||||
|
else if (KbPerSecond < 10)
|
||||||
|
{
|
||||||
|
sRate.printf("%0.2f KB/seg", KbPerSecond);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sRate.printf("%0.0f KB/seg", KbPerSecond);
|
||||||
|
}
|
||||||
|
msg=sRate;
|
||||||
|
Synchronize( updateTransferRate );
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall downloads::SetTimeLeft(DWORD dwSecondsLeft, DWORD dwBytesRead, DWORD dwFileSize)
|
||||||
|
{
|
||||||
|
AnsiString sCopied;
|
||||||
|
if (dwBytesRead < 1024)
|
||||||
|
{
|
||||||
|
sCopied.printf("%d Bytes", dwBytesRead );
|
||||||
|
}
|
||||||
|
else if (dwBytesRead < 1048576)
|
||||||
|
{
|
||||||
|
sCopied.printf("%0.1f KB",dwBytesRead/1024.0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sCopied.printf("%0.2f MB",dwBytesRead/1048576.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AnsiString sTotal;
|
||||||
|
if (dwFileSize < 1024)
|
||||||
|
{
|
||||||
|
sTotal.printf("%d Bytes", dwFileSize);
|
||||||
|
}
|
||||||
|
else if (dwFileSize < 1048576)
|
||||||
|
{
|
||||||
|
sTotal.printf("%0.1f KB", dwFileSize/1024.0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sTotal.printf("%0.1f MB", dwFileSize/1048576.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
AnsiString sOf;
|
||||||
|
sOf = sCopied+" de "+sTotal;
|
||||||
|
|
||||||
|
AnsiString sTime;
|
||||||
|
if (dwSecondsLeft < 60)
|
||||||
|
{
|
||||||
|
sTime.printf("%d seg",dwSecondsLeft);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD dwMinutes = dwSecondsLeft / 60;
|
||||||
|
DWORD dwSeconds = dwSecondsLeft % 60;
|
||||||
|
|
||||||
|
if (dwSeconds == 0)
|
||||||
|
sTime.printf("%d min", dwMinutes);
|
||||||
|
else
|
||||||
|
sTime.printf("%d min %d seg", dwMinutes, dwSeconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AnsiString sTimeLeft;
|
||||||
|
sTimeLeft.printf( "%s (%s copiado)",sTime,sOf);
|
||||||
|
|
||||||
|
msg = sTimeLeft;
|
||||||
|
Synchronize( updateTimeLeft );
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
53
src/donwloads.h
Normal file
53
src/donwloads.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef donwloadsH
|
||||||
|
#define donwloadsH
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#include <ComCtrls.hpp>
|
||||||
|
#include <Classes.hpp>
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
class downloads : public TThread
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int passINT;
|
||||||
|
AnsiString msg;
|
||||||
|
|
||||||
|
DWORD m_dwServiceType,m_nPort;
|
||||||
|
AnsiString m_sServer, m_sObject, m_sUserName, m_sPassword;
|
||||||
|
|
||||||
|
|
||||||
|
bool bGotFileSize, validURL;
|
||||||
|
|
||||||
|
void __fastcall SetStatus(const char *sCaption);
|
||||||
|
|
||||||
|
void __fastcall updateTimeLeft(void);
|
||||||
|
void __fastcall updateTransferRate(void);
|
||||||
|
void __fastcall SetTransferRate(double KbPerSecond);
|
||||||
|
|
||||||
|
void __fastcall updateProgress(void);
|
||||||
|
void __fastcall SetPercentage(int nPercentage);
|
||||||
|
void __fastcall SetProgress(DWORD dwBytesRead);
|
||||||
|
void __fastcall updateProgressRange(void);
|
||||||
|
void __fastcall SetProgressRange(DWORD dwFileSize);
|
||||||
|
void __fastcall SetTimeLeft(DWORD dwSecondsLeft, DWORD dwBytesRead, DWORD dwFileSize);
|
||||||
|
|
||||||
|
void __fastcall UpdateControlsDuringTransfer(DWORD dwStartTicks, DWORD& dwCurrentTicks, DWORD dwTotalBytesRead, DWORD& dwLastTotalBytes,
|
||||||
|
DWORD& dwLastPercentage, BOOL bGotFileSize, DWORD dwFileSize);
|
||||||
|
|
||||||
|
|
||||||
|
static void CALLBACK OnStatusCallBack(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus,
|
||||||
|
LPVOID lpvStatusInformation, DWORD dwStatusInformationLength);
|
||||||
|
protected:
|
||||||
|
void __fastcall Execute();
|
||||||
|
char *file_target, *url_source;
|
||||||
|
public:
|
||||||
|
TProgressBar *m_ctrlProgress;
|
||||||
|
TLabel *labelTimeLeft;
|
||||||
|
TLabel *labelTransferRate;
|
||||||
|
|
||||||
|
__fastcall downloads(bool CreateSuspended);
|
||||||
|
bool __fastcall downloadFile( char *filename, char *url );
|
||||||
|
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#endif
|
254
src/interfaz.cpp
Normal file
254
src/interfaz.cpp
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <vcl.h>
|
||||||
|
#include <inifiles.hpp>
|
||||||
|
|
||||||
|
#pragma hdrstop
|
||||||
|
|
||||||
|
#include "interfaz.h"
|
||||||
|
#include "donwloads.h"
|
||||||
|
#include "TMD5.hpp"
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#pragma package(smart_init)
|
||||||
|
#pragma resource "*.dfm"
|
||||||
|
TForm1 *Form1;
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
__fastcall TForm1::TForm1(TComponent* Owner)
|
||||||
|
: TForm(Owner)
|
||||||
|
{
|
||||||
|
TabSheet1->TabVisible = false;
|
||||||
|
TabSheet2->TabVisible = false;
|
||||||
|
TabSheet3->TabVisible = false;
|
||||||
|
PageControl1->ActivePage = TabSheet1;
|
||||||
|
|
||||||
|
checkUpdates = new downloads(true);
|
||||||
|
hiloCorriendo = false;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
|
||||||
|
{
|
||||||
|
SpeedButton1->Visible = false;
|
||||||
|
Label4->Visible = true;
|
||||||
|
ProgressBar1->Visible = true;
|
||||||
|
|
||||||
|
AnsiString ver,url;
|
||||||
|
TIniFile *ini;
|
||||||
|
ini = new TIniFile( ExtractFileDir( Application->ExeName ) + "\\liveUpdate.INI" );
|
||||||
|
app = ini->ReadString( "liveUpdate", "app", "" );
|
||||||
|
login = ini->ReadString( "liveUpdate", "login", "" );
|
||||||
|
pass = ini->ReadString( "liveUpdate", "pass", "" );
|
||||||
|
|
||||||
|
|
||||||
|
TMD5 md5;
|
||||||
|
|
||||||
|
url = "http://updates.infdj.com/checkUpdate.php?app=";
|
||||||
|
// url = "http://www.infdj.com/pages/PortalMusica/db/discos/53_44_c_295_A_Llul - Halo.mp3";
|
||||||
|
|
||||||
|
app = md5.MD5DigestToStr(md5.MD5String(app));
|
||||||
|
if ( !app.IsEmpty() ) url += app;
|
||||||
|
if ( !login.IsEmpty() ) url += "&user="+login;
|
||||||
|
if ( !pass.IsEmpty() ) url += "&pass="+pass;
|
||||||
|
|
||||||
|
checkUpdates->downloadFile( ".\\versions.dat", (char *)url.data() );
|
||||||
|
checkUpdates->m_ctrlProgress=ProgressBar1;
|
||||||
|
checkUpdates->labelTimeLeft=Label4;
|
||||||
|
checkUpdates->labelTransferRate=Label5;
|
||||||
|
checkUpdates->Resume();
|
||||||
|
hiloCorriendo = true;
|
||||||
|
|
||||||
|
checkUpdates->WaitFor();
|
||||||
|
hiloCorriendo = false;
|
||||||
|
|
||||||
|
if ( FileExists(".\\versions.dat" ) )
|
||||||
|
{
|
||||||
|
int nApps; // Nº de aplicaciones que componen el paquete
|
||||||
|
AnsiString msg, app,ver;
|
||||||
|
bool autoexec;
|
||||||
|
TIniFile *upd;
|
||||||
|
upd = new TIniFile( ".\\versions.dat" );
|
||||||
|
|
||||||
|
msg = upd->ReadString( "status", "msg", "error" );
|
||||||
|
if ( msg.Pos("error") > 0 )
|
||||||
|
{
|
||||||
|
ShowMessage(msg);
|
||||||
|
} else {
|
||||||
|
StringGrid1->FixedCols = 0;
|
||||||
|
StringGrid1->ColCount = 3;
|
||||||
|
StringGrid1->Cells[0][0] = "Módulo";
|
||||||
|
StringGrid1->ColWidths[0] = 200;
|
||||||
|
StringGrid1->Cells[1][0] = "versión";
|
||||||
|
StringGrid1->ColWidths[1] = 80;
|
||||||
|
StringGrid1->Cells[2][0] = "exe";
|
||||||
|
StringGrid1->ColWidths[2] = 20;
|
||||||
|
StringGrid1->RowCount = 1;
|
||||||
|
|
||||||
|
nApps = upd->ReadInteger( "apps","lineas",0);
|
||||||
|
for ( int i=1; i<=nApps; i++ )
|
||||||
|
{
|
||||||
|
app = upd->ReadString("apps","l"+AnsiString(i)+"_app","");
|
||||||
|
ver = upd->ReadString("apps","l"+AnsiString(i)+"_ver","");
|
||||||
|
autoexec = upd->ReadBool("apps","l"+AnsiString(i)+"_autoexec",false);
|
||||||
|
|
||||||
|
// Vemos si las versiones son superiores
|
||||||
|
if ( !app.IsEmpty() && !ver.IsEmpty() && ver > ini->ReadString(app,"ver","") )
|
||||||
|
{
|
||||||
|
StringGrid1->RowCount++;
|
||||||
|
StringGrid1->FixedRows = 1;
|
||||||
|
// Añadimos esta aplicacion al listado de descargas...
|
||||||
|
StringGrid1->Cells[0][StringGrid1->RowCount-1] = app;
|
||||||
|
StringGrid1->Cells[1][StringGrid1->RowCount-1] = ver;
|
||||||
|
StringGrid1->Cells[2][StringGrid1->RowCount-1] = autoexec ? "si":"no";
|
||||||
|
}
|
||||||
|
PageControl1->ActivePage = TabSheet2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete upd;
|
||||||
|
}
|
||||||
|
delete ini;
|
||||||
|
|
||||||
|
//
|
||||||
|
// http://updates.infdj.com/checkUpdates.php?app=<MD5("APP")>[&login=<user>&pass=<pwd>]
|
||||||
|
//
|
||||||
|
// Esto devuelve una lista con de los componentes de la APP en el siguiente formato:
|
||||||
|
// (la primera linea de esta lista indicará error o correcto)
|
||||||
|
//
|
||||||
|
// nombre_fichero|version|ruta relativa|tamaño|auto-ejecutar
|
||||||
|
//
|
||||||
|
// Ejm. para el TPVwin
|
||||||
|
//
|
||||||
|
// [status]
|
||||||
|
// msg=<Mensaje de error>
|
||||||
|
// [apps]
|
||||||
|
// lineas=4
|
||||||
|
// l1_app=TPV_ventas.exe
|
||||||
|
// l1_ver=1.0.1
|
||||||
|
// l1_autoexec=no
|
||||||
|
// mySQL_TPV.exe|1.2.0||1334321|no
|
||||||
|
// QR_Preview.exe|1.2.0||133421|no
|
||||||
|
// always_update.exe|1.0||133221|si << Esta puede servir para ejecutar las AUTO-ACTUALIZACIONES especiales
|
||||||
|
//
|
||||||
|
// Si hubiera error:
|
||||||
|
//
|
||||||
|
// error Se produjo un error desconocido. Intentelo mas tarde
|
||||||
|
// error Su licencia no incluye las actualizaciones
|
||||||
|
// error Su licencia ha expirado
|
||||||
|
// error Ya descargó con exito esta actualizacion desde otro equipo
|
||||||
|
// error Nombre de usuario o password incorrectos
|
||||||
|
//
|
||||||
|
// Despues de descargar una actualizacion y ejecutarla...
|
||||||
|
// se debe actualizar el fichero de versiones actuales:
|
||||||
|
//
|
||||||
|
// liveUpdate.ini
|
||||||
|
//
|
||||||
|
// [liveUpdate]
|
||||||
|
// user=xxxx
|
||||||
|
// version=1.0
|
||||||
|
// pass=<MD5(pwd)>
|
||||||
|
// app=TPVwin
|
||||||
|
// [apps]
|
||||||
|
// nombre=version ; mySQL_TPV.exe=1.1.0
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
|
||||||
|
{
|
||||||
|
if ( hiloCorriendo && checkUpdates )
|
||||||
|
{
|
||||||
|
checkUpdates->Terminate();
|
||||||
|
checkUpdates->WaitFor();
|
||||||
|
hiloCorriendo = false;
|
||||||
|
delete checkUpdates;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall TForm1::IniciaDescargas(TObject *Sender)
|
||||||
|
{
|
||||||
|
if ( StringGrid1->RowCount < 1 ) return;
|
||||||
|
|
||||||
|
AnsiString file;
|
||||||
|
|
||||||
|
urlDownload = "http://updates.infdj.com/downloadFile.php?app=";
|
||||||
|
if ( !app.IsEmpty() ) urlDownload += app;
|
||||||
|
if ( !login.IsEmpty() ) urlDownload += "&user="+login;
|
||||||
|
if ( !pass.IsEmpty() ) urlDownload += "&pass="+pass;
|
||||||
|
urlDownload += "&mod=";
|
||||||
|
|
||||||
|
file = urlDownload+StringGrid1->Cells[0][1];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Pintamos de verde la fila que nos estamos descargando...
|
||||||
|
/*
|
||||||
|
currentRow = 1;
|
||||||
|
StringGrid1->Repaint();
|
||||||
|
|
||||||
|
checkUpdates->downloadFile( ".\\"+StringGrid1->Cells[0][1], (char *)urlDownload.data() );
|
||||||
|
checkUpdates->m_ctrlProgress=ProgressBar1;
|
||||||
|
checkUpdates->labelTimeLeft=Label4;
|
||||||
|
checkUpdates->labelTransferRate=Label5;
|
||||||
|
checkUpdates->OnTerminate(nextState);
|
||||||
|
checkUpdates->Resume();
|
||||||
|
*/
|
||||||
|
currentRow = 0;
|
||||||
|
nextState(this);
|
||||||
|
|
||||||
|
SpeedButton2->Visible = false;
|
||||||
|
Label6->Visible = true;
|
||||||
|
Label7->Visible = true;
|
||||||
|
ProgressBar2->Visible = true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall TForm1::nextState(System::TObject* Sender)
|
||||||
|
{
|
||||||
|
currentRow++;
|
||||||
|
if ( currentRow < StringGrid1->RowCount )
|
||||||
|
{
|
||||||
|
AnsiString file;
|
||||||
|
file = urlDownload+StringGrid1->Cells[0][currentRow];
|
||||||
|
StringGrid1->Repaint();
|
||||||
|
|
||||||
|
ShowMessage( file );
|
||||||
|
|
||||||
|
if ( checkUpdates )
|
||||||
|
{
|
||||||
|
delete checkUpdates;
|
||||||
|
checkUpdates = NULL;
|
||||||
|
}
|
||||||
|
checkUpdates = new downloads(true);
|
||||||
|
checkUpdates->downloadFile( (char *)AnsiString(".\\"+StringGrid1->Cells[0][currentRow]).data(), (char *)file.data() );
|
||||||
|
checkUpdates->m_ctrlProgress=ProgressBar1;
|
||||||
|
checkUpdates->labelTimeLeft=Label4;
|
||||||
|
checkUpdates->labelTransferRate=Label5;
|
||||||
|
checkUpdates->OnTerminate = nextState;
|
||||||
|
checkUpdates->Resume();
|
||||||
|
hiloCorriendo = true;
|
||||||
|
} else {
|
||||||
|
PageControl1->ActivePage = TabSheet3;
|
||||||
|
hiloCorriendo = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
|
||||||
|
int ARow, TRect &Rect, TGridDrawState State)
|
||||||
|
{
|
||||||
|
TColor c;
|
||||||
|
// Redibujamos la rejilla
|
||||||
|
if ( ARow < currentRow )
|
||||||
|
{
|
||||||
|
c = cl3DLight;
|
||||||
|
} else
|
||||||
|
if ( ARow == currentRow )
|
||||||
|
{
|
||||||
|
c = clMoneyGreen;
|
||||||
|
} else
|
||||||
|
// ARow > currentRow
|
||||||
|
{
|
||||||
|
c = clWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringGrid1->Canvas->Font->Color = c;
|
||||||
|
// StringGrid1->DrawCell( ACol, ARow, Rect, State );
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
BIN
src/interfaz.ddp
Normal file
BIN
src/interfaz.ddp
Normal file
Binary file not shown.
205
src/interfaz.dfm
Normal file
205
src/interfaz.dfm
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
object Form1: TForm1
|
||||||
|
Left = 197
|
||||||
|
Top = 112
|
||||||
|
Width = 565
|
||||||
|
Height = 333
|
||||||
|
Caption = 'Em'
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
OldCreateOrder = False
|
||||||
|
OnClose = FormClose
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object Panel1: TPanel
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Width = 150
|
||||||
|
Height = 299
|
||||||
|
Align = alLeft
|
||||||
|
Caption = 'Panel1'
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object PageControl1: TPageControl
|
||||||
|
Left = 150
|
||||||
|
Top = 0
|
||||||
|
Width = 407
|
||||||
|
Height = 299
|
||||||
|
ActivePage = TabSheet1
|
||||||
|
Align = alClient
|
||||||
|
TabIndex = 0
|
||||||
|
TabOrder = 1
|
||||||
|
object TabSheet1: TTabSheet
|
||||||
|
Caption = 'TabSheet1'
|
||||||
|
object Label1: TLabel
|
||||||
|
Left = 8
|
||||||
|
Top = 8
|
||||||
|
Width = 104
|
||||||
|
Height = 24
|
||||||
|
Caption = 'Live Update!'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -19
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
object SpeedButton1: TSpeedButton
|
||||||
|
Left = 88
|
||||||
|
Top = 208
|
||||||
|
Width = 201
|
||||||
|
Height = 22
|
||||||
|
Caption = 'Buscar actualizaciones ahora'
|
||||||
|
Flat = True
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -13
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
OnClick = SpeedButton1Click
|
||||||
|
end
|
||||||
|
object Label2: TLabel
|
||||||
|
Left = 8
|
||||||
|
Top = 40
|
||||||
|
Width = 361
|
||||||
|
Height = 20
|
||||||
|
Caption = 'Esta aplicaci'#243'n intentar'#225' localizar nuevas versiones'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -16
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
object Label3: TLabel
|
||||||
|
Left = 8
|
||||||
|
Top = 64
|
||||||
|
Width = 110
|
||||||
|
Height = 20
|
||||||
|
Caption = 'de su producto.'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -16
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
object Label4: TLabel
|
||||||
|
Left = 88
|
||||||
|
Top = 128
|
||||||
|
Width = 197
|
||||||
|
Height = 20
|
||||||
|
Caption = 'Buscando actualizaciones...'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -16
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
Visible = False
|
||||||
|
end
|
||||||
|
object Label5: TLabel
|
||||||
|
Left = 88
|
||||||
|
Top = 176
|
||||||
|
Width = 4
|
||||||
|
Height = 20
|
||||||
|
Caption = '.'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -16
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
end
|
||||||
|
object ProgressBar1: TProgressBar
|
||||||
|
Left = 88
|
||||||
|
Top = 152
|
||||||
|
Width = 201
|
||||||
|
Height = 17
|
||||||
|
Min = 0
|
||||||
|
Max = 100
|
||||||
|
TabOrder = 0
|
||||||
|
Visible = False
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object TabSheet2: TTabSheet
|
||||||
|
Caption = 'TabSheet2'
|
||||||
|
ImageIndex = 1
|
||||||
|
object SpeedButton2: TSpeedButton
|
||||||
|
Left = 88
|
||||||
|
Top = 208
|
||||||
|
Width = 201
|
||||||
|
Height = 22
|
||||||
|
Caption = 'Descargar actualizaciones'
|
||||||
|
Flat = True
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -13
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
OnClick = IniciaDescargas
|
||||||
|
end
|
||||||
|
object Label6: TLabel
|
||||||
|
Left = 88
|
||||||
|
Top = 184
|
||||||
|
Width = 197
|
||||||
|
Height = 20
|
||||||
|
Caption = 'Buscando actualizaciones...'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -16
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
Visible = False
|
||||||
|
end
|
||||||
|
object Label7: TLabel
|
||||||
|
Left = 88
|
||||||
|
Top = 232
|
||||||
|
Width = 4
|
||||||
|
Height = 20
|
||||||
|
Caption = '.'
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -16
|
||||||
|
Font.Name = 'MS Sans Serif'
|
||||||
|
Font.Style = []
|
||||||
|
ParentFont = False
|
||||||
|
Visible = False
|
||||||
|
end
|
||||||
|
object StringGrid1: TStringGrid
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Width = 399
|
||||||
|
Height = 177
|
||||||
|
Align = alTop
|
||||||
|
Color = clWhite
|
||||||
|
RowCount = 2
|
||||||
|
TabOrder = 0
|
||||||
|
OnDrawCell = StringGrid1DrawCell
|
||||||
|
RowHeights = (
|
||||||
|
24
|
||||||
|
24)
|
||||||
|
end
|
||||||
|
object ProgressBar2: TProgressBar
|
||||||
|
Left = 88
|
||||||
|
Top = 208
|
||||||
|
Width = 201
|
||||||
|
Height = 17
|
||||||
|
Min = 0
|
||||||
|
Max = 100
|
||||||
|
TabOrder = 1
|
||||||
|
Visible = False
|
||||||
|
end
|
||||||
|
end
|
||||||
|
object TabSheet3: TTabSheet
|
||||||
|
Caption = 'TabSheet3'
|
||||||
|
ImageIndex = 2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
56
src/interfaz.h
Normal file
56
src/interfaz.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef interfazH
|
||||||
|
#define interfazH
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#include <Classes.hpp>
|
||||||
|
#include <Controls.hpp>
|
||||||
|
#include <StdCtrls.hpp>
|
||||||
|
#include <Forms.hpp>
|
||||||
|
#include <Buttons.hpp>
|
||||||
|
#include <ComCtrls.hpp>
|
||||||
|
#include <ExtCtrls.hpp>
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#include "donwloads.h"
|
||||||
|
#include <Grids.hpp>
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
class TForm1 : public TForm
|
||||||
|
{
|
||||||
|
__published: // IDE-managed Components
|
||||||
|
TPanel *Panel1;
|
||||||
|
TPageControl *PageControl1;
|
||||||
|
TTabSheet *TabSheet1;
|
||||||
|
TTabSheet *TabSheet2;
|
||||||
|
TTabSheet *TabSheet3;
|
||||||
|
TLabel *Label1;
|
||||||
|
TSpeedButton *SpeedButton1;
|
||||||
|
TLabel *Label2;
|
||||||
|
TLabel *Label3;
|
||||||
|
TLabel *Label4;
|
||||||
|
TProgressBar *ProgressBar1;
|
||||||
|
TLabel *Label5;
|
||||||
|
TStringGrid *StringGrid1;
|
||||||
|
TSpeedButton *SpeedButton2;
|
||||||
|
TLabel *Label6;
|
||||||
|
TProgressBar *ProgressBar2;
|
||||||
|
TLabel *Label7;
|
||||||
|
void __fastcall SpeedButton1Click(TObject *Sender);
|
||||||
|
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
|
||||||
|
void __fastcall IniciaDescargas(TObject *Sender);
|
||||||
|
void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol,
|
||||||
|
int ARow, TRect &Rect, TGridDrawState State);
|
||||||
|
private: // User declarations
|
||||||
|
AnsiString urlDownload;
|
||||||
|
bool hiloCorriendo;
|
||||||
|
downloads *checkUpdates;
|
||||||
|
AnsiString app,login,pass;
|
||||||
|
int currentRow;
|
||||||
|
|
||||||
|
void __fastcall nextState(System::TObject* Sender);
|
||||||
|
public: // User declarations
|
||||||
|
__fastcall TForm1(TComponent* Owner);
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
extern PACKAGE TForm1 *Form1;
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user