From bce9a551854296fe821da8b92544f997f30c211d Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Thu, 9 Apr 2015 20:39:17 +0200 Subject: [PATCH 1/5] =?UTF-8?q?-=20Agregada=20nueva=20optimizaci=C3=B3n=20?= =?UTF-8?q?por=20comparaci=C3=B3n=20de=20timestamp=20igual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 58 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index d6a5262..3559f33 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -581,7 +581,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -680,7 +680,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION c_BackgroundImage = '' l_ClearUniqueID = .T. l_ClearDBFLastUpdate = .T. - l_OptimizeByFilestamp = .F. + n_OptimizeByFilestamp = 2 l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_ReportSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias @@ -1072,11 +1072,11 @@ DEFINE CLASS c_foxbin2prg AS SESSION ENDPROC - PROCEDURE l_OptimizeByFilestamp_ACCESS + PROCEDURE n_OptimizeByFilestamp_ACCESS IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_OptimizeByFilestamp + RETURN THIS.n_OptimizeByFilestamp ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_OptimizeByFilestamp, THIS.l_OptimizeByFilestamp ) + RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_OptimizeByFilestamp, THIS.n_OptimizeByFilestamp ) ENDIF ENDPROC @@ -1532,7 +1532,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION * NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar * tcExtraBackupLevels (v? IN ) Indica la cantidad de niveles de backup a realizar (por defecto '1') * tcClearUniqueID (v? IN ) Indica si se debe limpiar el UniqueID ('1') o no ('0' ó vacío) - * tcOptimizeByFilestamp (v? IN ) Indica si se debe optimizar por filestamp ('1') o no ('0' ó vacío) + * tcOptimizeByFilestamp (v? IN ) Indica si se debe optimizar por filestamp mayor o igual ('1'), solo igual ('2') o no optimizar ('0' ó vacío) * tc_InputFile (v! IN ) Nombre completo (fullpath) del archivo a convertir o nombre del directorio a procesar * tc_InputFile_Type (@? IN ) Tipo de archivo de entrada: (D)irectory, (F)ile, (Q)uerySupport * toParentCFG (@? IN ) (Uso interno) Si se pasa un valor, el nuevo CFG copiará primero sus valores de aquí para heredarlos @@ -1771,7 +1771,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION CASE LEFT( laConfig(I), 20 ) == LOWER('OptimizeByFilestamp:') lcValue = ALLTRIM( SUBSTR( laConfig(I), 21 ) ) - IF NOT INLIST( TRANSFORM(tcOptimizeByFilestamp), '0', '1' ) AND INLIST( lcValue, '0', '1' ) THEN + IF NOT INLIST( TRANSFORM(tcOptimizeByFilestamp), '0', '1', '2' ) AND INLIST( lcValue, '0', '1', '2' ) THEN tcOptimizeByFilestamp = lcValue .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > OptimizeByFilestamp: ' + TRANSFORM(lcValue) ) ENDIF @@ -1918,8 +1918,8 @@ DEFINE CLASS c_foxbin2prg AS SESSION IF ISDIGIT(tcExtraBackupLevels) lo_CFG.n_ExtraBackupLevels = INT( VAL( TRANSFORM(tcExtraBackupLevels) ) ) ENDIF - IF INLIST( TRANSFORM(tcOptimizeByFilestamp), '0', '1' ) THEN - lo_CFG.l_OptimizeByFilestamp = NOT (TRANSFORM(tcOptimizeByFilestamp) == '0') + IF INLIST( TRANSFORM(tcOptimizeByFilestamp), '0', '1', '2' ) THEN + lo_CFG.n_OptimizeByFilestamp = INT(VAL(tcOptimizeByFilestamp)) ENDIF .l_Main_CFG_Loaded = .T. @@ -1946,7 +1946,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION .writeLog( C_TAB + 'n_Debug: ' + TRANSFORM(.n_Debug) ) .writeLog( C_TAB + 'n_ExtraBackupLevels: ' + TRANSFORM(.n_ExtraBackupLevels) ) .writeLog( C_TAB + 'c_BackgroundImage: ' + TRANSFORM(.c_BackgroundImage) ) - .writeLog( C_TAB + 'l_OptimizeByFilestamp: ' + TRANSFORM(.l_OptimizeByFilestamp) ) + .writeLog( C_TAB + 'n_OptimizeByFilestamp: ' + TRANSFORM(.n_OptimizeByFilestamp) ) .writeLog( C_TAB + 'l_DropNullCharsFromCode: ' + TRANSFORM(.l_DropNullCharsFromCode) ) .writeLog( C_TAB + 'l_ClearDBFLastUpdate: ' + TRANSFORM(.l_ClearDBFLastUpdate) ) .writeLog( C_TAB + 'c_Language: ' + TRANSFORM(.c_Language) ) @@ -2173,7 +2173,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION * tcNoTimestamps (v? IN ) Indica si se debe anular el timestamp ('1') o no ('0' ó vacío) * tcBackupLevels (v? IN ) Indica la cantidad de niveles de backup a realizar (por defecto '1') * tcClearUniqueID (v? IN ) Indica si se debe limpiar el UniqueID ('1') o no ('0' ó vacío) - * tcOptimizeByFilestamp (v? IN ) Indica si se debe optimizar por filestamp ('1') o no ('0' ó vacío) + * tcOptimizeByFilestamp (v? IN ) Indica si se debe optimizar por filestamp mayor o igual ('1'), solo igual ('2') o no optimizar ('0' ó vacío) * tcCFG_File (v? IN ) Indica si se debe usar un archivo de configuración distinto al predeterminado *-------------------------------------------------------------------------------------------------------------- LPARAMETERS tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDebug, tcDontShowProgress ; @@ -2269,7 +2269,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION .writeLog( C_TAB + 'tcNoTimestamps: ' + TRANSFORM( EVL(tcNoTimestamps, '(empty) -> Will use Default [' + TRANSFORM(.l_NoTimestamps) + ']' ) ) ) .writeLog( C_TAB + 'tcBackupLevels: ' + TRANSFORM( EVL(tcBackupLevels, '(empty) -> Will use Default [' + TRANSFORM(.n_ExtraBackupLevels) + ']' ) ) ) .writeLog( C_TAB + 'tcClearUniqueID: ' + TRANSFORM( EVL(tcClearUniqueID, '(empty) -> Will use Default [' + TRANSFORM(.l_ClearUniqueID) + ']' ) ) ) - .writeLog( C_TAB + 'tcOptimizeByFilestamp: ' + TRANSFORM( EVL(tcOptimizeByFilestamp, '(empty) -> Will use Default [' + TRANSFORM(.l_OptimizeByFilestamp) + ']' ) ) ) + .writeLog( C_TAB + 'tcOptimizeByFilestamp: ' + TRANSFORM( EVL(tcOptimizeByFilestamp, '(empty) -> Will use Default [' + TRANSFORM(.n_OptimizeByFilestamp) + ']' ) ) ) .writeLog( ) *-- ARCHIVO DE CONFIGURACIÓN PRINCIPAL @@ -3211,7 +3211,18 @@ DEFINE CLASS c_foxbin2prg AS SESSION ENDIF ENDIF - IF NOT .l_OptimizeByFilestamp OR .t_InputFile_TimeStamp >= .t_OutputFile_TimeStamp THEN + DO CASE + CASE .n_OptimizeByFilestamp = 1 AND .t_InputFile_TimeStamp < .t_OutputFile_TimeStamp + *-- Optimizado: El Origen es anterior al Destino - No hace falta regenerar + *.writeLog( '> El archivo de salida [<>] no se regenera porque su timestamp es más nuevo que el de entrada.' ) + .writeLog( C_TAB + C_TAB + '* ' + TEXTMERGE(loLang.C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC) ) + + CASE .n_OptimizeByFilestamp = 2 AND .t_InputFile_TimeStamp = .t_OutputFile_TimeStamp + *-- Optimizado: El Origen es igual al Destino - No hace falta regenerar + *.writeLog( '> El archivo de salida [<>] no se regenera porque su timestamp es igual que el de entrada.' ) + .writeLog( C_TAB + C_TAB + '* ' + TEXTMERGE(loLang.C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC) ) + + OTHERWISE .c_Type = UPPER(JUSTEXT(.c_OutputFile)) loConversor.c_InputFile = .c_InputFile loConversor.c_OutputFile = .c_OutputFile @@ -24707,7 +24718,7 @@ DEFINE CLASS CL_CFG AS CUSTOM + [] ; + [] ; + [] ; - + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -24743,7 +24754,7 @@ DEFINE CLASS CL_CFG AS CUSTOM l_NoTimestamps = NULL l_ClearUniqueID = NULL l_ClearDBFLastUpdate = NULL - l_OptimizeByFilestamp = NULL + n_OptimizeByFilestamp = NULL l_RedirectClassPerFileToMain = NULL n_UseClassPerFile = NULL l_ClassPerFileCheck = NULL @@ -24784,7 +24795,7 @@ DEFINE CLASS CL_CFG AS CUSTOM .l_NoTimestamps = toParentCFG.l_NoTimestamps .l_ClearUniqueID = toParentCFG.l_ClearUniqueID .l_ClearDBFLastUpdate = toParentCFG.l_ClearDBFLastUpdate - .l_OptimizeByFilestamp = toParentCFG.l_OptimizeByFilestamp + .n_OptimizeByFilestamp = toParentCFG.n_OptimizeByFilestamp .l_RedirectClassPerFileToMain = toParentCFG.l_RedirectClassPerFileToMain .n_UseClassPerFile = toParentCFG.n_UseClassPerFile .l_ClassPerFileCheck = toParentCFG.l_ClassPerFileCheck @@ -24888,7 +24899,8 @@ DEFINE CLASS CL_LANG AS Custom C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "" C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "" C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "" - C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC = "" + C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "" + C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "" C_PRESS_ESC_TO_CANCEL = "" C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC = "" C_PROCESSING_LOC = "" @@ -25000,7 +25012,8 @@ DEFINE CLASS CL_LANG AS Custom .C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "La classe externe ne correspond pas à la classe interne" .C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "L'élément extérieur ne correspond pas aux éléments intérieur" .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimisation: fichier de sortie [<>] ne était pas écrasé parce que ce est la même que celle générée." - .C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC = "Optimisation: fichier de sortie [<>] n'a pas été régénéré car il est plus récent que le fichier d'entrée." + .C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimisation: le fichier de sortie [<>] pas régénéré en ayant le même horodatage que l'entrée." + .C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimisation: le fichier de sortie [<>] n'a pas été régénéré car il est plus récent que le fichier d'entrée." .C_PRESS_ESC_TO_CANCEL = "Appuyez sur Esc pour Annuler" .C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC = "Procédure pas fermé. Dernière ligne de code doit être ENDPROC. [<>, Recno:<>]" .C_PROCESSING_LOC = "Traitement du fichier" @@ -25090,7 +25103,8 @@ DEFINE CLASS CL_LANG AS Custom .C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "La clase externa no coincide con las clases internas" .C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "El miembro externo no coincide con los miembros internos" .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimización: el archivo de salida [<>] no se sobreescribe por ser igual al generado." - .C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC = "Optimización: el archivo de salida [<>] no se regenera por ser más nuevo que el de entrada." + .C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimización: el archivo de salida [<>] no se regenera por tener el mismo timestamp que el de entrada." + .C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimización: el archivo de salida [<>] no se regenera por tener un timestamp más nuevo que el de entrada." .C_PRESS_ESC_TO_CANCEL = "Pulse Esc para Cancelar" .C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC = "Procedimiento sin cerrar. La última línea de código debe ser ENDPROC. [<>, Recno:<>]" .C_PROCESSING_LOC = "Procesando archivo" @@ -25180,7 +25194,8 @@ DEFINE CLASS CL_LANG AS Custom .C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "Die äußere Klasse nicht die innere Klassifizierung anzeigen lassen" .C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "Das äußere Element nicht den inneren Elementen entsprechen" .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimierung: Ausgabedatei [<>] wurde nicht überschrieben, da sie dieselbe ist wie die neu generierte." - .C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC = "Optimierung: Ausgabedatei [<>] wurde nicht erneuert, da sie neuer ist als die Ursprungsdatei." + .C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimierung: Ausgabedatei [<>] wurde nicht verlängert, weil seine Zeitmarke ist die gleiche wie die Quelldatei." + .C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimierung: Ausgabedatei [<>] wurde nicht erneuert, da sie neuer ist als die Ursprungsdatei." .C_PRESS_ESC_TO_CANCEL = "Drücken Sie Esc für Abbrechen" .C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC = "Prozcedur nicht geschlossen. Letzte Zeile des Codes muss ENDPROC sein. [<>, Recno:<>]" .C_PROCESSING_LOC = "Bearbeite Datei" @@ -25270,7 +25285,8 @@ DEFINE CLASS CL_LANG AS Custom .C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC = "The outer class does not match the inner classes" .C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC = "The outer member does not match the inner members" .C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC = "Optimization: output file [<>] was not overwritten because it is the same as was generated." - .C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC = "Optimization: output file [<>] was not regenerated because it is newer than the inputfile." + .C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimization: output file [<>] was not regenerated because it's filestamp is equal than the inputfile." + .C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC = "Optimization: output file [<>] was not regenerated because it's filestamp is newer than the inputfile." .C_PRESS_ESC_TO_CANCEL = "Press Esc to Cancel" .C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC = "Procedure not closed. Last line of code must be ENDPROC. [<>, Recno:<>]" .C_PROCESSING_LOC = "Processing file" From f9321f470db331f91ee1c2306e117eeab9c96b81 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sat, 11 Apr 2015 01:33:24 +0200 Subject: [PATCH 2/5] =?UTF-8?q?-=20Nueva=20funci=C3=B3n=20ChangeFileTime?= =?UTF-8?q?=20-=20Encapsulada=20la=20clase=20frm=5Favance=20para=20permiti?= =?UTF-8?q?r=20su=20instanciaci=C3=B3n=20por=20separado=20de=20FoxBin2Prg?= =?UTF-8?q?=20-=20Nuevo=20indicador=20chk=5FFileTimeStampOptimization=20en?= =?UTF-8?q?=20la=20clase=20frm=5Finteractive=20para=20permitir=20marcar/de?= =?UTF-8?q?smarcar=20la=20optimizaci=C3=B3n=20por=20file=20timestamp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 249 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 208 insertions(+), 41 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 3559f33..d9c71fe 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -516,7 +516,7 @@ QUIT -DEFINE CLASS c_foxbin2prg AS SESSION +DEFINE CLASS c_foxbin2prg AS Session _MEMBERDATA = [] ; + [] ; + [] ; @@ -546,6 +546,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -751,9 +752,20 @@ DEFINE CLASS c_foxbin2prg AS SESSION ENDIF *-- Funciones para escribir en StdOut - DECLARE INTEGER GetStdHandle IN Win32API INTEGER nHandleType - DECLARE INTEGER WriteFile IN Win32API INTEGER hFile, STRING @ cBuffer ; - , INTEGER nBytes, INTEGER @ nBytes2, INTEGER @ nBytes3 + DECLARE INTEGER 'GetStdHandle' IN WIN32API AS fb2p_GetStdHandle INTEGER nHandleType + DECLARE INTEGER 'WriteFile' IN WIN32API AS fb2p_WriteFile INTEGER hFile, STRING @ cBuffer, INTEGER nBytes, INTEGER @ nBytes2, INTEGER @ nBytes3 + *-- Funciones para ChangeFileTime + DECLARE INTEGER 'SetFileTime' IN WIN32API AS fb2p_SetFileTime INTEGER hFile, STRING lpCreationTime, STRING lpLastAccessTime, STRING lpLastWriteTime + DECLARE INTEGER 'GetFileAttributesEx' IN Win32API AS fb2p_GetFileAttributesEx STRING lpFileName, INTEGER fInfoLevelId, STRING @ lpFileInformation + DECLARE INTEGER 'LocalFileTimeToFileTime' IN Win32API AS fb2p_LocalFileTimeToFileTime STRING LOCALFILETIME, STRING @ FILETIME + DECLARE INTEGER 'FileTimeToSystemTime' IN Win32API AS fb2p_FileTimeToSystemTime STRING FILETIME, STRING @ SYSTEMTIME + DECLARE INTEGER 'SystemTimeToFileTime' IN Win32API AS fb2p_SystemTimeToFileTime STRING lpSYSTEMTIME, STRING @ FILETIME + DECLARE INTEGER '_lopen' IN Win32API AS fb2p_lopen STRING lpFileName, INTEGER iReadWrite + DECLARE INTEGER '_lclose' IN Win32API AS fb2p_lclose INTEGER hFile + *-- Funciones para ChangeFileAttributes + DECLARE SHORT 'SetFileAttributes' IN Win32API AS fb2p_SetFileAttributes STRING tcFileName, INTEGER dwFileAttributes + DECLARE INTEGER 'GetFileAttributes' IN Win32API AS fb2p_GetFileAttributes STRING tcFileName + *-- IF FILE(THIS.c_ErrorLogFile) THEN ERASE (THIS.c_ErrorLogFile + '.BAK') @@ -815,6 +827,13 @@ DEFINE CLASS c_foxbin2prg AS SESSION THIS.o_FSO = NULL THIS.o_WSH = NULL THIS.o_FNC = NULL + *-- Funciones para ChangeFileAttributes + CLEAR DLLS fb2p_SetFileAttributes, fb2p_GetFileAttributes + *-- Funciones para escribir en StdOut + CLEAR DLLS fb2p_GetStdHandle, fb2p_WriteFile + *-- Funciones para ChangeFileTime + CLEAR DLLS fb2p_SetFileTime, fb2p_GetFileAttributesEx, fb2p_LocalFileTimeToFileTime ; + , fb2p_FileTimeToSystemTime, fb2p_SystemTimeToFileTime, fb2p_lopen, fb2p_lclose ENDTRY RETURN @@ -1279,8 +1298,6 @@ DEFINE CLASS c_foxbin2prg AS SESSION TRY LOCAL loEx AS EXCEPTION, dwFileAttributes, dwFileAttributes_Orig, lnRet - DECLARE SHORT 'SetFileAttributes' IN kernel32 AS fb2p_SetFileAttributes STRING tcFileName, INTEGER dwFileAttributes - DECLARE INTEGER 'GetFileAttributes' IN kernel32 AS fb2p_GetFileAttributes STRING tcFileName lnRet = 0 * read current attributes for this file @@ -1352,7 +1369,6 @@ DEFINE CLASS c_foxbin2prg AS SESSION FINALLY THIS.writeLog( C_TAB + LOWER(PROGRAM()) + ' >> [' + tcFileName + '] lnRet = ' + TRANSFORM(lnRet) + ', dwFileAttributes_Orig = ' + TRANSFORM(dwFileAttributes_Orig) ) - CLEAR DLLS fb2p_SetFileAttributes, fb2p_GetFileAttributes RELEASE tcFileName, tcAttrib, dwFileAttributes ENDTRY @@ -1360,6 +1376,96 @@ DEFINE CLASS c_foxbin2prg AS SESSION ENDPROC + PROCEDURE ChangeFileTime + *--------------------------------------------------------------------------------------------------- + * CAMBIAR LA FECHA/HORA DE UN ARCHIVO + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * tcFileName (v! IN ) Nombre del archivo + * tcTimeType (v? IN ) C=Creation time, W=Last Write, A=Last Access + * tnYear (v? IN ) Año (>=1800) + * tnMonth (v? IN ) Mes (1-12) + * tnDay (v? IN ) Día (1-31) + * tnHour (v? IN ) Hora (0-23) + * tnMinute (v? IN ) Minuto (0-59) + * tnSec (v? IN ) Segundo (0-59) + * tnThou (v? IN ) ¿? (0-999) + *--------------------------------------------------------------------------------------------------- + LPARAMETERS m.tcFileName, m.tcTimeType, m.tnYear, m.tnMonth, m.tnDay, m.tnHour, m.tnMinute, m.tnSec, m.tnThou + + #DEFINE OF_READWRITE 2 + + LOCAL m.lpFileInformation, m.cS, m.nPar, m.fh, M.lpFileInformation, m.lpSysTime, m.cCreation ; + , M.cLastAccess, m.cLastWrite, m.cBuffTime, m.cBuffTime1, M.cTT,m.nYear1, m.nMonth1, m.nDay1, m.nHour1 ; + , M.nMinute1, m.nSec1, m.nThou1, llRetorno + + TRY + m.nPar = PCOUNT() + + IF m.nPar < 1 + EXIT + ENDIF + + m.cTT = IIF( m.nPar >= 2 AND VARTYPE(m.tcTimeType) = "C" AND NOT EMPTY(m.tcTimeType), LOWER(SUBSTR(m.tcTimeType,1,1)), "c" ) + m.nYear1 = IIF( m.nPar >= 3 AND VARTYPE(m.tnYear) $ "FIN" AND m.tnYear >= 1800, ROUND(m.tnYear,0), -1 ) + m.nMonth1 = IIF( m.nPar >= 4 AND VARTYPE(m.tnMonth) $ "FIN" AND BETWEEN(m.tnMonth,1,12), ROUND(m.tnMonth,0), -1 ) + m.nDay1 = IIF( m.nPar >= 5 AND VARTYPE(m.tnDay) $ "FIN" AND BETWEEN(m.tnDay,1,31), ROUND(m.tnDay,0), -1 ) + m.nHour1 = IIF( m.nPar >= 6 AND VARTYPE(m.tnHour) $ "FIN" AND BETWEEN(m.tnHour,0,23), ROUND(m.tnHour,0), -1 ) + m.nMinute1 = IIF( m.nPar >= 7 AND VARTYPE(m.tnMinute) $ "FIN" AND BETWEEN(m.tnMinute,0,59), ROUND(m.tnMinute,0), -1 ) + m.nSec1 = IIF( m.nPar >= 8 AND VARTYPE(m.tnSec) $ "FIN" AND BETWEEN(m.tnSec,0,59), ROUND(m.tnSec,0), -1 ) + m.nThou1 = IIF( m.nPar >= 9 AND VARTYPE(m.tnThou) $ "FIN" AND BETWEEN(m.tnThou,0,999), ROUND(m.tnThou,0), -1 ) + m.lpFileInformation = REPLICATE( CHR(0), 53 ) && just a buffer + m.lpSysTime = REPLICATE( CHR(0), 16 ) && just a buffer + + IF fb2p_GetFileAttributesEx(m.tcFileName, 0, @lpFileInformation) = 0 + EXIT + ENDIF + + m.cCreation = SUBSTR(m.lpFileInformation,5,8) + m.cLastAccess = SUBSTR(m.lpFileInformation,13,8) + m.cLastWrite = SUBSTR(m.lpFileInformation,21,8) + m.cBuffTime = IIF(m.cTT="w",m.cLastWrite, IIF(m.cTT="a",m.cLastAccess,m.cCreation)) + + fb2p_FileTimeToSystemTime(m.cBuffTime, @lpSysTime) + + m.lpSysTime = ; + IIF( m.nYear1 >= 0, BINTOC(m.nYear1,"2RS"), SUBSTR(m.lpSysTime,1,2) ) ; + + IIF( m.nMonth1 >= 0, BINTOC(m.nMonth1,"2RS"), SUBSTR(m.lpSysTime,3,2) ) ; + + SUBSTR(m.lpSysTime,5,2) ; + + IIF( m.nDay1 >= 0, BINTOC(m.nDay1,"2RS"), SUBSTR(m.lpSysTime,7,2) ) ; + + IIF( m.nHour1 >= 0, BINTOC(m.nHour1,"2RS"), SUBSTR(m.lpSysTime,9,2) ) ; + + IIF( m.nMinute1 >= 0, BINTOC(m.nMinute1,"2RS"), SUBSTR(m.lpSysTime,11,2) ) ; + + IIF( m.nSec1 >= 0, BINTOC(m.nSec1,"2RS"), SUBSTR(m.lpSysTime,13,2) ) ; + + IIF( m.nThou1 >= 0, BINTOC(m.nThou1,"2RS"), SUBSTR(m.lpSysTime,15,2) ) + + fb2p_SystemTimeToFileTime(m.lpSysTime,@cBuffTime) + m.cBuffTime1 = m.cBuffTime + fb2p_LocalFileTimeToFileTime(m.cBuffTime1,@cBuffTime) + + DO CASE + CASE m.cTT = "w" + m.cLastWrite=m.cBuffTime + CASE m.cTT = "a" + m.cLastAccess=m.cBuffTime + OTHERWISE && "c" + m.cCreation=m.cBuffTime + ENDCASE + + m.fh = fb2p_lopen (m.tcFileName, OF_READWRITE) + + IF m.fh < 0 + EXIT + ENDIF + + fb2p_SetFileTime (m.fh,m.cCreation, m.cLastAccess, m.cLastWrite) + fb2p_lclose(m.fh) + llRetorno = .T. + ENDTRY + + RETURN llRetorno + ENDPROC + + PROCEDURE compileFoxProBinary LPARAMETERS tcFileName LOCAL lcType @@ -2199,6 +2305,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION lnPCount = 0 lcInputFile_Type = '' + IF .l_AutoClearProcessedFiles THEN .ClearProcessedFiles() && Para evitar acumular procesos anteriores ENDIF @@ -2302,6 +2409,15 @@ DEFINE CLASS c_foxbin2prg AS SESSION loFrm_Interactive.Show() READ EVENTS lnConversionOption = loFrm_Interactive.n_ConversionType + + IF loFrm_Interactive.l_FileTimeStampOptimization + IF .n_OptimizeByFilestamp = 0 THEN + .n_OptimizeByFilestamp = 2 + ENDIF + ELSE + .n_OptimizeByFilestamp = 0 + ENDIF + loFrm_Interactive.Release() loFrm_Interactive = NULL @@ -2929,7 +3045,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION LOCAL lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension, lnFileCount, laFiles(1,1), I ; , ltFilestamp, lcExtA, lcExtB, laEvents(1,1), lcForceAttribs ; , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loConversor as C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' ; + , loConversor as c_conversor_base OF 'FOXBIN2PRG.PRG' ; , loFSO AS Scripting.FileSystemObject lnCodError = 0 @@ -3177,6 +3293,7 @@ DEFINE CLASS c_foxbin2prg AS SESSION STORE {//::} TO .t_InputFile_TimeStamp, .t_OutputFile_TimeStamp, ltFilestamp IF lnFileCount >= 1 THEN + *-- Busca el archivo de entrada original I = ASCAN( laFiles, JUSTFNAME(.c_InputFile), 1, 0, 1, 1+2+4+8 ) IF I > 0 THEN .t_InputFile_TimeStamp = DATETIME( YEAR(laFiles(I,3)), MONTH(laFiles(I,3)), DAY(laFiles(I,3)) ; @@ -3207,17 +3324,18 @@ DEFINE CLASS c_foxbin2prg AS SESSION ENDCASE + *-- Tomo el máximo timestamp de los archivos de salida (??X/??T) .t_OutputFile_TimeStamp = MAX( .t_OutputFile_TimeStamp, ltFilestamp ) ENDIF ENDIF DO CASE - CASE .n_OptimizeByFilestamp = 1 AND .t_InputFile_TimeStamp < .t_OutputFile_TimeStamp + CASE .n_UseClassPerFile = 0 AND .n_OptimizeByFilestamp = 1 AND .t_InputFile_TimeStamp < .t_OutputFile_TimeStamp *-- Optimizado: El Origen es anterior al Destino - No hace falta regenerar *.writeLog( '> El archivo de salida [<>] no se regenera porque su timestamp es más nuevo que el de entrada.' ) .writeLog( C_TAB + C_TAB + '* ' + TEXTMERGE(loLang.C_OUTPUTFILE_TIMESTAMP_NEWER_THAN_INPUTFILE_TIMESTAMP_LOC) ) - CASE .n_OptimizeByFilestamp = 2 AND .t_InputFile_TimeStamp = .t_OutputFile_TimeStamp + CASE .n_UseClassPerFile = 0 AND .n_OptimizeByFilestamp = 2 AND .t_InputFile_TimeStamp = .t_OutputFile_TimeStamp *-- Optimizado: El Origen es igual al Destino - No hace falta regenerar *.writeLog( '> El archivo de salida [<>] no se regenera porque su timestamp es igual que el de entrada.' ) .writeLog( C_TAB + C_TAB + '* ' + TEXTMERGE(loLang.C_OUTPUTFILE_TIMESTAMP_EQUAL_THAN_INPUTFILE_TIMESTAMP_LOC) ) @@ -3606,10 +3724,10 @@ DEFINE CLASS c_foxbin2prg AS SESSION IF THIS.l_StdOutHabilitado LOCAL loException as Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO lcOutput = EVL(tcTexto,'') + CR_LF - lnOutHandle = GetStdHandle(-12) && CAPTURAR ERROR DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS 2>&1 | FIND /V "" + lnOutHandle = fb2p_GetStdHandle(-12) && CAPTURAR ERROR DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS 2>&1 | FIND /V "" lnBytesWritten = 0 lnOverlappedIO = 0 - WriteFile(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO) + fb2p_WriteFile(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO) ENDIF CATCH TO loException @@ -3629,10 +3747,10 @@ DEFINE CLASS c_foxbin2prg AS SESSION IF THIS.l_StdOutHabilitado LOCAL loException as Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO lcOutput = EVL(tcTexto,'') + CR_LF - lnOutHandle = GetStdHandle(-11) && CAPTURAR STDOUT DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS | FIND /V "" + lnOutHandle = fb2p_GetStdHandle(-11) && CAPTURAR STDOUT DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS | FIND /V "" lnBytesWritten = 0 lnOverlappedIO = 0 - WriteFile(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO) + fb2p_WriteFile(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO) ENDIF CATCH TO loException @@ -3797,7 +3915,7 @@ ENDDEFINE -DEFINE CLASS frm_avance AS FORM +DEFINE CLASS frm_avance AS Form Height = 110 Width = 628 ShowWindow = 2 @@ -4226,10 +4344,15 @@ DEFINE CLASS frm_avance AS FORM LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' LOCAL THISFORM AS frm_avance OF foxbin2prg.prg #ENDIF + LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang IF VARTYPE(toFoxBin2Prg) = "O" THEN + IF TYPE("_SCREEN.o_FoxBin2Prg_Lang") = "O" THEN + loLang = _SCREEN.o_FoxBin2Prg_Lang + THISFORM.CAPTION = 'FoxBin2Prg ' + _SCREEN.c_FB2PRG_EXE_Version + ' > - ' + loLang.C_PROCESS_PROGRESS_LOC + ' (' + loLang.C_PRESS_ESC_TO_CANCEL + ')' + ENDIF + IF FILE( FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) THEN THIS.Icon = FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ENDIF @@ -4239,7 +4362,6 @@ DEFINE CLASS frm_avance AS FORM ENDIF ENDIF - THISFORM.CAPTION = 'FoxBin2Prg ' + _SCREEN.c_FB2PRG_EXE_Version + ' > - ' + loLang.C_PROCESS_PROGRESS_LOC + ' (' + loLang.C_PRESS_ESC_TO_CANCEL + ')' THISFORM.nValue = 0 THISFORM.nValue2 = 0 THISFORM.nLastSecCount = SECONDS() @@ -4269,26 +4391,44 @@ ENDDEFINE -DEFINE CLASS frm_interactive AS form - Height = 102 +DEFINE CLASS frm_interactive AS Form + Height = 114 Width = 380 ShowWindow = 2 DoCreate = .T. AutoCenter = .T. BorderStyle = 2 - Caption = 'FoxBin2Prg ' + _SCREEN.c_FB2PRG_EXE_Version + ' - ' + _SCREEN.o_FoxBin2Prg_Lang.C_CONVERT_FOLDER_LOC + Caption = "FoxBin2Prg" ControlBox = .F. AlwaysOnTop = .T. BackColor = RGB(255,255,255) n_ConversionType = 3 + l_FileTimeStampOptimization = .F. Name = "frm_interactive" + _memberdata = [] ; + + [] ; + + [] ; + + [] + + + ADD OBJECT 'chk_FileTimeStampOptimization' AS checkbox WITH ; + Alignment = 0, ; + BackStyle = 0, ; + Caption = "chk_FileTimeStampOptimization", ; + ControlSource = "THISFORM.l_FileTimeStampOptimization", ; + Enabled = .T., ; + Height = 17, ; + Left = 40, ; + Name = "chk_FileTimeStampOptimization", ; + Top = 92, ; + Width = 300 ADD OBJECT lbl_title AS label WITH ; WordWrap = .T., ; Alignment = 2, ; BackStyle = 0, ; - Caption = _SCREEN.o_FoxBin2Prg_Lang.C_CONVERT_FOLDER_QUESTION_LOC, ; + Caption = "lbl_title", ; Height = 36, ; Left = 12, ; Top = 16, ; @@ -4298,29 +4438,29 @@ DEFINE CLASS frm_interactive AS form ADD OBJECT cmd_Bin2Prg AS commandbutton WITH ; - Top = 64, ; + Top = 58, ; Left = 40, ; Height = 27, ; Width = 92, ; - Caption = _SCREEN.o_FoxBin2Prg_Lang.C_BINARY_TO_TEXT_LOC, ; + Caption = "cmd_Bin2Prg", ; Name = "cmd_Bin2Prg" ADD OBJECT cmd_Prg2Bin AS commandbutton WITH ; - Top = 64, ; + Top = 58, ; Left = 144, ; Height = 27, ; Width = 92, ; - Caption = _SCREEN.o_FoxBin2Prg_Lang.C_TEXT_TO_BINARY_LOC, ; + Caption = "cmd_Prg2Bin", ; Name = "cmd_Prg2Bin" ADD OBJECT cmd_None AS commandbutton WITH ; - Top = 64, ; + Top = 58, ; Left = 248, ; Height = 27, ; Width = 92, ; - Caption = _SCREEN.o_FoxBin2Prg_Lang.C_CONVERT_FOLDER_NONE_LOC, ; + Caption = "cmd_None", ; Cancel = .T., ; Name = "cmd_None" @@ -4328,7 +4468,29 @@ DEFINE CLASS frm_interactive AS form PROCEDURE INIT LPARAMETERS toFoxBin2Prg + #IF .F. + LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + #ENDIF + + LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + IF VARTYPE(toFoxBin2Prg) = "O" THEN + IF VARTYPE(_SCREEN.o_FoxBin2Prg_Lang) = "O" THEN + loLang = _SCREEN.o_FoxBin2Prg_Lang + + IF PEMSTATUS(_SCREEN, 'c_FB2PRG_EXE_Version', 5) THEN + THISFORM.Caption = 'FoxBin2Prg ' + _SCREEN.c_FB2PRG_EXE_Version + ' - ' + loLang.C_CONVERT_FOLDER_LOC + ENDIF + + THISFORM.chk_FileTimeStampOptimization.Caption = loLang.C_USE_FILE_TIMESTAMP_OPTIMIZATION_LOC + THISFORM.lbl_title.Caption = loLang.C_CONVERT_FOLDER_QUESTION_LOC + THISFORM.cmd_Bin2Prg.Caption = loLang.C_BINARY_TO_TEXT_LOC + THISFORM.cmd_Prg2Bin.Caption = loLang.C_TEXT_TO_BINARY_LOC + THISFORM.cmd_None.Caption = loLang.C_CONVERT_FOLDER_NONE_LOC + ENDIF + + THISFORM.l_FileTimeStampOptimization = (toFoxBin2Prg.n_OptimizeByFilestamp <> 0) + IF FILE( FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) THEN THIS.Icon = FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ENDIF @@ -4367,9 +4529,9 @@ ENDDEFINE -DEFINE CLASS C_CONVERSOR_BASE AS SESSION +DEFINE CLASS c_conversor_base AS Session #IF .F. - LOCAL THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + LOCAL THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; + [] ; @@ -4545,7 +4707,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION llBloqueEncontrado = .T. LOCAL lcLine, lnArrayCols - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' *-- Propiedad especial IF tcTAG_F $ tcValue && El fin de tag está "inline" @@ -4819,7 +4981,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION LPARAMETERS tcAsignacion LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' .get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor ) lcComentario = '' .desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario ) @@ -4993,7 +5155,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ltTimeStamp,lnResto ; ,lcTimeStamp_Ret, laDirInfo[1,5], loEx AS EXCEPTION - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' lcTimeStamp_Ret = '' IF EMPTY(tnTimeStamp) @@ -5167,7 +5329,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION IF PCOUNT() > 3 *-- EVALUAR UNA ASIGNACIÓN QUE PUEDE SER MULTILÍNEA (memberdata, fb2p_value, etc) - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' DO CASE CASE .analizarAsignacion_TAG_Indicado( @tcPropName, @tcValue, @taCodeLines, tnCodeLines, @I ; , C_FB2P_VALUE_I, C_FB2P_VALUE_F, C_LEN_FB2P_VALUE_I, C_LEN_FB2P_VALUE_F ) @@ -5248,7 +5410,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION ENDIF *-- Búsqueda del ID de inicio de bloque - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' FOR I = 1 TO tnCodeLines * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' *lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) @@ -5360,7 +5522,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION LPARAMETERS tcLine, tcComment LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' .get_SeparatedLineAndComment( @tcLine, @tcComment ) DO CASE @@ -5383,7 +5545,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION LPARAMETERS tcAsignacion, tcComentario LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' .get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor ) tcComentario = '' .normalizarValorPropiedad( @lcPropName, @lcValor, @tcComentario ) @@ -5705,7 +5867,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION DIMENSION laPropsAndValues( tnPropsAndValues_Count, lnArrayCols ) ACOPY( taPropsAndValues, laPropsAndValues ) - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' IF m.tnSortType >= 1 * CON SORT: * - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final @@ -6047,7 +6209,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION LPARAMETERS tcText, tnTimeStamp TRY - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' *-- Según el valor de nTimestamp: *-- 0 = Sin timestamp *-- 1 = Timestamp por delante @@ -6081,7 +6243,7 @@ ENDDEFINE -DEFINE CLASS c_conversor_prg_a_bin AS C_CONVERSOR_BASE +DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base #IF .F. LOCAL THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' #ENDIF @@ -11390,7 +11552,7 @@ ENDDEFINE && CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin -DEFINE CLASS c_conversor_bin_a_prg AS C_CONVERSOR_BASE +DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base #IF .F. LOCAL THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' #ENDIF @@ -24121,7 +24283,7 @@ DEFINE CLASS CL_MENU_OPTION AS CL_MENU_COL_BASE ENDDEFINE -DEFINE CLASS CL_DBF_UTILS AS SESSION +DEFINE CLASS CL_DBF_UTILS AS Session _MEMBERDATA = [] ; + [] ; + [] ; @@ -24915,6 +25077,7 @@ DEFINE CLASS CL_LANG AS Custom C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC = "" C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC = "" C_UNKNOWN_CLASS_NAME_LOC = "" + C_USE_FILE_TIMESTAMP_OPTIMIZATION_LOC = "" C_USING_THIS_SETTINGS_LOC = "" C_WARNING_LOC = "" C_WARN_TABLE_ALIAS_ON_INDEX_EXPRESSION_LOC = "" @@ -25028,6 +25191,7 @@ DEFINE CLASS CL_LANG AS Custom .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC = "Nesting erreur de structure. ENDPROC prévu, mais a trouvé ENDDEFINE sur la classe <> (<>), ligne <> du fichier <>" .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC = "Nesting erreur de structure. ENDPROC attendue, mais ENDDEFINE sur la classe <> (<>.<>), ligne <> du fichier <>" .C_UNKNOWN_CLASS_NAME_LOC = "Classe inconnue[<>]" + .C_USE_FILE_TIMESTAMP_OPTIMIZATION_LOC = "Utilisez le fichier Optimisation d'horodatage" .C_USING_THIS_SETTINGS_LOC = "Utilisation de ce paramètre" .C_WARNING_LOC = "AVERTISSEMENT!" .C_WARN_TABLE_ALIAS_ON_INDEX_EXPRESSION_LOC = "AVERTISSEMENT!" + CR_LF+ "ASSUREZ VOUS NE UTILISEZ PAS UN ALIAS DE TABLE SUR LES EXPRESSIONS INDEX CLÉS!! (exemple: index on <>.campo tag keyname)" @@ -25119,6 +25283,7 @@ DEFINE CLASS CL_LANG AS Custom .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC = "Error de anidamiento de estructuras. Se esperaba ENDPROC pero se encontró ENDDEFINE en la clase <> (<>), línea <> del archivo <>" .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC = "Error de anidamiento de estructuras. Se esperaba ENDPROC pero se encontró ENDDEFINE en la clase <> (<>.<>), línea <> del archivo <>" .C_UNKNOWN_CLASS_NAME_LOC = "Clase [<>] desconocida" + .C_USE_FILE_TIMESTAMP_OPTIMIZATION_LOC = "Usar Optimización de filestamp de archivo" .C_USING_THIS_SETTINGS_LOC = "Usando esta configuración" .C_WARNING_LOC = "¡ATENCIÓN!" .C_WARN_TABLE_ALIAS_ON_INDEX_EXPRESSION_LOC = "¡ATENCIÓN!" + CR_LF+ "ASEGÚRESE DE QUE NO ESTÁ USANDO UN ALIAS DE TABLA EN LAS EXPRESIONES DE LOS ÍNDICES!! (ej: index on <>.campo tag nombreclave)" @@ -25210,6 +25375,7 @@ DEFINE CLASS CL_LANG AS Custom .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC = "Fehler in Verschachtelungsstruktur. ENDPROC erwartet, aber es wurde ENDDEFINE in Klasse <> (<>), Zeile <> der Datei <> gefunden" .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC = "Fehler in Verschachtelungsstruktur. ENDPROC wurde erwartet, aber es wurde ENDDEFINE in Klasse <> (<>.<>), Zeile <> der Datei <> gefunden" .C_UNKNOWN_CLASS_NAME_LOC = "Unbekannte Klasse [<>]" + .C_USE_FILE_TIMESTAMP_OPTIMIZATION_LOC = "Verwenden Sie Datei-Zeitstempel-Optimierung" .C_USING_THIS_SETTINGS_LOC = "Mit dieser einstellung" .C_WARNING_LOC = "WARNUNG!" .C_WARN_TABLE_ALIAS_ON_INDEX_EXPRESSION_LOC = "WARNUNG!" + CR_LF+ "STELLEN SIE SICHER, DAS KEIN TABELLENALIAS IM INDEXAUSDRUCK BENUTZT WIRD!! (z.B.: index on <>.campo tag keyname)" @@ -25301,6 +25467,7 @@ DEFINE CLASS CL_LANG AS Custom .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC = "Nesting structure error. ENDPROC expected but found ENDDEFINE on class <> (<>), line <> of file <>" .C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC = "Nesting structure error. ENDPROC expected but found ENDDEFINE on class <> (<>.<>), line <> of file <>" .C_UNKNOWN_CLASS_NAME_LOC = "Unknown class [<>]" + .C_USE_FILE_TIMESTAMP_OPTIMIZATION_LOC = "Use file timestamp Optimization" .C_USING_THIS_SETTINGS_LOC = "Using this settings" .C_WARNING_LOC = "WARNING!" .C_WARN_TABLE_ALIAS_ON_INDEX_EXPRESSION_LOC = "WARNING!" + CR_LF+ "MAKE SURE YOU ARE NOT USING A TABLE ALIAS ON INDEX KEY EXPRESSIONS!! (ex: index on <>.campo tag keyname)" From 2eb0a26adfc1be18b013258d8da848a3e185f0c1 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 12 Apr 2015 19:02:38 +0200 Subject: [PATCH 3/5] =?UTF-8?q?-=20Algunos=20ajustes=20sobre=20la=20actual?= =?UTF-8?q?izaci=C3=B3n=20de=20la=20progressbar=20-=20Mejora=20API:=20Nuev?= =?UTF-8?q?o=20m=C3=A9todo=20get=5FDirSettings()=20para=20devolver=20el=20?= =?UTF-8?q?objeto=20CFG=20del=20directorio=20indicado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index d9c71fe..fafea8b 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -246,10 +246,12 @@ * tc_InputFile (v! IN ) Nombre completo (fullpath) del archivo a convertir o nombre del directorio a procesar * - Si se indica "BIN2PRG", se procesa el directorio indicado en tcType para generar los TX2 * - Si se indica "PRG2BIN", se procesa el directorio indicado en tcType para generar los BIN -* tcType (v? IN ) Tipo de archivo de entrada. Compatibilidad con SCCTEXT.PRG +* - En modo compatibilidad con Visual SourceSafe, se usa para preguntar el tipo de soporte de conversión para el tipo de archivo indicado +* tcType (v? IN ) Tipo de archivo de entrada * - Si se indica "*" y tc_InputFile es un PJX, se procesa todo el proyecto -* tcTextName (v? IN ) Nombre del archivo texto. Compatibilidad con SCCTEXT.PRG -* tlGenText (v? IN ) .T.=Genera Texto, .F.=Genera Binario. Compatibilidad con SCCTEXT.PRG +* - En modo compatibilidad con Visual SourceSafe, indica el tipo de archivo a convertir +* tcTextName (v? IN ) Nombre del archivo texto. (Solo para compatibilidad con Visual SourceSafe) +* tlGenText (v? IN ) .T.=Genera Texto, .F.=Genera Binario. (Solo para compatibilidad con Visual SourceSafe) * tcDontShowErrors (v? IN ) '1' para NO mostrar errores con MESSAGEBOX * tcDebug (v? IN ) '1' para depurar en el sitio donde ocurre el error (solo modo desarrollo) * tcDontShowProgress (v? IN ) '1' para NO mostrar la ventana de progreso @@ -681,7 +683,7 @@ DEFINE CLASS c_foxbin2prg AS Session c_BackgroundImage = '' l_ClearUniqueID = .T. l_ClearDBFLastUpdate = .T. - n_OptimizeByFilestamp = 2 + n_OptimizeByFilestamp = 0 l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_ReportSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias @@ -896,7 +898,7 @@ DEFINE CLASS c_foxbin2prg AS Session TRY *-- Si o_Frm_Avance se habilitó de forma externa, n_ShowProgressbar podría ser 0 para controlarlo desde fuera. WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF .l_ProcessFiles AND VARTYPE(.o_Frm_Avance) = "O" THEN + IF VARTYPE(.o_Frm_Avance) = "O" THEN *-- Cuando esta rutina se invoca desde el script, este método es el #1 y no puede cancelarse todavía IF .o_Frm_Avance.l_Cancelled AND PROGRAM(-1) > 1 THEN ERROR 1799 @@ -2256,13 +2258,15 @@ DEFINE CLASS c_foxbin2prg AS Session *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * tc_InputFile (v! IN ) Nombre completo (fullpath) del archivo a convertir o nombre del directorio a procesar + * - En modo compatibilidad con Visual SourceSafe, se usa para preguntar el tipo de soporte de conversión para el tipo de archivo indicado * tcType (v? IN ) Tipo de archivo de entrada. Compatibilidad con SCCTEXT.PRG * - Si se indica "*" y tc_InputFile es un PJX, se procesan todos los archivos del proyecto y el PJX/2 * - Si se indica "*-" y tc_InputFile es un PJX, se procesan todos los archivos del proyecto sin el PJX/2 * - Si se indica "BIN2PRG", se procesa el directorio indicado en tc_InputFile para generar los TX2 * - Si se indica "PRG2BIN", se procesa el directorio indicado en tc_InputFile para generar los BIN - * tcTextName (v? IN ) Nombre del archivo texto. Compatibilidad con SCCTEXT.PRG - * tlGenText (v? IN ) .T.=Genera Texto, .F.=Genera Binario. Compatibilidad con SCCTEXT.PRG + * - En modo compatibilidad con Visual SourceSafe, indica el tipo de archivo a convertir + * tcTextName (v? IN ) Nombre del archivo texto. (Solo para compatibilidad con Visual SourceSafe) + * tlGenText (v? IN ) .T.=Genera Texto, .F.=Genera Binario. (Solo para compatibilidad con Visual SourceSafe) * tcDontShowErrors (v? IN ) '1' para no mostrar mensajes de error (MESSAGEBOX) * tcDebug (v? IN ) '1' para habilitar modo debug (SOLO DESARROLLO) * tcDontShowProgress (v? IN ) '1' para inhabilitar la barra de progreso @@ -2456,7 +2460,7 @@ DEFINE CLASS c_foxbin2prg AS Session ENDIF IF EVL(tcType,'0') <> '*' THEN - IF .n_ShowProgressbar <> 0 THEN + IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN .cargar_frm_avance() ENDIF @@ -2499,7 +2503,7 @@ DEFINE CLASS c_foxbin2prg AS Session CASE ATC('-BIN2PRG', ('-' + tcType)) >= 1 .writeLog( '> ' + loLang.C_OPTION_LOC + ': BIN2PRG' ) - IF .n_ShowProgressbar <> 0 THEN + IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN .cargar_frm_avance() .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' ) ENDIF @@ -2559,7 +2563,7 @@ DEFINE CLASS c_foxbin2prg AS Session CASE ATC('-PRG2BIN', ('-' + tcType)) >= 1 .writeLog( '> ' + loLang.C_OPTION_LOC + ': PRG2BIN' ) - IF .n_ShowProgressbar <> 0 THEN + IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN .cargar_frm_avance() .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' ) ENDIF @@ -2683,7 +2687,7 @@ DEFINE CLASS c_foxbin2prg AS Session ENDCASE IF FILE(tc_InputFile) - IF .n_ShowProgressbar = 1 THEN + IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN .cargar_frm_avance() ENDIF @@ -2824,7 +2828,7 @@ DEFINE CLASS c_foxbin2prg AS Session loLang = _SCREEN.o_FoxBin2Prg_Lang lcFileSpec = FULLPATH( tc_InputFile ) - IF .n_ShowProgressbar <> 0 THEN + IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN .cargar_frm_avance() .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' ) ENDIF @@ -2925,7 +2929,7 @@ DEFINE CLASS c_foxbin2prg AS Session loLang = _SCREEN.o_FoxBin2Prg_Lang lcFileSpec = FULLPATH( tc_InputFile ) - IF .n_ShowProgressbar <> 0 THEN + IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN .cargar_frm_avance() .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' ) ENDIF @@ -3414,6 +3418,18 @@ DEFINE CLASS c_foxbin2prg AS Session ENDPROC + PROCEDURE get_DirSettings + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * tcDir (@? IN ) Directorio del que devolver su configuración + * RETORNO (@? OUT) Objeto CFG + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcDir + THIS.EvaluarConfiguracion( '', '', '', '', '', '', '', '', tcDir, 'D' ) + RETURN THIS.o_Configuration(THIS.n_CFG_Actual) + ENDPROC + + PROCEDURE get_PROGRAM_HEADER LOCAL lcText lcText = '' From 210c65d2f40bf242ad91eefab1e41fd75a119402 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 12 Apr 2015 19:06:10 +0200 Subject: [PATCH 4/5] =?UTF-8?q?-=20Agregados=20algunos=20comentarios=20de?= =?UTF-8?q?=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index fafea8b..446fe4b 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -499,7 +499,7 @@ ADDPROPERTY(_SCREEN, 'ExitCode', lnResp) IF _VFP.STARTMODE <> 4 && 4 = Visual FoxPro was started as a distributable .app or .exe file. STORE NULL TO loEx, loCnv RELEASE loEx, loCnv - RETURN lnResp + RETURN lnResp && lnResp contiene un código de error, pero invocado desde SourceSafe puede contener el tipo de soporte de archivo (0,1,2). ENDIF IF EMPTY(lnResp) OR VARTYPE(loEx) # "O" @@ -2655,7 +2655,7 @@ DEFINE CLASS c_foxbin2prg AS Session lnCodError = .PJX_Conversion_Support OTHERWISE - lnCodError = -1 + lnCodError = -1 && No support. ENDCASE ELSE From 45224feded9fe81efe295b40e2ca5cbf865d7462 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 12 Apr 2015 19:11:15 +0200 Subject: [PATCH 5/5] =?UTF-8?q?-=20Actualizaci=C3=B3n=20de=20cr=C3=A9ditos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 446fe4b..aa7b6ef 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -156,6 +156,7 @@ * 25/03/2015 FDBOZZO v1.19.42 Mejora API: Nueva propiedad l_ProcessFiles que permite obtener la lista de archivos a procesar sin procesarlos realmente usando el valor .F. * 25/03/2015 FDBOZZO v1.19.42 Bug Fix frx/lbx: Arreglo de CR,LF,TAB sobrantes en algunos archivos FR2/LB2 agregados en versiones anteriores (Ryan Harris) * 02/04/2015 FDBOZZO v1.19.42 Mejora: Herencia de CFGs entre directorios +* 12/04/2015 FDBOZZO v1.19.42 Mejora API: Crear un método API get_DirSettings() para obtener información de seteos del directorio indicado (Lutz Scheffler) * * *--------------------------------------------------------------------------------------------------- @@ -233,6 +234,7 @@ * 23/03/2015 Lutz Scheffler Reporte bug mnx v1.19.41: No se mantiene el Pad vacío al regenerar el menú cuando se define un menu con un Pad sin nombre (Arreglado en v1.19.42) * 24/03/2015 Ryan Harris Reporte bug frx/lbx v1.19.41: Hay algunos CR,LF,TAB sobrantes en las etiquetas tag de algunos archivos FR2/LB2 (Arreglado en v1.19.42) * 24/03/2015 Ryan Harris Mejora v1.19.41: Borrar archivos ERR al procesar, cuando se usa UseClassPerFile (Agregado en v1.19.42) +* 10/04/2015 Lutz Scheffler Mejora v1.19.41: Crear un método API get_DirSettings() para obtener información de seteos del directorio indicado (Agregado en v1.19.42) * * *--------------------------------------------------------------------------------------------------- @@ -560,6 +562,7 @@ DEFINE CLASS c_foxbin2prg AS Session + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ;