first commit (2004-06-30)
This commit is contained in:
		
							
								
								
									
										
											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<65>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<6F>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<73>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<65>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<6D>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<63>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<6F> David Guill<6C>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<EFBFBD>dulo";
 | 
			
		||||
      StringGrid1->ColWidths[0] = 200;
 | 
			
		||||
      StringGrid1->Cells[1][0] = "versi<EFBFBD>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<61> error o correcto)
 | 
			
		||||
  //
 | 
			
		||||
  // nombre_fichero|version|ruta relativa|tama<6D>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<72> 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
 | 
			
		||||
		Reference in New Issue
	
	Block a user