From bc051b531551398f39cdba24f1eda63d39cdddd7 Mon Sep 17 00:00:00 2001 From: Lutz Date: Wed, 3 Mar 2021 10:38:24 +0100 Subject: [PATCH] Bug fix DBF_Conversion_Condition, problem with macro expansion --- Documentacion/github/.gitignore | 11 + Documentacion/github/pictures/.gitignore | 12 + foxbin2prg.exe | Bin 683252 -> 735052 bytes foxbin2prg.prg | 43272 +++++++++++---------- 4 files changed, 21718 insertions(+), 21577 deletions(-) create mode 100644 Documentacion/github/.gitignore create mode 100644 Documentacion/github/pictures/.gitignore diff --git a/Documentacion/github/.gitignore b/Documentacion/github/.gitignore new file mode 100644 index 0000000..a923fe1 --- /dev/null +++ b/Documentacion/github/.gitignore @@ -0,0 +1,11 @@ +# we use the exclude-all-include-special approach, easier then excluding any odd stuff later +#exclude general +*.* + +#include general +# docs +!*.md + +#include special +#default git +!*.gitignore diff --git a/Documentacion/github/pictures/.gitignore b/Documentacion/github/pictures/.gitignore new file mode 100644 index 0000000..c26aa05 --- /dev/null +++ b/Documentacion/github/pictures/.gitignore @@ -0,0 +1,12 @@ +# we use the exclude-all-include-special approach, easier then excluding any odd stuff later +#exclude general +*.* + +#include general +#grafics +!*.gif +!*.png + +#include special +#default git +!*.gitignore diff --git a/foxbin2prg.exe b/foxbin2prg.exe index 5c0d3dfa9405a7d72bfdd965a19c0554ee0bf032..0a002264caac3e6ba547e7fd0df16dde6bf8b14d 100644 GIT binary patch delta 190679 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Ξ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 ST!rM{@WHDsU4oG;j|AlV*l8;?x=g+!cG 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 TU5Q^O`TO7a=;yiVWVikclB)m{ delta 157632 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 O3fT1)+FiYiU;ZBfeTBgQ diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 393cd73..d70800f 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -225,12 +225,11 @@ * 01/04/2020 DH v1.19.51 Bug Fix: Manejo de AutoIncrement incompatible con Project Explorer (Dan Lauer) * 01/04/2020 FDBOZZO v1.19.51 Bug Fix: La conversión de tablas falla si algún campo contiene una palabra reservada como UNIQUE (DAJU78) * 01/04/2020 FDBOZZO v1.19.51 Bug Fix: No se respetan las propiedades de VCX/SCX con nombre "note" (Tracy Pearson) - -* 14/02/2021 Lutz Scheffler conversion dbf -> prg, error if only test mode (toFoxBin2Prg.l_ProcessFiles is false) -* minor translations -* 14/02/2021 Lutz Scheffler conversion prg -> dbf, fields with .NULL. value are incorectly recreated -* 15/02/2021 Lutz Scheffler processing directory, flush log file after loop instead of file -* 16/02/2021 Lutz Scheffler conversion prg -> vcx, files per class could create one class multiple times +* 14/02/2021 LScheffler v1.19.52 Bug Fix: conversion dbf -> prg, error if only test mode (toFoxBin2Prg.l_ProcessFiles is false) +* 14/02/2021 LScheffler v1.19.52 Bug Fix: conversion prg -> dbf, fields with .NULL. value are incorectly recreated +* 15/02/2021 LScheffler v1.19.53 Bug Fix: processing directory, flush log file after loop instead of file +* 16/02/2021 LScheffler v1.19.53 Bug Fix: conversion prg -> vcx, files per class could create one class multiple times +* 03/03/2021 LScheffler v1.19.54 Bug Fix: DBF_Conversion_Condition, problem with macro expansion * * *--------------------------------------------------------------------------------------------------- @@ -400,213 +399,213 @@ *--------------------------------------------------------------------------------------------------- * Ej: DO FOXBIN2PRG.PRG WITH "C:\DESA\INTEGRACION\LIBRERIA.VCX" *--------------------------------------------------------------------------------------------------- -LPARAMETERS tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDebug, tcDontShowProgress, tcOriginalFileName ; +Lparameters tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDebug, tcDontShowProgress, tcOriginalFileName ; , tcRecompile, tcNoTimestamps, tcCFG_File *-- NO modificar! / Do NOT change! -#DEFINE C_CMT_I '*--' -#DEFINE C_CMT_F '--*' -#DEFINE C_CLASSCOMMENTS_I '*' -#DEFINE C_CLASSCOMMENTS_F '*' -#DEFINE C_LEN_CLASSCOMMENTS_I LEN(C_CLASSCOMMENTS_I) -#DEFINE C_LEN_CLASSCOMMENTS_F LEN(C_CLASSCOMMENTS_F) -#DEFINE C_CLASSDATA_I '*< CLASSDATA:' -#DEFINE C_CLASSDATA_F '/>' -#DEFINE C_LEN_CLASSDATA_I LEN(C_CLASSDATA_I) -#DEFINE C_EXTERNAL_CLASS_I '*< EXTERNAL_CLASS:' -#DEFINE C_EXTERNAL_CLASS_F '/>' -#DEFINE C_LEN_EXTERNAL_CLASS_I LEN(C_EXTERNAL_CLASS_I) -#DEFINE C_EXTERNAL_MEMBER_I '*< EXTERNAL_MEMBER:' -#DEFINE C_EXTERNAL_MEMBER_F '/>' -#DEFINE C_LEN_EXTERNAL_MEMBER_I LEN(C_EXTERNAL_MEMBER_I) -#DEFINE C_OBJECTDATA_I '*< OBJECTDATA:' -#DEFINE C_OBJECTDATA_F '/>' -#DEFINE C_LEN_OBJECTDATA_I LEN(C_OBJECTDATA_I) -#DEFINE C_OLE_I '*< OLE:' -#DEFINE C_OLE_F '/>' -#DEFINE C_LEN_OLE_I LEN(C_OLE_I) -#DEFINE C_DEFINED_PAM_I '*' -#DEFINE C_DEFINED_PAM_F '*' -#DEFINE C_LEN_DEFINED_PAM_I LEN(C_DEFINED_PAM_I) -#DEFINE C_LEN_DEFINED_PAM_F LEN(C_DEFINED_PAM_F) -#DEFINE C_END_OBJECT_I '*< END OBJECT:' -#DEFINE C_END_OBJECT_F '/>' -#DEFINE C_LEN_END_OBJECT_I LEN(C_END_OBJECT_I) -#DEFINE C_FB2PRG_META_I '*< FOXBIN2PRG:' -#DEFINE C_FB2PRG_META_F '/>' -#DEFINE C_LIBCOMMENT_I '*< LIBCOMMENT:' -#DEFINE C_LIBCOMMENT_F '/>' -#DEFINE C_DEFINE_CLASS 'DEFINE CLASS' -#DEFINE C_ENDDEFINE 'ENDDEFINE' -#DEFINE C_TEXT 'TEXT' -#DEFINE C_ENDTEXT 'ENDTEXT' -#DEFINE C_PROCEDURE 'PROCEDURE' -#DEFINE C_ENDPROC 'ENDPROC' -#DEFINE C_WITH 'WITH' -#DEFINE C_ENDWITH 'ENDWITH' -#DEFINE C_SRV_HEAD_I '*' -#DEFINE C_SRV_HEAD_F '*' -#DEFINE C_SRV_DATA_I '*' -#DEFINE C_SRV_DATA_F '*' -#DEFINE C_DEVINFO_I '*' -#DEFINE C_DEVINFO_F '*' -#DEFINE C_BUILDPROJ_I '*' -#DEFINE C_BUILDPROJ_F '*' -#DEFINE C_PROJPROPS_I '*' -#DEFINE C_PROJPROPS_F '*' -#DEFINE C_FILE_META_I '*< FileMetadata:' -#DEFINE C_FILE_META_F '/>' -#DEFINE C_FILE_CMTS_I '*' -#DEFINE C_FILE_CMTS_F '*' -#DEFINE C_FILE_EXCL_I '*' -#DEFINE C_FILE_EXCL_F '*' -#DEFINE C_FILE_TXT_I '*' -#DEFINE C_FILE_TXT_F '*' -#DEFINE C_FB2P_VALUE_I '' -#DEFINE C_FB2P_VALUE_F '' -#DEFINE C_LEN_FB2P_VALUE_I LEN(C_FB2P_VALUE_I) -#DEFINE C_LEN_FB2P_VALUE_F LEN(C_FB2P_VALUE_F) -#DEFINE C_VFPDATA_I '' -#DEFINE C_VFPDATA_F '' -#DEFINE C_MEMBERDATA_I C_VFPDATA_I -#DEFINE C_MEMBERDATA_F C_VFPDATA_F -#DEFINE C_LEN_MEMBERDATA_I LEN(C_MEMBERDATA_I) -#DEFINE C_LEN_MEMBERDATA_F LEN(C_MEMBERDATA_F) -#DEFINE C_DATA_I '' -#DEFINE C_TAG_REPORTE 'Reportes' -#DEFINE C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>' -#DEFINE C_TAG_REPORTE_F '' -#DEFINE C_DBF_HEAD_I '' -#DEFINE C_LEN_DBF_HEAD_I LEN(C_DBF_HEAD_I) -#DEFINE C_LEN_DBF_HEAD_F LEN(C_DBF_HEAD_F) -#DEFINE C_CDX_I '' -#DEFINE C_CDX_F '' -#DEFINE C_LEN_CDX_I LEN(C_CDX_I) -#DEFINE C_LEN_CDX_F LEN(C_CDX_F) -#DEFINE C_LEN_INDEX_I LEN(C_INDEX_I) -#DEFINE C_LEN_INDEX_F LEN(C_INDEX_F) -#DEFINE C_DATABASE_I '' -#DEFINE C_DATABASE_F '' -#DEFINE C_STORED_PROC_I '' -#DEFINE C_TABLE_I '' -#DEFINE C_TABLE_F '
' -#DEFINE C_TABLES_I '' -#DEFINE C_TABLES_F '' -#DEFINE C_VIEW_I '' -#DEFINE C_VIEW_F '' -#DEFINE C_VIEWS_I '' -#DEFINE C_VIEWS_F '' -#DEFINE C_FIELD_ORDER_I '' -#DEFINE C_FIELD_ORDER_F '' -#DEFINE C_FIELD_I '' -#DEFINE C_FIELD_F '' -#DEFINE C_FIELDS_I '' -#DEFINE C_FIELDS_F '' -#DEFINE C_CONNECTION_I '' -#DEFINE C_CONNECTION_F '' -#DEFINE C_CONNECTIONS_I '' -#DEFINE C_CONNECTIONS_F '' -#DEFINE C_RELATION_I '' -#DEFINE C_RELATION_F '' -#DEFINE C_RELATIONS_I '' -#DEFINE C_RELATIONS_F '' -#DEFINE C_INDEX_I '' -#DEFINE C_INDEX_F '' -#DEFINE C_INDEXES_I '' -#DEFINE C_INDEXES_F '' -#DEFINE C_PROC_CODE_I '*' -#DEFINE C_PROC_CODE_F '*' -#DEFINE C_SETUPCODE_I '*' -#DEFINE C_SETUPCODE_F '*' -#DEFINE C_CLEANUPCODE_I '*' -#DEFINE C_CLEANUPCODE_F '*' -#DEFINE C_MENUCODE_I '*' -#DEFINE C_MENUCODE_F '*' -#DEFINE C_MENUTYPE_I '*' -#DEFINE C_MENUTYPE_F '' -#DEFINE C_MENULOCATION_I '*' -#DEFINE C_MENULOCATION_F '' +#Define C_CMT_I '*--' +#Define C_CMT_F '--*' +#Define C_CLASSCOMMENTS_I '*' +#Define C_CLASSCOMMENTS_F '*' +#Define C_LEN_CLASSCOMMENTS_I Len(C_CLASSCOMMENTS_I) +#Define C_LEN_CLASSCOMMENTS_F Len(C_CLASSCOMMENTS_F) +#Define C_CLASSDATA_I '*< CLASSDATA:' +#Define C_CLASSDATA_F '/>' +#Define C_LEN_CLASSDATA_I Len(C_CLASSDATA_I) +#Define C_EXTERNAL_CLASS_I '*< EXTERNAL_CLASS:' +#Define C_EXTERNAL_CLASS_F '/>' +#Define C_LEN_EXTERNAL_CLASS_I Len(C_EXTERNAL_CLASS_I) +#Define C_EXTERNAL_MEMBER_I '*< EXTERNAL_MEMBER:' +#Define C_EXTERNAL_MEMBER_F '/>' +#Define C_LEN_EXTERNAL_MEMBER_I Len(C_EXTERNAL_MEMBER_I) +#Define C_OBJECTDATA_I '*< OBJECTDATA:' +#Define C_OBJECTDATA_F '/>' +#Define C_LEN_OBJECTDATA_I Len(C_OBJECTDATA_I) +#Define C_OLE_I '*< OLE:' +#Define C_OLE_F '/>' +#Define C_LEN_OLE_I Len(C_OLE_I) +#Define C_DEFINED_PAM_I '*' +#Define C_DEFINED_PAM_F '*' +#Define C_LEN_DEFINED_PAM_I Len(C_DEFINED_PAM_I) +#Define C_LEN_DEFINED_PAM_F Len(C_DEFINED_PAM_F) +#Define C_END_OBJECT_I '*< END OBJECT:' +#Define C_END_OBJECT_F '/>' +#Define C_LEN_END_OBJECT_I Len(C_END_OBJECT_I) +#Define C_FB2PRG_META_I '*< FOXBIN2PRG:' +#Define C_FB2PRG_META_F '/>' +#Define C_LIBCOMMENT_I '*< LIBCOMMENT:' +#Define C_LIBCOMMENT_F '/>' +#Define C_DEFINE_CLASS 'DEFINE CLASS' +#Define C_ENDDEFINE 'ENDDEFINE' +#Define C_TEXT 'TEXT' +#Define C_ENDTEXT 'ENDTEXT' +#Define C_PROCEDURE 'PROCEDURE' +#Define C_ENDPROC 'ENDPROC' +#Define C_WITH 'WITH' +#Define C_ENDWITH 'ENDWITH' +#Define C_SRV_HEAD_I '*' +#Define C_SRV_HEAD_F '*' +#Define C_SRV_DATA_I '*' +#Define C_SRV_DATA_F '*' +#Define C_DEVINFO_I '*' +#Define C_DEVINFO_F '*' +#Define C_BUILDPROJ_I '*' +#Define C_BUILDPROJ_F '*' +#Define C_PROJPROPS_I '*' +#Define C_PROJPROPS_F '*' +#Define C_FILE_META_I '*< FileMetadata:' +#Define C_FILE_META_F '/>' +#Define C_FILE_CMTS_I '*' +#Define C_FILE_CMTS_F '*' +#Define C_FILE_EXCL_I '*' +#Define C_FILE_EXCL_F '*' +#Define C_FILE_TXT_I '*' +#Define C_FILE_TXT_F '*' +#Define C_FB2P_VALUE_I '' +#Define C_FB2P_VALUE_F '' +#Define C_LEN_FB2P_VALUE_I Len(C_FB2P_VALUE_I) +#Define C_LEN_FB2P_VALUE_F Len(C_FB2P_VALUE_F) +#Define C_VFPDATA_I '' +#Define C_VFPDATA_F '' +#Define C_MEMBERDATA_I C_VFPDATA_I +#Define C_MEMBERDATA_F C_VFPDATA_F +#Define C_LEN_MEMBERDATA_I Len(C_MEMBERDATA_I) +#Define C_LEN_MEMBERDATA_F Len(C_MEMBERDATA_F) +#Define C_DATA_I '' +#Define C_TAG_REPORTE 'Reportes' +#Define C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>' +#Define C_TAG_REPORTE_F '' +#Define C_DBF_HEAD_I '' +#Define C_LEN_DBF_HEAD_I Len(C_DBF_HEAD_I) +#Define C_LEN_DBF_HEAD_F Len(C_DBF_HEAD_F) +#Define C_CDX_I '' +#Define C_CDX_F '' +#Define C_LEN_CDX_I Len(C_CDX_I) +#Define C_LEN_CDX_F Len(C_CDX_F) +#Define C_LEN_INDEX_I Len(C_INDEX_I) +#Define C_LEN_INDEX_F Len(C_INDEX_F) +#Define C_DATABASE_I '' +#Define C_DATABASE_F '' +#Define C_STORED_PROC_I '' +#Define C_TABLE_I '' +#Define C_TABLE_F '
' +#Define C_TABLES_I '' +#Define C_TABLES_F '' +#Define C_VIEW_I '' +#Define C_VIEW_F '' +#Define C_VIEWS_I '' +#Define C_VIEWS_F '' +#Define C_FIELD_ORDER_I '' +#Define C_FIELD_ORDER_F '' +#Define C_FIELD_I '' +#Define C_FIELD_F '' +#Define C_FIELDS_I '' +#Define C_FIELDS_F '' +#Define C_CONNECTION_I '' +#Define C_CONNECTION_F '' +#Define C_CONNECTIONS_I '' +#Define C_CONNECTIONS_F '' +#Define C_RELATION_I '' +#Define C_RELATION_F '' +#Define C_RELATIONS_I '' +#Define C_RELATIONS_F '' +#Define C_INDEX_I '' +#Define C_INDEX_F '' +#Define C_INDEXES_I '' +#Define C_INDEXES_F '' +#Define C_PROC_CODE_I '*' +#Define C_PROC_CODE_F '*' +#Define C_SETUPCODE_I '*' +#Define C_SETUPCODE_F '*' +#Define C_CLEANUPCODE_I '*' +#Define C_CLEANUPCODE_F '*' +#Define C_MENUCODE_I '*' +#Define C_MENUCODE_F '*' +#Define C_MENUTYPE_I '*' +#Define C_MENUTYPE_F '' +#Define C_MENULOCATION_I '*' +#Define C_MENULOCATION_F '' *-- -#DEFINE C_TAB CHR(9) -#DEFINE C_CR CHR(13) -#DEFINE C_LF CHR(10) -#DEFINE C_NULL_CHAR CHR(0) -#DEFINE CR_LF C_CR + C_LF -#DEFINE C_MPROPHEADER REPLICATE( CHR(1), 517 ) +#Define C_TAB Chr(9) +#Define C_CR Chr(13) +#Define C_LF Chr(10) +#Define C_NULL_CHAR Chr(0) +#Define CR_LF C_CR + C_LF +#Define C_MPROPHEADER Replicate( Chr(1), 517 ) *** DH 06/02/2014: added additional constants -#DEFINE C_RECORDS_I '' -#DEFINE C_RECORDS_F '' -#DEFINE C_RECORD_I '' && *** FDBOZZO 2016/06/06: Quitado el REGNUM para evitar diferencias innecesarias -#DEFINE C_RECORD_F '' -#DEFINE C_RECNO_I '' -#DEFINE C_RECNO_F '' +#Define C_RECORDS_I '' +#Define C_RECORDS_F '' +#Define C_RECORD_I '' && *** FDBOZZO 2016/06/06: Quitado el REGNUM para evitar diferencias innecesarias +#Define C_RECORD_F '' +#Define C_RECNO_I '' +#Define C_RECNO_F '' *-- Fin / End *-- From FOXPRO.H *-- File Object Type Property -#DEFINE FILETYPE_DATABASE "d" && Database (.DBC) -#DEFINE FILETYPE_FREETABLE "D" && Free table (.DBF) -#DEFINE FILETYPE_QUERY "Q" && Query (.QPR) -#DEFINE FILETYPE_FORM "K" && Form (.SCX) -#DEFINE FILETYPE_REPORT "R" && Report (.FRX) -#DEFINE FILETYPE_LABEL "B" && Label (.LBX) -#DEFINE FILETYPE_CLASSLIB "V" && Class Library (.VCX) -#DEFINE FILETYPE_PROGRAM "P" && Program (.PRG) -#DEFINE FILETYPE_PROJECT "J" && Project (.PJX) [NON STANDARD!] -#DEFINE FILETYPE_APILIB "L" && API Library (.FLL) -#DEFINE FILETYPE_APPLICATION "Z" && Application (.APP) -#DEFINE FILETYPE_MENU "M" && Menu (.MNX) -#DEFINE FILETYPE_TEXT "T" && Text (.TXT, .H., etc.) -#DEFINE FILETYPE_OTHER "x" && Other file types not enumerated above +#Define FILETYPE_DATABASE "d" && Database (.DBC) +#Define FILETYPE_FREETABLE "D" && Free table (.DBF) +#Define FILETYPE_QUERY "Q" && Query (.QPR) +#Define FILETYPE_FORM "K" && Form (.SCX) +#Define FILETYPE_REPORT "R" && Report (.FRX) +#Define FILETYPE_LABEL "B" && Label (.LBX) +#Define FILETYPE_CLASSLIB "V" && Class Library (.VCX) +#Define FILETYPE_PROGRAM "P" && Program (.PRG) +#Define FILETYPE_PROJECT "J" && Project (.PJX) [NON STANDARD!] +#Define FILETYPE_APILIB "L" && API Library (.FLL) +#Define FILETYPE_APPLICATION "Z" && Application (.APP) +#Define FILETYPE_MENU "M" && Menu (.MNX) +#Define FILETYPE_TEXT "T" && Text (.TXT, .H., etc.) +#Define FILETYPE_OTHER "x" && Other file types not enumerated above *-- Menu OBJTYPE constants -#DEFINE C_OBJTYPE_MENUTYPE_DEFAULT 1 -#DEFINE C_OBJTYPE_MENUTYPE_BARorPOPUP 2 -#DEFINE C_OBJTYPE_MENUTYPE_OPTION 3 -#DEFINE C_OBJTYPE_MENUTYPE_SHORTCUT 4 -#DEFINE C_OBJTYPE_MENUTYPE_MENUBARONTOP 5 +#Define C_OBJTYPE_MENUTYPE_DEFAULT 1 +#Define C_OBJTYPE_MENUTYPE_BARorPOPUP 2 +#Define C_OBJTYPE_MENUTYPE_OPTION 3 +#Define C_OBJTYPE_MENUTYPE_SHORTCUT 4 +#Define C_OBJTYPE_MENUTYPE_MENUBARONTOP 5 *-- Menu OBJCODE constants -#DEFINE C_OBJCODE_MENUBARPOPUP_MENUPAD 0 -#DEFINE C_OBJCODE_MENUBARPOPUP_MENUBAR 1 -#DEFINE C_OBJCODE_MENUDEFAULT_DEFAULT 22 -#DEFINE C_OBJCODE_MENUOPTION_COMMAND 67 -#DEFINE C_OBJCODE_MENUOPTION_SUBMENU 77 -#DEFINE C_OBJCODE_MENUOPTION_BARNUM 78 -#DEFINE C_OBJCODE_MENUOPTION_PROCEDURE 80 +#Define C_OBJCODE_MENUBARPOPUP_MENUPAD 0 +#Define C_OBJCODE_MENUBARPOPUP_MENUBAR 1 +#Define C_OBJCODE_MENUDEFAULT_DEFAULT 22 +#Define C_OBJCODE_MENUOPTION_COMMAND 67 +#Define C_OBJCODE_MENUOPTION_SUBMENU 77 +#Define C_OBJCODE_MENUOPTION_BARNUM 78 +#Define C_OBJCODE_MENUOPTION_PROCEDURE 80 *-- Menu Location constants -#DEFINE C_MENULOCATION_REPLACE 0 -#DEFINE C_MENULOCATION_APPEND 1 -#DEFINE C_MENULOCATION_BEFORE 2 -#DEFINE C_MENULOCATION_AFTER 3 +#Define C_MENULOCATION_REPLACE 0 +#Define C_MENULOCATION_APPEND 1 +#Define C_MENULOCATION_BEFORE 2 +#Define C_MENULOCATION_AFTER 3 *-- Server Object Instancing Property -#DEFINE SERVERINSTANCE_SINGLEUSE 1 && Single use server -#DEFINE SERVERINSTANCE_NOTCREATABLE 2 && Instances creatable only inside Visual FoxPro -#DEFINE SERVERINSTANCE_MULTIUSE 3 && Multi-use server +#Define SERVERINSTANCE_SINGLEUSE 1 && Single use server +#Define SERVERINSTANCE_NOTCREATABLE 2 && Instances creatable only inside Visual FoxPro +#Define SERVERINSTANCE_MULTIUSE 3 && Multi-use server *-- FileTypes for ADIR() -#DEFINE C_FILETYPE_DIRECTORY "D" -#DEFINE C_FILETYPE_FILE "F" -#DEFINE C_FILETYPE_QUERYSUPPORT "Q" +#Define C_FILETYPE_DIRECTORY "D" +#Define C_FILETYPE_FILE "F" +#Define C_FILETYPE_QUERYSUPPORT "Q" *-- Fin / End *-- Predefine 64MB of RAM -SYS(3050,1,64*1024*1024) -SYS(3050,2,64*1024*1024) +Sys(3050,1,64*1024*1024) +Sys(3050,2,64*1024*1024) -IF _VFP.StartMode > 0 THEN - SYS(2450,1) && Set Application Search Path Order to APP/EXE 1st when not in Dev-Mode -ENDIF +If _vfp.StartMode > 0 Then + Sys(2450,1) && Set Application Search Path Order to APP/EXE 1st when not in Dev-Mode +Endif -LOCAL loCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' -LOCAL lnResp, loEx AS EXCEPTION +Local loCnv As c_foxbin2prg Of 'FOXBIN2PRG.PRG' +Local lnResp, loEx As Exception *SET COVERAGE TO c:\desa\foxbin2prg\foxbin2prg_coverage.log *SYS(2030,1) && Enable system component debugging @@ -620,53 +619,53 @@ LOCAL lnResp, loEx AS EXCEPTION + 'tcType = ' + TRANSFORM(tcType) ) *-- En el caso de recibir "BIN2PRG" o "PRG2BIN" en el primer parámetro, los invierto. -tc_InputFile = EVL(tc_InputFile,'') -tcType = EVL(tcType,'') +tc_InputFile = Evl(tc_InputFile,'') +tcType = Evl(tcType,'') -IF ATC('-BIN2PRG','-'+tc_InputFile) > 0 OR ATC('-PRG2BIN','-'+tc_InputFile) > 0 ; - OR ATC('-SHOWMSG','-'+tc_InputFile) > 0 OR ATC('-INTERACTIVE','-'+tc_InputFile) > 0 ; - OR ATC('-SIMERR_I0','-'+tc_InputFile) > 0 OR ATC('-SIMERR_I1','-'+tc_InputFile) > 0 ; - OR ATC('-SIMERR_O1','-'+tc_InputFile) > 0 THEN +If Atc('-BIN2PRG','-'+tc_InputFile) > 0 Or Atc('-PRG2BIN','-'+tc_InputFile) > 0 ; + OR Atc('-SHOWMSG','-'+tc_InputFile) > 0 Or Atc('-INTERACTIVE','-'+tc_InputFile) > 0 ; + OR Atc('-SIMERR_I0','-'+tc_InputFile) > 0 Or Atc('-SIMERR_I1','-'+tc_InputFile) > 0 ; + OR Atc('-SIMERR_O1','-'+tc_InputFile) > 0 Then pcParamX = tc_InputFile tc_InputFile = tcType tcType = pcParamX - RELEASE pcParamX -ENDIF + Release pcParamX +Endif -TRY - loEx = NULL - loCnv = CREATEOBJECT("c_foxbin2prg") - lnResp = loCnv.execute( tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDebug ; - , tcDontShowProgress, NULL, @loEx, .F., tcOriginalFileName, tcRecompile, tcNoTimestamps ; - , .F., .F., .F., tcCFG_File ) -CATCH TO loEx - *-- Esto solo es para errores en el INIT, ya que los demás se deben capturar y tratar antes. - lnResp = loEx.ErrorNo - MESSAGEBOX( 'Error ' + TRANSFORM(loEx.ErrorNo) + ', ' + loEx.Message + C_CR ; - + loEx.Procedure + ', Line ' + TRANSFORM(loEx.LineNo) + C_CR ; - + loEx.Details ; - , 0+16+4096 ; - , '' ; - , 60000 ) -ENDTRY +Try + loEx = Null + loCnv = Createobject("c_foxbin2prg") + lnResp = loCnv.execute( tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDebug ; + , tcDontShowProgress, Null, @loEx, .F., tcOriginalFileName, tcRecompile, tcNoTimestamps ; + , .F., .F., .F., tcCFG_File ) + Catch To loEx +*-- Esto solo es para errores en el INIT, ya que los demás se deben capturar y tratar antes. + lnResp = loEx.ErrorNo + Messagebox( 'Error ' + Transform(loEx.ErrorNo) + ', ' + loEx.Message + C_CR ; + + loEx.Procedure + ', Line ' + Transform(loEx.Lineno) + C_CR ; + + loEx.Details ; + , 0+16+4096 ; + , '' ; + , 60000 ) +Endtry -ADDPROPERTY(_SCREEN, 'ExitCode', lnResp) +AddProperty(_Screen, 'ExitCode', lnResp) *SET COVERAGE TO -IF _VFP.STARTMODE <> 4 OR NOT SYS(16) == SYS(16,0) && 4 = Visual FoxPro was started as a distributable .app or .exe file. - STORE NULL TO loEx, loCnv - RELEASE loEx, loCnv - 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 _vfp.StartMode <> 4 Or Not Sys(16) == Sys(16,0) && 4 = Visual FoxPro was started as a distributable .app or .exe file. + Store Null To loEx, loCnv + Release loEx, loCnv + 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) - STORE NULL TO loEx, loCnv - RELEASE loEx, loCnv - QUIT -ENDIF +If Empty(lnResp) + Store Null To loEx, loCnv + Release loEx, loCnv + Quit +Endif -STORE NULL TO loEx, loCnv -RELEASE loEx, loCnv +Store Null To loEx, loCnv +Release loEx, loCnv *-- Muy útil para procesos batch que capturan el código de error *KillMode 1 @@ -674,9 +673,9 @@ RELEASE loEx, loCnv *ExitProcess(1) && Esta debe ser de las últimas instrucciones *KillMode 2 - This one works better. -DECLARE INTEGER OpenProcess IN Win32API INTEGER dwDesiredAccess, INTEGER bInheritHandle, INTEGER dwProcessID -lnHandle = OpenProcess(1, 1, _VFP.PROCESSID) -DECLARE INTEGER TerminateProcess IN Win32API INTEGER hProcess, INTEGER uExitCode +Declare Integer OpenProcess In Win32API Integer dwDesiredAccess, Integer bInheritHandle, Integer dwProcessID +lnHandle = OpenProcess(1, 1, _vfp.ProcessID) +Declare Integer TerminateProcess In Win32API Integer hProcess, Integer uExitCode =TerminateProcess(lnHandle,1) *KillMode 3 @@ -689,8 +688,8 @@ DECLARE INTEGER TerminateProcess IN Win32API INTEGER hProcess, INTEGER uExitCode -DEFINE CLASS c_foxbin2prg AS Session - _MEMBERDATA = [] ; +Define Class c_foxbin2prg As Session + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -812,12 +811,12 @@ DEFINE CLASS c_foxbin2prg AS Session + [] - DIMENSION a_ProcessedFiles(1, 6) - PROTECTED n_CFG_Actual, l_Main_CFG_Loaded, o_Configuration, l_CFG_CachedAccess - *-- + Dimension a_ProcessedFiles(1, 6) + Protected n_CFG_Actual, l_Main_CFG_Loaded, o_Configuration, l_CFG_CachedAccess +*-- n_FB2PRG_Version = 1.19 - c_FB2PRG_Version_Real = '1.19.51' - *-- + c_FB2PRG_Version_Real = '1.19.54.1' +*-- c_Language = '' && EN, FR, ES, DE c_SimulateError = '' && SIMERR_I0, SIMERR_I1, SIMERR_O1 c_loc_processing_file = '' @@ -826,7 +825,7 @@ DEFINE CLASS c_foxbin2prg AS Session c_Foxbin2prg_FullPath = '' c_Foxbin2prg_ConfigFile = '' c_CurDir = '' - c_TempDir = SYS(2023) + c_TempDir = Sys(2023) c_InputFile = '' c_ClassToConvert = '' && Guarda el nombre de la clase a convertir, indicada en tcInputFile como "archivo.vcx::clase" c_ClassOperationType = '' && (I)mport o (E)xport. Se usa solo para manejar clases individuales. @@ -882,13 +881,13 @@ DEFINE CLASS c_foxbin2prg AS Session n_Order_View_Fields = 1 n_ProcessedFiles = 0 && Contador usado para los archivos file.class.ext n_ProcessedFilesCount = 0 && Contador genérico de procesados - o_Conversor = NULL - o_Frm_Avance = NULL - o_WSH = NULL - o_FSO = NULL && Scripting.FileSystemObject - o_TextStream = NULL && Scripting.TextStream - o_FNC = NULL && Filename_caps object - o_Configuration = NULL + o_Conversor = Null + o_Frm_Avance = Null + o_WSH = Null + o_FSO = Null && Scripting.FileSystemObject + o_TextStream = Null && Scripting.TextStream + o_FNC = Null && Filename_caps object + o_Configuration = Null run_AfterCreateTable = '' run_AfterCreate_DB2 = '' c_VC2 = 'VC2' && VCX @@ -915,1784 +914,1784 @@ DEFINE CLASS c_foxbin2prg AS Session DBF_Conversion_Excluded = '' - PROCEDURE INIT - LPARAMETERS tcCFG_File, tcCancelWithEscKey + Procedure Init + Lparameters tcCFG_File, tcCancelWithEscKey - #IF .F. - LOCAL THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcSys16, lnPosProg, lc_Foxbin2prg_EXE, laValues(1,5), lcPicturePath, laDir(1,5) ; + Local lcSys16, lnPosProg, lc_Foxbin2prg_EXE, laValues(1,5), lcPicturePath, laDir(1,5) ; , lcLang - SET DELETED ON - SET DATE YMD - SET HOURS TO 24 - SET CENTURY ON - SET SAFETY OFF - SET MULTILOCKS ON - SET TABLEPROMPT OFF - SET POINT TO '.' - SET SEPARATOR TO ',' - tcCancelWithEscKey = EVL(tcCancelWithEscKey, '') + Set Deleted On + Set Date YMD + Set Hours To 24 + Set Century On + Set Safety Off + Set Multilocks On + Set TablePrompt Off + Set Point To '.' + Set Separator To ',' + tcCancelWithEscKey = Evl(tcCancelWithEscKey, '') - IF NOT EMPTY(tcCancelWithEscKey) - THIS.l_CancelWithEscKey = ( tcCancelWithEscKey == '1' ) - ENDIF + If Not Empty(tcCancelWithEscKey) + This.l_CancelWithEscKey = ( tcCancelWithEscKey == '1' ) + Endif - THIS.declareDLL() + This.declareDLL() - * Check if SYS(2023) point to "Program Files" - IF ATC("\PROGRAM FILES", THIS.c_TempDir) > 0 OR ATC("\ARCHIVOS DE PROGRAMA", THIS.c_TempDir) > 0 - THIS.c_TempDir = GETENV("TEMP") - ENDIF +* Check if SYS(2023) point to "Program Files" + If Atc("\PROGRAM FILES", This.c_TempDir) > 0 Or Atc("\ARCHIVOS DE PROGRAMA", This.c_TempDir) > 0 + This.c_TempDir = Getenv("TEMP") + Endif - THIS.c_LogFile = ADDBS( THIS.c_TempDir ) + 'FoxBin2Prg_Debug.LOG' - THIS.c_ErrorLogFile = ADDBS( THIS.c_TempDir ) + 'FoxBin2Prg_Error.LOG' + This.c_LogFile = Addbs( This.c_TempDir ) + 'FoxBin2Prg_Debug.LOG' + This.c_ErrorLogFile = Addbs( This.c_TempDir ) + 'FoxBin2Prg_Error.LOG' - IF ADIR(laDir, THIS.c_ErrorLogFile) > 0 THEN - IF ADIR(laDir, THIS.c_ErrorLogFile + '.BAK') > 0 THEN - THIS.changeFileAttribute( THIS.c_ErrorLogFile + '.BAK', '-R-S-H' ) - ERASE (THIS.c_ErrorLogFile + '.BAK') - ENDIF + If Adir(laDir, This.c_ErrorLogFile) > 0 Then + If Adir(laDir, This.c_ErrorLogFile + '.BAK') > 0 Then + This.changeFileAttribute( This.c_ErrorLogFile + '.BAK', '-R-S-H' ) + Erase (This.c_ErrorLogFile + '.BAK') + Endif - THIS.changeFileAttribute( THIS.c_ErrorLogFile, '-R-S-H' ) - RENAME (THIS.c_ErrorLogFile) TO (THIS.c_ErrorLogFile + '.BAK') - ENDIF + This.changeFileAttribute( This.c_ErrorLogFile, '-R-S-H' ) + Rename (This.c_ErrorLogFile) To (This.c_ErrorLogFile + '.BAK') + Endif - IF ADIR(laDir, THIS.c_LogFile) > 0 THEN - ERASE (THIS.c_LogFile + '.BAK') - RENAME (THIS.c_LogFile) TO (THIS.c_LogFile + '.BAK') - ENDIF + If Adir(laDir, This.c_LogFile) > 0 Then + Erase (This.c_LogFile + '.BAK') + Rename (This.c_LogFile) To (This.c_LogFile + '.BAK') + Endif - lcSys16 = SYS(16) - IF LEFT(lcSys16,10) == 'PROCEDURE ' - lnPosProg = AT(" ", lcSys16, 2) + 1 - ELSE + lcSys16 = Sys(16) + If Left(lcSys16,10) == 'PROCEDURE ' + lnPosProg = At(" ", lcSys16, 2) + 1 + Else lnPosProg = 1 - ENDIF + Endif - THIS.c_CurDir = SYS(5) + CURDIR() && Directorio actual, que no necesariamente es donde está FoxBin2Prg - THIS.c_Foxbin2prg_FullPath = SUBSTR( lcSys16, lnPosProg ) - THIS.c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, FORCEEXT( THIS.c_Foxbin2prg_FullPath, 'CFG' ) ) - THIS.c_BackgroundImage = THIS.get_AbsolutePath( ADDBS(JUSTPATH(THIS.c_Foxbin2prg_FullPath)) + 'foxbin2prg.jpg' ) - lc_Foxbin2prg_EXE = FORCEEXT( THIS.c_Foxbin2prg_FullPath, 'EXE' ) - THIS.c_FB2PRG_EXE_Version = 'v' + IIF( AGETFILEVERSION( laValues, lc_Foxbin2prg_EXE ) = 0, TRANSFORM(THIS.c_FB2PRG_Version_Real), laValues(11) ) - ADDPROPERTY(_SCREEN, 'c_FB2PRG_EXE_Version', THIS.c_FB2PRG_EXE_Version) - ADDPROPERTY(_SCREEN, 'ExitCode', 0) + This.c_CurDir = Sys(5) + Curdir() && Directorio actual, que no necesariamente es donde está FoxBin2Prg + This.c_Foxbin2prg_FullPath = Substr( lcSys16, lnPosProg ) + This.c_Foxbin2prg_ConfigFile = Evl( tcCFG_File, Forceext( This.c_Foxbin2prg_FullPath, 'CFG' ) ) + This.c_BackgroundImage = This.get_AbsolutePath( Addbs(Justpath(This.c_Foxbin2prg_FullPath)) + 'foxbin2prg.jpg' ) + lc_Foxbin2prg_EXE = Forceext( This.c_Foxbin2prg_FullPath, 'EXE' ) + This.c_FB2PRG_EXE_Version = 'v' + Iif( Agetfileversion( laValues, lc_Foxbin2prg_EXE ) = 0, Transform(This.c_FB2PRG_Version_Real), laValues(11) ) + AddProperty(_Screen, 'c_FB2PRG_EXE_Version', This.c_FB2PRG_EXE_Version) + AddProperty(_Screen, 'ExitCode', 0) - THIS.writeLog( REPLICATE( '*', 100 ) ) - THIS.writeLog( 'FoxBin2Prg INIT -', 2 ) - THIS.writeLog( REPLICATE( '*', 100 ) ) - THIS.writeLog( 'FoxBin2Prg: [' + THIS.c_Foxbin2prg_FullPath + '] (EXE Version: ' + THIS.c_FB2PRG_EXE_Version + ', FoxPro Version: ' + VERSION(4) + ')' ) - THIS.writeLog( TEXTMERGE( '- Internal CFG: <> / External CFG: <> / CodePage Used: <>)' ) ) + This.writeLog( Replicate( '*', 100 ) ) + This.writeLog( 'FoxBin2Prg INIT -', 2 ) + This.writeLog( Replicate( '*', 100 ) ) + This.writeLog( 'FoxBin2Prg: [' + This.c_Foxbin2prg_FullPath + '] (EXE Version: ' + This.c_FB2PRG_EXE_Version + ', FoxPro Version: ' + Version(4) + ')' ) + This.writeLog( Textmerge( '- Internal CFG: <> / External CFG: <> / CodePage Used: <>)' ) ) - * Get default language info - * ISO 639-2 Language Codes: https://www.loc.gov/standards/iso639-2/php/code_list.php - lcLang = THIS.getLocaleInfo(0x00000067) && ie: spa +* Get default language info +* ISO 639-2 Language Codes: https://www.loc.gov/standards/iso639-2/php/code_list.php + lcLang = This.getLocaleInfo(0x00000067) && ie: spa - DO CASE - CASE lcLang = 'spa' - lcLang = 'ES' - CASE INLIST(lcLang, 'den', 'deu', 'ger', 'gmh', 'goh', 'gsw', 'nds') - lcLang = 'DE' - CASE INLIST(lcLang, 'cpf', 'fra', 'fre', 'frm', 'fro') - lcLang = 'FR' - OTHERWISE && Default: EN - lcLang = 'EN' - ENDCASE + Do Case + Case lcLang = 'spa' + lcLang = 'ES' + Case Inlist(lcLang, 'den', 'deu', 'ger', 'gmh', 'goh', 'gsw', 'nds') + lcLang = 'DE' + Case Inlist(lcLang, 'cpf', 'fra', 'fre', 'frm', 'fro') + lcLang = 'FR' + Otherwise && Default: EN + lcLang = 'EN' + Endcase - THIS.changeLanguage(lcLang) + This.changeLanguage(lcLang) - THIS.o_FSO = CREATEOBJECT("Scripting.FileSystemObject") - *THIS.o_WSH = CREATEOBJECT("WScript.Shell") - THIS.o_Configuration = CREATEOBJECT("COLLECTION") - THIS.evaluateConfiguration() - RELEASE lcSys16, lnPosProg, lc_Foxbin2prg_EXE, laValues - RETURN - ENDPROC + This.o_FSO = Createobject("Scripting.FileSystemObject") +*THIS.o_WSH = CREATEOBJECT("WScript.Shell") + This.o_Configuration = Createobject("COLLECTION") + This.evaluateConfiguration() + Release lcSys16, lnPosProg, lc_Foxbin2prg_EXE, laValues + Return + Endproc - PROCEDURE DESTROY - TRY - LOCAL lcFileCDX - lcFileCDX = FORCEPATH( "TABLABIN.CDX", JUSTPATH(THIS.c_InputFile) ) + Procedure Destroy + Try + Local lcFileCDX + lcFileCDX = Forcepath( "TABLABIN.CDX", Justpath(This.c_InputFile) ) - ERASE ( lcFileCDX ) + Erase ( lcFileCDX ) - THIS.writeLog( 'FoxBin2Prg UNLOAD -', 2 ) - THIS.writeLog( REPLICATE( '*', 100 ) ) - THIS.writeLog( ) - THIS.writeLog_Flush() - THIS.unloadProgressbarForm() - THIS.o_Configuration = NULL - THIS.o_WSH = NULL - THIS.o_FSO = NULL - IF VARTYPE(_SCREEN.o_FoxBin2Prg_Lang) = "O" THEN - _SCREEN.o_FoxBin2Prg_Lang = NULL - ENDIF - CATCH + This.writeLog( 'FoxBin2Prg UNLOAD -', 2 ) + This.writeLog( Replicate( '*', 100 ) ) + This.writeLog( ) + This.writeLog_Flush() + This.unloadProgressbarForm() + This.o_Configuration = Null + This.o_WSH = Null + This.o_FSO = Null + If Vartype(_Screen.o_FoxBin2Prg_Lang) = "O" Then + _Screen.o_FoxBin2Prg_Lang = Null + Endif + Catch - FINALLY - 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 + Finally + 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 - ENDPROC + Return + Endproc - PROCEDURE addProcessedFile - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFile (v? IN ) Path del archivo (ej: 'C:\DESA\pruebas varias\lib.vcx') - * tcInOutType (v? IN ) Archivo de entrada o de salida ("I"=Input file, "O"=Output file) - * tcProcessed (v? IN ) Procesado ("P0"=Not Processed, "P1"=Processed) - * tcHasErrors (v? IN ) Tuvo Errores ("E0"=No Errors, "E1"=Has Errors) - * tcSupported (v? IN ) Archivo soportado ("S0"=Unsupported, "S1"=Supported) - * tcExpanded (v? IN ) Tipo de archivo ("X0"=Normal file, "X1"=Expanded multipart file) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded + Procedure addProcessedFile +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFile (v? IN ) Path del archivo (ej: 'C:\DESA\pruebas varias\lib.vcx') +* tcInOutType (v? IN ) Archivo de entrada o de salida ("I"=Input file, "O"=Output file) +* tcProcessed (v? IN ) Procesado ("P0"=Not Processed, "P1"=Processed) +* tcHasErrors (v? IN ) Tuvo Errores ("E0"=No Errors, "E1"=Has Errors) +* tcSupported (v? IN ) Archivo soportado ("S0"=Unsupported, "S1"=Supported) +* tcExpanded (v? IN ) Tipo de archivo ("X0"=Normal file, "X1"=Expanded multipart file) +*--------------------------------------------------------------------------------------------------- + Lparameters tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded - LOCAL llAdded + Local llAdded - IF NOT EMPTY(tcFile) THEN - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - *-- Buscar si fue procesado antes - IF NOT .wasProcessed(tcFile) THEN + If Not Empty(tcFile) Then + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' +*-- Buscar si fue procesado antes + If Not .wasProcessed(tcFile) Then .n_ProcessedFiles = .n_ProcessedFiles + 1 - DIMENSION .a_ProcessedFiles(.n_ProcessedFiles, 6) + Dimension .a_ProcessedFiles(.n_ProcessedFiles, 6) .a_ProcessedFiles(.n_ProcessedFiles, 1) = tcFile - .a_ProcessedFiles(.n_ProcessedFiles, 2) = EVL(tcInOutType, '') - .a_ProcessedFiles(.n_ProcessedFiles, 3) = EVL(tcProcessed, '') - .a_ProcessedFiles(.n_ProcessedFiles, 4) = EVL(tcHasErrors, '') - .a_ProcessedFiles(.n_ProcessedFiles, 5) = EVL(tcSupported, '') - .a_ProcessedFiles(.n_ProcessedFiles, 6) = EVL(tcExpanded, '') + .a_ProcessedFiles(.n_ProcessedFiles, 2) = Evl(tcInOutType, '') + .a_ProcessedFiles(.n_ProcessedFiles, 3) = Evl(tcProcessed, '') + .a_ProcessedFiles(.n_ProcessedFiles, 4) = Evl(tcHasErrors, '') + .a_ProcessedFiles(.n_ProcessedFiles, 5) = Evl(tcSupported, '') + .a_ProcessedFiles(.n_ProcessedFiles, 6) = Evl(tcExpanded, '') llAdded = .T. - ENDIF - ENDWITH - ENDIF + Endif + Endwith + Endif - RETURN llAdded - ENDPROC + Return llAdded + Endproc - PROCEDURE wasProcessed - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFileMask (v! IN ) Fullpath del archivo del que se desea saber si se procesó - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcFile, tnID + Procedure wasProcessed +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFileMask (v! IN ) Fullpath del archivo del que se desea saber si se procesó +*--------------------------------------------------------------------------------------------------- + Lparameters tcFile, tnID tnID = 0 - IF THIS.n_ProcessedFiles = 0 - RETURN .F. - ENDIF + If This.n_ProcessedFiles = 0 + Return .F. + Endif - tnID = ASCAN( THIS.a_ProcessedFiles, tcFile, 1, 0, 1, 1+2+4 ) + tnID = Ascan( This.a_ProcessedFiles, tcFile, 1, 0, 1, 1+2+4 ) - RETURN (tnID > 0) - ENDPROC + Return (tnID > 0) + Endproc - PROCEDURE updateProgressbar - LPARAMETERS tcTexto, tnValor, tnTotal, tnTipo + Procedure updateProgressbar + Lparameters tcTexto, tnValor, tnTotal, tnTipo - 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 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 - ENDIF - .o_Frm_Avance.updateProgressbar( tcTexto, tnValor, tnTotal, tnTipo ) - ENDIF - ENDWITH + 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 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 + Endif + .o_Frm_Avance.updateProgressbar( tcTexto, tnValor, tnTotal, tnTipo ) + Endif + Endwith - CATCH - THROW - ENDTRY - ENDPROC + Catch + Throw + Endtry + Endproc - PROCEDURE changeLanguage - LPARAMETERS tcLanguageId - _SCREEN.AddProperty( "o_FoxBin2Prg_Lang", CREATEOBJECT("CL_LANG", tcLanguageId) ) - *-- Localized properties - THIS.c_Language = _SCREEN.o_FoxBin2Prg_Lang.C_LANGUAGE_LOC - THIS.c_loc_processing_file = _SCREEN.o_FoxBin2Prg_Lang.C_PROCESSING_LOC - THIS.c_loc_process_progress = _SCREEN.o_FoxBin2Prg_Lang.C_PROCESS_PROGRESS_LOC - ENDPROC + Procedure changeLanguage + Lparameters tcLanguageId + _Screen.AddProperty( "o_FoxBin2Prg_Lang", Createobject("CL_LANG", tcLanguageId) ) +*-- Localized properties + This.c_Language = _Screen.o_FoxBin2Prg_Lang.C_LANGUAGE_LOC + This.c_loc_processing_file = _Screen.o_FoxBin2Prg_Lang.C_PROCESSING_LOC + This.c_loc_process_progress = _Screen.o_FoxBin2Prg_Lang.C_PROCESS_PROGRESS_LOC + Endproc - PROCEDURE clearProcessedFiles - *-- Limpia las estadísticas de archivos procesados que se usan para optimizar - *-- el procesamiento y evitar el reproceso de los mismos archivos, por ejemplo, - *-- de un mismo VCX compartido por 2 ó más proyectos. - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + Procedure clearProcessedFiles +*-- Limpia las estadísticas de archivos procesados que se usan para optimizar +*-- el procesamiento y evitar el reproceso de los mismos archivos, por ejemplo, +*-- de un mismo VCX compartido por 2 ó más proyectos. + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' .n_ProcessedFilesCount = 0 .n_ProcessedFiles = 0 - DIMENSION .a_ProcessedFiles(1, 6) + Dimension .a_ProcessedFiles(1, 6) .a_ProcessedFiles = '' - *-- Los errores previos también se limpian. +*-- Los errores previos también se limpian. .l_Error = .F. .l_Errors = .F. - ENDWITH - ENDPROC + Endwith + Endproc - PROCEDURE declareDLL - *-- Funciones para escribir en StdOut - 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 - *-- - ENDPROC + Procedure declareDLL +*-- Funciones para escribir en StdOut + 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 +*-- + Endproc - PROCEDURE get_AbsolutePath - LPARAMETERS tc_InputFile, tc_FullPath + Procedure get_AbsolutePath + Lparameters tc_InputFile, tc_FullPath - *-- Ajusto la ruta si no es absoluta - tc_InputFile = EVL(tc_InputFile,'') - tc_FullPath = EVL(tc_FullPath, THIS.c_Foxbin2prg_FullPath) +*-- Ajusto la ruta si no es absoluta + tc_InputFile = Evl(tc_InputFile,'') + tc_FullPath = Evl(tc_FullPath, This.c_Foxbin2prg_FullPath) - IF NOT EMPTY( JUSTEXT(tc_FullPath) ) THEN - *-- Se indicó PATH+archivo.ext - tc_FullPath = JUSTPATH(tc_FullPath) - ENDIF + If Not Empty( Justext(tc_FullPath) ) Then +*-- Se indicó PATH+archivo.ext + tc_FullPath = Justpath(tc_FullPath) + Endif - tc_FullPath = ADDBS( tc_FullPath ) + tc_FullPath = Addbs( tc_FullPath ) - IF LEN(tc_InputFile) > 1 ; - AND LEFT(LTRIM(tc_InputFile),2) <> '\\' ; - AND SUBSTR(LTRIM(tc_InputFile),2,1) <> ':' THEN - tc_InputFile = FULLPATH(tc_InputFile, tc_FullPath) - ENDIF + If Len(tc_InputFile) > 1 ; + AND Left(Ltrim(tc_InputFile),2) <> '\\' ; + AND Substr(Ltrim(tc_InputFile),2,1) <> ':' Then + tc_InputFile = Fullpath(tc_InputFile, tc_FullPath) + Endif - RETURN tc_InputFile - ENDPROC + Return tc_InputFile + Endproc - FUNCTION get_l_ConfigEvaluated - RETURN THIS.l_Main_CFG_Loaded - ENDFUNC + Function get_l_ConfigEvaluated + Return This.l_Main_CFG_Loaded + Endfunc - FUNCTION get_l_CFG_CachedAccess - RETURN THIS.l_CFG_CachedAccess - ENDFUNC + Function get_l_CFG_CachedAccess + Return This.l_CFG_CachedAccess + Endfunc - FUNCTION get_Processed - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taProcessed (@! OUT) Array donde se devolverá la información de los archivos de la máscara indicada - * tcFileMask (v? IN ) Máscara de archivo a buscar (nombre, "*", "?") - *--------------------------------------------------------------------------------------------------- - * ESTRUCTURA DEL ARRAY DEVUELTO: - * col(1) tcFile - Path del archivo (ej: 'C:\DESA\pruebas varias\lib.vcx') - * col(2) tcInOutType - Archivo de entrada o de salida ("I"=Input file, "O"=Output file) - * col(3) tcProcessed - Procesado ("P0"=Not Processed, "P1"=Processed) - * col(4) tcHasErrors - Tuvo Errores ("E0"=No Errors, "E1"=Has Errors) - * col(5) tcSupported - Archivo soportado ("S0"=Unsupported, "S1"=Supported) - * col(6) tcExpanded - Tipo de archivo ("X0"=Normal file, "X1"=Expanded multipart file) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS taProcessed, tcFileMask + Function get_Processed +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taProcessed (@! OUT) Array donde se devolverá la información de los archivos de la máscara indicada +* tcFileMask (v? IN ) Máscara de archivo a buscar (nombre, "*", "?") +*--------------------------------------------------------------------------------------------------- +* ESTRUCTURA DEL ARRAY DEVUELTO: +* col(1) tcFile - Path del archivo (ej: 'C:\DESA\pruebas varias\lib.vcx') +* col(2) tcInOutType - Archivo de entrada o de salida ("I"=Input file, "O"=Output file) +* col(3) tcProcessed - Procesado ("P0"=Not Processed, "P1"=Processed) +* col(4) tcHasErrors - Tuvo Errores ("E0"=No Errors, "E1"=Has Errors) +* col(5) tcSupported - Archivo soportado ("S0"=Unsupported, "S1"=Supported) +* col(6) tcExpanded - Tipo de archivo ("X0"=Normal file, "X1"=Expanded multipart file) +*--------------------------------------------------------------------------------------------------- + Lparameters taProcessed, tcFileMask - EXTERNAL ARRAY taProcessed + External Array taProcessed - LOCAL lnCount, I + Local lnCount, I lnCount = 0 - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - tcFileMask = EVL(tcFileMask, '*') + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + tcFileMask = Evl(tcFileMask, '*') - FOR I = 1 TO .n_ProcessedFiles - IF LIKE( tcFileMask, JUSTFNAME(.a_ProcessedFiles(m.I,1)) ) THEN + For I = 1 To .n_ProcessedFiles + If Like( tcFileMask, Justfname(.a_ProcessedFiles(m.I,1)) ) Then lnCount = lnCount + 1 - DIMENSION taProcessed(lnCount,6) + Dimension taProcessed(lnCount,6) taProcessed(lnCount,1) = .a_ProcessedFiles(m.I,1) taProcessed(lnCount,2) = .a_ProcessedFiles(m.I,2) taProcessed(lnCount,3) = .a_ProcessedFiles(m.I,3) taProcessed(lnCount,4) = .a_ProcessedFiles(m.I,4) taProcessed(lnCount,5) = .a_ProcessedFiles(m.I,5) taProcessed(lnCount,6) = .a_ProcessedFiles(m.I,6) - ENDIF - ENDFOR - ENDWITH - - RETURN lnCount - ENDFUNC - - - PROCEDURE n_Debug_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_Debug - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_Debug, THIS.n_Debug ) - ENDIF - ENDPROC - - - PROCEDURE n_BodyDevInfo_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_BodyDevInfo - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_BodyDevInfo, THIS.n_BodyDevInfo ) - ENDIF - ENDPROC - - - PROCEDURE l_ShowErrors_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_ShowErrors - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_ShowErrors, THIS.l_ShowErrors ) - ENDIF - ENDPROC - - - PROCEDURE n_ShowProgressbar_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_ShowProgressbar - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_ShowProgressbar, THIS.n_ShowProgressbar ) - ENDIF - ENDPROC - - - PROCEDURE l_NoTimestamps_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_NoTimestamps - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_NoTimestamps, THIS.l_NoTimestamps ) - ENDIF - ENDPROC - - - PROCEDURE n_UseClassPerFile_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_UseClassPerFile - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_UseClassPerFile, THIS.n_UseClassPerFile ) - ENDIF - ENDPROC - - - PROCEDURE l_RedirectClassPerFileToMain_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_RedirectClassPerFileToMain - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_RedirectClassPerFileToMain, THIS.l_RedirectClassPerFileToMain ) - ENDIF - ENDPROC - - - PROCEDURE n_RedirectClassType_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_RedirectClassType - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_RedirectClassType, THIS.n_RedirectClassType ) - ENDIF - ENDPROC - - - PROCEDURE l_RemoveNullCharsFromCode_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_RemoveNullCharsFromCode - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_RemoveNullCharsFromCode, THIS.l_RemoveNullCharsFromCode ) - ENDIF - ENDPROC - - - PROCEDURE l_RemoveZOrderSetFromProps_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_RemoveZOrderSetFromProps - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_RemoveZOrderSetFromProps, THIS.l_RemoveZOrderSetFromProps ) - ENDIF - ENDPROC - - - PROCEDURE l_ClassPerFileCheck_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_ClassPerFileCheck - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_ClassPerFileCheck, THIS.l_ClassPerFileCheck ) - ENDIF - ENDPROC - - - PROCEDURE l_ClearUniqueID_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_ClearUniqueID - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_ClearUniqueID, THIS.l_ClearUniqueID ) - ENDIF - ENDPROC - - - PROCEDURE l_ClearDBFLastUpdate_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_ClearDBFLastUpdate - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_ClearDBFLastUpdate, THIS.l_ClearDBFLastUpdate ) - ENDIF - ENDPROC - - - PROCEDURE n_OptimizeByFilestamp_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_OptimizeByFilestamp - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_OptimizeByFilestamp, THIS.n_OptimizeByFilestamp ) - ENDIF - ENDPROC - - - PROCEDURE n_ExtraBackupLevels_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_ExtraBackupLevels - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_ExtraBackupLevels, THIS.n_ExtraBackupLevels ) - ENDIF - ENDPROC - - - PROCEDURE c_VC2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_VC2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_VC2, THIS.c_VC2 ) - ENDIF - ENDPROC - - - PROCEDURE c_SC2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_SC2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_SC2, THIS.c_SC2 ) - ENDIF - ENDPROC - - - PROCEDURE c_PJ2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_PJ2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_PJ2, THIS.c_PJ2 ) - ENDIF - ENDPROC - - - PROCEDURE c_FR2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_FR2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_FR2, THIS.c_FR2 ) - ENDIF - ENDPROC - - - PROCEDURE c_LB2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_LB2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_LB2, THIS.c_LB2 ) - ENDIF - ENDPROC - - - PROCEDURE c_DB2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_DB2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_DB2, THIS.c_DB2 ) - ENDIF - ENDPROC - - - PROCEDURE c_DC2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_DC2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_DC2, THIS.c_DC2 ) - ENDIF - ENDPROC - - - PROCEDURE c_MN2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_MN2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_MN2, THIS.c_MN2 ) - ENDIF - ENDPROC - - - PROCEDURE c_FK2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_FK2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_FK2, THIS.c_FK2 ) - ENDIF - ENDPROC - - - PROCEDURE c_ME2_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_ME2 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_ME2, THIS.c_ME2 ) - ENDIF - ENDPROC - - - PROCEDURE PJX_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.PJX_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).PJX_Conversion_Support, THIS.PJX_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE VCX_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.VCX_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).VCX_Conversion_Support, THIS.VCX_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE SCX_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.SCX_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).SCX_Conversion_Support, THIS.SCX_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE FRX_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.FRX_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).FRX_Conversion_Support, THIS.FRX_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE LBX_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.LBX_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).LBX_Conversion_Support, THIS.LBX_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE MNX_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.MNX_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).MNX_Conversion_Support, THIS.MNX_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE FKY_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.FKY_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).FKY_Conversion_Support, THIS.FKY_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE MEM_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.MEM_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).MEM_Conversion_Support, THIS.MEM_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE DBF_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.DBF_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).DBF_Conversion_Support, THIS.DBF_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE DBF_Conversion_Included_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.DBF_Conversion_Included - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).DBF_Conversion_Included, THIS.DBF_Conversion_Included ) - ENDIF - ENDPROC - - - PROCEDURE DBF_Conversion_Excluded_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.DBF_Conversion_Excluded - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).DBF_Conversion_Excluded, THIS.DBF_Conversion_Excluded ) - ENDIF - ENDPROC - - - PROCEDURE DBC_Conversion_Support_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.DBC_Conversion_Support - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).DBC_Conversion_Support, THIS.DBC_Conversion_Support ) - ENDIF - ENDPROC - - - PROCEDURE c_BackgroundImage_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.c_BackgroundImage - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).c_BackgroundImage, THIS.c_BackgroundImage ) - ENDIF - ENDPROC - - - PROCEDURE n_ExcludeDBFAutoincNextval_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_ExcludeDBFAutoincNextval - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_ExcludeDBFAutoincNextval, THIS.n_ExcludeDBFAutoincNextval ) - ENDIF - ENDPROC - - - PROCEDURE n_PRG_Compat_Level_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_PRG_Compat_Level - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_PRG_Compat_Level, THIS.n_PRG_Compat_Level ) - ENDIF - ENDPROC - - - PROCEDURE changeFileAttribute - * Using Win32 Functions in Visual FoxPro - * example=103 - * Changing file attributes - LPARAMETERS tcFileName, tcAttrib - tcAttrib = UPPER(tcAttrib) - - #DEFINE FILE_ATTRIBUTE_READONLY 1 - #DEFINE FILE_ATTRIBUTE_HIDDEN 2 - #DEFINE FILE_ATTRIBUTE_SYSTEM 4 - #DEFINE FILE_ATTRIBUTE_DIRECTORY 16 - #DEFINE FILE_ATTRIBUTE_ARCHIVE 32 - #DEFINE FILE_ATTRIBUTE_NORMAL 128 - #DEFINE FILE_ATTRIBUTE_TEMPORARY 512 - #DEFINE FILE_ATTRIBUTE_COMPRESSED 2048 - - TRY - LOCAL loEx AS EXCEPTION, dwFileAttributes, dwFileAttributes_Orig, lnRet - lnRet = 0 - - * read current attributes for this file - dwFileAttributes = fb2p_GetFileAttributes(tcFileName) - dwFileAttributes_Orig = dwFileAttributes - - IF dwFileAttributes = -1 - * the file does not exist - EXIT - ENDIF - - IF dwFileAttributes > 0 - IF '+R' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_READONLY) - ENDIF - IF '+A' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_ARCHIVE) - ENDIF - IF '+S' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_SYSTEM) - ENDIF - IF '+H' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_HIDDEN) - ENDIF - IF '+D' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY) - ENDIF - IF '+N' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_NORMAL) - ENDIF - IF '+T' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_TEMPORARY) - ENDIF - IF '+C' $ tcAttrib - dwFileAttributes = BITOR(dwFileAttributes, FILE_ATTRIBUTE_COMPRESSED) - ENDIF - - IF '-R' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_READONLY - ENDIF - IF '-A' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_ARCHIVE) = FILE_ATTRIBUTE_ARCHIVE - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_ARCHIVE - ENDIF - IF '-S' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_SYSTEM) = FILE_ATTRIBUTE_SYSTEM - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_SYSTEM - ENDIF - IF '-H' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_HIDDEN) = FILE_ATTRIBUTE_HIDDEN - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_HIDDEN - ENDIF - IF '-D' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_DIRECTORY - ENDIF - IF '-N' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_NORMAL) = FILE_ATTRIBUTE_NORMAL - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_NORMAL - ENDIF - IF '-T' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_TEMPORARY) = FILE_ATTRIBUTE_TEMPORARY - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_TEMPORARY - ENDIF - IF '-C' $ tcAttrib AND BITAND(dwFileAttributes, FILE_ATTRIBUTE_COMPRESSED) = FILE_ATTRIBUTE_COMPRESSED - dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_COMPRESSED - ENDIF - - * setting selected attributes - lnRet = fb2p_SetFileAttributes(tcFileName, dwFileAttributes) - ENDIF - - CATCH TO loEx - THROW - - FINALLY - THIS.writeLog( C_TAB + LOWER(PROGRAM()) + ' >> [' + tcFileName + '] lnRet = ' + TRANSFORM(lnRet) + ', dwFileAttributes_Orig = ' + TRANSFORM(dwFileAttributes_Orig) ) - RELEASE tcFileName, tcAttrib, dwFileAttributes - ENDTRY - - RETURN lnRet - 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 ; + Endif + Endfor + Endwith + + Return lnCount + Endfunc + + + Procedure n_Debug_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_Debug + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_Debug, This.n_Debug ) + Endif + Endproc + + + Procedure n_BodyDevInfo_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_BodyDevInfo + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_BodyDevInfo, This.n_BodyDevInfo ) + Endif + Endproc + + + Procedure l_ShowErrors_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_ShowErrors + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_ShowErrors, This.l_ShowErrors ) + Endif + Endproc + + + Procedure n_ShowProgressbar_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_ShowProgressbar + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_ShowProgressbar, This.n_ShowProgressbar ) + Endif + Endproc + + + Procedure l_NoTimestamps_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_NoTimestamps + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_NoTimestamps, This.l_NoTimestamps ) + Endif + Endproc + + + Procedure n_UseClassPerFile_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_UseClassPerFile + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_UseClassPerFile, This.n_UseClassPerFile ) + Endif + Endproc + + + Procedure l_RedirectClassPerFileToMain_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_RedirectClassPerFileToMain + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_RedirectClassPerFileToMain, This.l_RedirectClassPerFileToMain ) + Endif + Endproc + + + Procedure n_RedirectClassType_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_RedirectClassType + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_RedirectClassType, This.n_RedirectClassType ) + Endif + Endproc + + + Procedure l_RemoveNullCharsFromCode_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_RemoveNullCharsFromCode + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_RemoveNullCharsFromCode, This.l_RemoveNullCharsFromCode ) + Endif + Endproc + + + Procedure l_RemoveZOrderSetFromProps_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_RemoveZOrderSetFromProps + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_RemoveZOrderSetFromProps, This.l_RemoveZOrderSetFromProps ) + Endif + Endproc + + + Procedure l_ClassPerFileCheck_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_ClassPerFileCheck + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_ClassPerFileCheck, This.l_ClassPerFileCheck ) + Endif + Endproc + + + Procedure l_ClearUniqueID_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_ClearUniqueID + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_ClearUniqueID, This.l_ClearUniqueID ) + Endif + Endproc + + + Procedure l_ClearDBFLastUpdate_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_ClearDBFLastUpdate + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_ClearDBFLastUpdate, This.l_ClearDBFLastUpdate ) + Endif + Endproc + + + Procedure n_OptimizeByFilestamp_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_OptimizeByFilestamp + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_OptimizeByFilestamp, This.n_OptimizeByFilestamp ) + Endif + Endproc + + + Procedure n_ExtraBackupLevels_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_ExtraBackupLevels + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_ExtraBackupLevels, This.n_ExtraBackupLevels ) + Endif + Endproc + + + Procedure c_VC2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_VC2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_VC2, This.c_VC2 ) + Endif + Endproc + + + Procedure c_SC2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_SC2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_SC2, This.c_SC2 ) + Endif + Endproc + + + Procedure c_PJ2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_PJ2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_PJ2, This.c_PJ2 ) + Endif + Endproc + + + Procedure c_FR2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_FR2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_FR2, This.c_FR2 ) + Endif + Endproc + + + Procedure c_LB2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_LB2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_LB2, This.c_LB2 ) + Endif + Endproc + + + Procedure c_DB2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_DB2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_DB2, This.c_DB2 ) + Endif + Endproc + + + Procedure c_DC2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_DC2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_DC2, This.c_DC2 ) + Endif + Endproc + + + Procedure c_MN2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_MN2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_MN2, This.c_MN2 ) + Endif + Endproc + + + Procedure c_FK2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_FK2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_FK2, This.c_FK2 ) + Endif + Endproc + + + Procedure c_ME2_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_ME2 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_ME2, This.c_ME2 ) + Endif + Endproc + + + Procedure PJX_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.PJX_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).PJX_Conversion_Support, This.PJX_Conversion_Support ) + Endif + Endproc + + + Procedure VCX_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.VCX_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).VCX_Conversion_Support, This.VCX_Conversion_Support ) + Endif + Endproc + + + Procedure SCX_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.SCX_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).SCX_Conversion_Support, This.SCX_Conversion_Support ) + Endif + Endproc + + + Procedure FRX_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.FRX_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).FRX_Conversion_Support, This.FRX_Conversion_Support ) + Endif + Endproc + + + Procedure LBX_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.LBX_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).LBX_Conversion_Support, This.LBX_Conversion_Support ) + Endif + Endproc + + + Procedure MNX_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.MNX_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).MNX_Conversion_Support, This.MNX_Conversion_Support ) + Endif + Endproc + + + Procedure FKY_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.FKY_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).FKY_Conversion_Support, This.FKY_Conversion_Support ) + Endif + Endproc + + + Procedure MEM_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.MEM_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).MEM_Conversion_Support, This.MEM_Conversion_Support ) + Endif + Endproc + + + Procedure DBF_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.DBF_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).DBF_Conversion_Support, This.DBF_Conversion_Support ) + Endif + Endproc + + + Procedure DBF_Conversion_Included_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.DBF_Conversion_Included + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).DBF_Conversion_Included, This.DBF_Conversion_Included ) + Endif + Endproc + + + Procedure DBF_Conversion_Excluded_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.DBF_Conversion_Excluded + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).DBF_Conversion_Excluded, This.DBF_Conversion_Excluded ) + Endif + Endproc + + + Procedure DBC_Conversion_Support_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.DBC_Conversion_Support + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).DBC_Conversion_Support, This.DBC_Conversion_Support ) + Endif + Endproc + + + Procedure c_BackgroundImage_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.c_BackgroundImage + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).c_BackgroundImage, This.c_BackgroundImage ) + Endif + Endproc + + + Procedure n_ExcludeDBFAutoincNextval_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_ExcludeDBFAutoincNextval + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_ExcludeDBFAutoincNextval, This.n_ExcludeDBFAutoincNextval ) + Endif + Endproc + + + Procedure n_PRG_Compat_Level_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_PRG_Compat_Level + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_PRG_Compat_Level, This.n_PRG_Compat_Level ) + Endif + Endproc + + + Procedure changeFileAttribute +* Using Win32 Functions in Visual FoxPro +* example=103 +* Changing file attributes + Lparameters tcFileName, tcAttrib + tcAttrib = Upper(tcAttrib) + + #Define FILE_ATTRIBUTE_READONLY 1 + #Define FILE_ATTRIBUTE_HIDDEN 2 + #Define FILE_ATTRIBUTE_SYSTEM 4 + #Define FILE_ATTRIBUTE_DIRECTORY 16 + #Define FILE_ATTRIBUTE_ARCHIVE 32 + #Define FILE_ATTRIBUTE_NORMAL 128 + #Define FILE_ATTRIBUTE_TEMPORARY 512 + #Define FILE_ATTRIBUTE_COMPRESSED 2048 + + Try + Local loEx As Exception, dwFileAttributes, dwFileAttributes_Orig, lnRet + lnRet = 0 + +* read current attributes for this file + dwFileAttributes = fb2p_GetFileAttributes(tcFileName) + dwFileAttributes_Orig = dwFileAttributes + + If dwFileAttributes = -1 +* the file does not exist + Exit + Endif + + If dwFileAttributes > 0 + If '+R' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_READONLY) + Endif + If '+A' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_ARCHIVE) + Endif + If '+S' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_SYSTEM) + Endif + If '+H' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_HIDDEN) + Endif + If '+D' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY) + Endif + If '+N' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_NORMAL) + Endif + If '+T' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_TEMPORARY) + Endif + If '+C' $ tcAttrib + dwFileAttributes = Bitor(dwFileAttributes, FILE_ATTRIBUTE_COMPRESSED) + Endif + + If '-R' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_READONLY + Endif + If '-A' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_ARCHIVE) = FILE_ATTRIBUTE_ARCHIVE + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_ARCHIVE + Endif + If '-S' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_SYSTEM) = FILE_ATTRIBUTE_SYSTEM + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_SYSTEM + Endif + If '-H' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_HIDDEN) = FILE_ATTRIBUTE_HIDDEN + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_HIDDEN + Endif + If '-D' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_DIRECTORY + Endif + If '-N' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_NORMAL) = FILE_ATTRIBUTE_NORMAL + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_NORMAL + Endif + If '-T' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_TEMPORARY) = FILE_ATTRIBUTE_TEMPORARY + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_TEMPORARY + Endif + If '-C' $ tcAttrib And Bitand(dwFileAttributes, FILE_ATTRIBUTE_COMPRESSED) = FILE_ATTRIBUTE_COMPRESSED + dwFileAttributes = dwFileAttributes - FILE_ATTRIBUTE_COMPRESSED + Endif + +* setting selected attributes + lnRet = fb2p_SetFileAttributes(tcFileName, dwFileAttributes) + Endif + + Catch To loEx + Throw + + Finally + This.writeLog( C_TAB + Lower(Program()) + ' >> [' + tcFileName + '] lnRet = ' + Transform(lnRet) + ', dwFileAttributes_Orig = ' + Transform(dwFileAttributes_Orig) ) + Release tcFileName, tcAttrib, dwFileAttributes + Endtry + + Return lnRet + 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() + Try + m.nPar = Pcount() - IF m.nPar < 1 - EXIT - ENDIF + 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 + 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 + 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)) + 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) + 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) ) + 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) + 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 + 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) + m.fh = fb2p_lopen (m.tcFileName, OF_READWRITE) - IF m.fh < 0 - EXIT - ENDIF + If m.fh < 0 + Exit + Endif - fb2p_SetFileTime (m.fh,m.cCreation, m.cLastAccess, m.cLastWrite) - fb2p_lclose(m.fh) - llRetorno = .T. - ENDTRY + fb2p_SetFileTime (m.fh,m.cCreation, m.cLastAccess, m.cLastWrite) + fb2p_lclose(m.fh) + llRetorno = .T. + Endtry - RETURN llRetorno - ENDPROC + Return llRetorno + Endproc - PROCEDURE compileFoxProBinary - LPARAMETERS tcFileName - LOCAL lcType - tcFileName = EVL(tcFileName, THIS.c_OutputFile) - lcType = UPPER(JUSTEXT(tcFileName)) + Procedure compileFoxProBinary + Lparameters tcFileName + Local lcType + tcFileName = Evl(tcFileName, This.c_OutputFile) + lcType = Upper(Justext(tcFileName)) - DO CASE - CASE lcType = 'VCX' - COMPILE CLASSLIB (tcFileName) + Do Case + Case lcType = 'VCX' + Compile Classlib (tcFileName) - CASE lcType = 'SCX' - COMPILE FORM (tcFileName) + Case lcType = 'SCX' + Compile Form (tcFileName) - CASE lcType = 'FRX' - COMPILE REPORT (tcFileName) + Case lcType = 'FRX' + Compile Report (tcFileName) - CASE lcType = 'LBX' - COMPILE LABEL (tcFileName) + Case lcType = 'LBX' + Compile Label (tcFileName) - CASE lcType = 'DBC' - COMPILE DATABASE (tcFileName) + Case lcType = 'DBC' + Compile Database (tcFileName) - ENDCASE + Endcase - RELEASE tcFileName, lcType - RETURN - ENDPROC + Release tcFileName, lcType + Return + Endproc - PROCEDURE doBackup - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toEx (@? IN ) Objeto Exception con información del error - * tlRelanzarError (v? IN ) Indica si se debe relanzar el error - * tcBakFile_1 (@? OUT) Nombre del archivo backup 1 (vcx,scx,pjx,frx,lbx,dbf,dbc,mnx,vc2,sc2,pj2,etc) - * tcBakFile_2 (@? OUT) Nombre del archivo backup 2 (vct,sct,pjt,frt,lbt,fpt,dct,mnt,etc) - * tcBakFile_3 (@? OUT) Nombre del archivo backup 3 (cdx,dcx,etc) - * tcOutputFile (v? IN ) Nombre del archivo de salida. Si no se indica se asume .c_OutputFile - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3, tcOutputFile + Procedure doBackup +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toEx (@? IN ) Objeto Exception con información del error +* tlRelanzarError (v? IN ) Indica si se debe relanzar el error +* tcBakFile_1 (@? OUT) Nombre del archivo backup 1 (vcx,scx,pjx,frx,lbx,dbf,dbc,mnx,vc2,sc2,pj2,etc) +* tcBakFile_2 (@? OUT) Nombre del archivo backup 2 (vct,sct,pjt,frt,lbt,fpt,dct,mnt,etc) +* tcBakFile_3 (@? OUT) Nombre del archivo backup 3 (cdx,dcx,etc) +* tcOutputFile (v? IN ) Nombre del archivo de salida. Si no se indica se asume .c_OutputFile +*--------------------------------------------------------------------------------------------------- + Lparameters toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3, tcOutputFile - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lcNext_Bak, lcExt_1, lcExt_2, lcExt_3, tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3, laDir(1,5) ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - STORE '' TO tcBakFile_1, tcBakFile_2, tcBakFile_3, lcExt_1, lcExt_2, lcExt_3 ; - , tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3 + Try + Local lcNext_Bak, lcExt_1, lcExt_2, lcExt_3, tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3, laDir(1,5) ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + Store '' To tcBakFile_1, tcBakFile_2, tcBakFile_3, lcExt_1, lcExt_2, lcExt_3 ; + , tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3 - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF .n_ExtraBackupLevels > 0 THEN - loLang = _SCREEN.o_FoxBin2Prg_Lang - tcOutputFile = EVL( tcOutputFile, .c_OutputFile ) - lcNext_Bak = .getNext_BAK( tcOutputFile ) - lcExt_1 = JUSTEXT( tcOutputFile ) - tcBakFile_1 = FORCEEXT(tcOutputFile, lcExt_1 + lcNext_Bak) + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If .n_ExtraBackupLevels > 0 Then + loLang = _Screen.o_FoxBin2Prg_Lang + tcOutputFile = Evl( tcOutputFile, .c_OutputFile ) + lcNext_Bak = .getNext_BAK( tcOutputFile ) + lcExt_1 = Justext( tcOutputFile ) + tcBakFile_1 = Forceext(tcOutputFile, lcExt_1 + lcNext_Bak) - DO CASE - CASE INLIST( lcExt_1, .c_PJ2, .c_VC2, .c_SC2, .c_FR2, .c_LB2, .c_DB2, .c_DC2, .c_MN2, .c_FK2, .c_ME2, 'PJM' ) - *-- Extensiones TEXTO + Do Case + Case Inlist( lcExt_1, .c_PJ2, .c_VC2, .c_SC2, .c_FR2, .c_LB2, .c_DB2, .c_DC2, .c_MN2, .c_FK2, .c_ME2, 'PJM' ) +*-- Extensiones TEXTO - CASE lcExt_1 = 'DBF' - *-- DBF - lcExt_2 = 'FPT' - lcExt_3 = 'CDX' - tcBakFile_2 = FORCEEXT(tcOutputFile, lcExt_2 + lcNext_Bak) - tcBakFile_3 = FORCEEXT(tcOutputFile, lcExt_3 + lcNext_Bak) + Case lcExt_1 = 'DBF' +*-- DBF + lcExt_2 = 'FPT' + lcExt_3 = 'CDX' + tcBakFile_2 = Forceext(tcOutputFile, lcExt_2 + lcNext_Bak) + tcBakFile_3 = Forceext(tcOutputFile, lcExt_3 + lcNext_Bak) - CASE lcExt_1 = 'DBC' - *-- DBC - lcExt_2 = 'DCT' - lcExt_3 = 'DCX' - tcBakFile_2 = FORCEEXT(tcOutputFile, lcExt_2 + lcNext_Bak) - tcBakFile_3 = FORCEEXT(tcOutputFile, lcExt_3 + lcNext_Bak) + Case lcExt_1 = 'DBC' +*-- DBC + lcExt_2 = 'DCT' + lcExt_3 = 'DCX' + tcBakFile_2 = Forceext(tcOutputFile, lcExt_2 + lcNext_Bak) + tcBakFile_3 = Forceext(tcOutputFile, lcExt_3 + lcNext_Bak) - CASE INLIST( lcExt_1, 'PJX', 'VCX', 'SCX', 'FRX', 'LBX', 'MNX' ) - *-- PJX, VCX, SCX, FRX, LBX, MNX - lcExt_2 = LEFT(lcExt_1,2) + 'T' - tcBakFile_2 = FORCEEXT(tcOutputFile, lcExt_2 + lcNext_Bak) + Case Inlist( lcExt_1, 'PJX', 'VCX', 'SCX', 'FRX', 'LBX', 'MNX' ) +*-- PJX, VCX, SCX, FRX, LBX, MNX + lcExt_2 = Left(lcExt_1,2) + 'T' + tcBakFile_2 = Forceext(tcOutputFile, lcExt_2 + lcNext_Bak) - OTHERWISE - *-- PKY, MEM + Otherwise +*-- PKY, MEM - ENDCASE + Endcase - IF NOT EMPTY(lcExt_1) - tcOutputFile_Ext1 = FORCEEXT(tcOutputFile, lcExt_1) + If Not Empty(lcExt_1) + tcOutputFile_Ext1 = Forceext(tcOutputFile, lcExt_1) - IF ADIR( laDir, tcOutputFile_Ext1 ) > 0 THEN - *-- LOG - DO CASE - CASE EMPTY(lcExt_2) - .writeLog( C_TAB + loLang.C_BACKUP_OF_LOC + tcOutputFile_Ext1 ) - CASE EMPTY(lcExt_3) - .writeLog( C_TAB + loLang.C_BACKUP_OF_LOC + tcOutputFile_Ext1 + '/' + lcExt_2 ) - OTHERWISE - .writeLog( C_TAB + loLang.C_BACKUP_OF_LOC + tcOutputFile_Ext1 + '/' + lcExt_2 + '/' + lcExt_3 ) - ENDCASE + If Adir( laDir, tcOutputFile_Ext1 ) > 0 Then +*-- LOG + Do Case + Case Empty(lcExt_2) + .writeLog( C_TAB + loLang.C_BACKUP_OF_LOC + tcOutputFile_Ext1 ) + Case Empty(lcExt_3) + .writeLog( C_TAB + loLang.C_BACKUP_OF_LOC + tcOutputFile_Ext1 + '/' + lcExt_2 ) + Otherwise + .writeLog( C_TAB + loLang.C_BACKUP_OF_LOC + tcOutputFile_Ext1 + '/' + lcExt_2 + '/' + lcExt_3 ) + Endcase - *-- COPIA BACKUP - COPY FILE ( tcOutputFile_Ext1 ) TO ( tcBakFile_1 ) +*-- COPIA BACKUP + Copy File ( tcOutputFile_Ext1 ) To ( tcBakFile_1 ) - IF NOT EMPTY(lcExt_2) - tcOutputFile_Ext2 = FORCEEXT(tcOutputFile, lcExt_2) + If Not Empty(lcExt_2) + tcOutputFile_Ext2 = Forceext(tcOutputFile, lcExt_2) - IF ADIR( laDir, tcOutputFile_Ext2 ) > 0 THEN - COPY FILE ( tcOutputFile_Ext2 ) TO ( tcBakFile_2 ) - ENDIF - ENDIF + If Adir( laDir, tcOutputFile_Ext2 ) > 0 Then + Copy File ( tcOutputFile_Ext2 ) To ( tcBakFile_2 ) + Endif + Endif - IF NOT EMPTY(lcExt_3) - tcOutputFile_Ext3 = FORCEEXT(tcOutputFile, lcExt_3) + If Not Empty(lcExt_3) + tcOutputFile_Ext3 = Forceext(tcOutputFile, lcExt_3) - IF ADIR( laDir, tcOutputFile_Ext3 ) > 0 THEN - COPY FILE ( tcOutputFile_Ext3 ) TO ( tcBakFile_3 ) - ENDIF - ENDIF - ENDIF - ENDIF - ENDIF - ENDWITH && THIS + If Adir( laDir, tcOutputFile_Ext3 ) > 0 Then + Copy File ( tcOutputFile_Ext3 ) To ( tcBakFile_3 ) + Endif + Endif + Endif + Endif + Endif + Endwith && THIS - CATCH TO toEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To toEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - IF tlRelanzarError - THROW - ENDIF + If tlRelanzarError + Throw + Endif - FINALLY - RELEASE toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3 ; - , lcNext_Bak, lcExt_1, lcExt_2, lcExt_3, tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3 ; - , tcOutputFile - ENDTRY + Finally + Release toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3 ; + , lcNext_Bak, lcExt_1, lcExt_2, lcExt_3, tcOutputFile_Ext1, tcOutputFile_Ext2, tcOutputFile_Ext3 ; + , tcOutputFile + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE loadProgressbarForm - IF VARTYPE(THIS.o_Frm_Avance) <> "O" THEN - THIS.o_Frm_Avance = CREATEOBJECT("frm_avance", THIS) - THIS.o_Frm_Avance.Show() - ENDIF - ENDPROC + Procedure loadProgressbarForm + If Vartype(This.o_Frm_Avance) <> "O" Then + This.o_Frm_Avance = Createobject("frm_avance", This) + This.o_Frm_Avance.Show() + Endif + Endproc - PROCEDURE unloadProgressbarForm - LPARAMETERS tlForceUnload - IF (tlForceUnload OR THIS.n_ShowProgressbar <> 0) AND VARTYPE(THIS.o_Frm_Avance) = "O" THEN - THIS.o_Frm_Avance.Hide() - THIS.o_Frm_Avance.Release() - THIS.o_Frm_Avance = NULL - ENDIF - ENDPROC + Procedure unloadProgressbarForm + Lparameters tlForceUnload + If (tlForceUnload Or This.n_ShowProgressbar <> 0) And Vartype(This.o_Frm_Avance) = "O" Then + This.o_Frm_Avance.Hide() + This.o_Frm_Avance.Release() + This.o_Frm_Avance = Null + Endif + Endproc - PROCEDURE evaluateConfiguration - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcDontShowProgress (v? IN ) '1' para inhabilitar la barra de progreso - * tcDontShowErrors (v? IN ) '1' para no mostrar mensajes de error (MESSAGEBOX) - * tcNoTimestamps (v? IN ) Indica si se debe anular el timestamp ('1') o no ('0' ó vacío) - * tcDebug (v? IN ) '1' para habilitar modo debug (SOLO DESARROLLO) - * tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] - * Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg - * se hace desde el directorio del archivo, con lo que las referencias relativas pueden - * generar errores de compilación, típicamente los #include. - * 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 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 - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcDontShowProgress, tcDontShowErrors, tcNoTimestamps, tcDebug, tcRecompile, tcExtraBackupLevels ; + Procedure evaluateConfiguration +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcDontShowProgress (v? IN ) '1' para inhabilitar la barra de progreso +* tcDontShowErrors (v? IN ) '1' para no mostrar mensajes de error (MESSAGEBOX) +* tcNoTimestamps (v? IN ) Indica si se debe anular el timestamp ('1') o no ('0' ó vacío) +* tcDebug (v? IN ) '1' para habilitar modo debug (SOLO DESARROLLO) +* tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] +* Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg +* se hace desde el directorio del archivo, con lo que las referencias relativas pueden +* generar errores de compilación, típicamente los #include. +* 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 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 +*-------------------------------------------------------------------------------------------------------------- + Lparameters tcDontShowProgress, tcDontShowErrors, tcNoTimestamps, tcDebug, tcRecompile, tcExtraBackupLevels ; , tcClearUniqueID, tcOptimizeByFilestamp, tc_InputFile, tcInputFile_Type, toParentCFG - #IF .F. - LOCAL toParentCFG AS CL_CFG OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toParentCFG As CL_CFG Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcConfigFile, llExiste_CFG_EnDisco, laConfig(1), I, lcConfData, lcExt, lcValue, lc_CFG_Path, lcConfigLine, laDirInfo(1,5) ; + Local lcConfigFile, llExiste_CFG_EnDisco, laConfig(1), I, lcConfData, lcExt, lcValue, lc_CFG_Path, lcConfigLine, laDirInfo(1,5) ; , lnDirs, laDirs(1), llMasterEval, lcProp ; - , lo_CFG AS CL_CFG OF 'FOXBIN2PRG.PRG' ; - , loCFG_Manual AS CL_CFG OF 'FOXBIN2PRG.PRG' ; - , lo_Configuration AS Collection ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loEx as Exception + , lo_CFG As CL_CFG Of 'FOXBIN2PRG.PRG' ; + , loCFG_Manual As CL_CFG Of 'FOXBIN2PRG.PRG' ; + , lo_Configuration As Collection ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loEx As Exception - TRY - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnKey - loLang = _SCREEN.o_FoxBin2Prg_Lang - tcRecompile = EVL(tcRecompile, .c_Recompile) - lcConfigFile = .c_Foxbin2prg_ConfigFile - tc_InputFile = EVL(tc_InputFile, .c_InputFile) - tcInputFile_Type = EVL(tcInputFile_Type,'') - lo_Configuration = .o_Configuration + Try + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + Store 0 To lnKey + loLang = _Screen.o_FoxBin2Prg_Lang + tcRecompile = Evl(tcRecompile, .c_Recompile) + lcConfigFile = .c_Foxbin2prg_ConfigFile + tc_InputFile = Evl(tc_InputFile, .c_InputFile) + tcInputFile_Type = Evl(tcInputFile_Type,'') + lo_Configuration = .o_Configuration - IF VARTYPE(lcConfigFile) = "O" - loCFG_Manual = lcConfigFile && lcConfigFile is an object CFG generated by get_DirSettings() - toParentCFG = loCFG_Manual - lcConfigFile = FULLPATH('Personalized-CFG-Object', tc_InputFile) - loCFG_Manual.c_Foxbin2prg_ConfigFile = 'Personalized-CFG-Object' - ELSE - loCFG_Manual = NULL - ENDIF + If Vartype(lcConfigFile) = "O" + loCFG_Manual = lcConfigFile && lcConfigFile is an object CFG generated by get_DirSettings() + toParentCFG = loCFG_Manual + lcConfigFile = Fullpath('Personalized-CFG-Object', tc_InputFile) + loCFG_Manual.c_Foxbin2prg_ConfigFile = 'Personalized-CFG-Object' + Else + loCFG_Manual = Null + Endif - IF VARTYPE(toParentCFG) <> 'O' THEN - toParentCFG = NULL - ENDIF + If Vartype(toParentCFG) <> 'O' Then + toParentCFG = Null + Endif - IF ISNULL(toParentCFG) THEN - .c_InputFile = tc_InputFile - ENDIF + If Isnull(toParentCFG) Then + .c_InputFile = tc_InputFile + Endif - *-- Determino el tipo de InputFile (Archivo o Directorio) - IF EMPTY(tcInputFile_Type) AND NOT EMPTY(tc_InputFile) - DO CASE - CASE LEN(tc_InputFile) = 1 - tcInputFile_Type = C_FILETYPE_QUERYSUPPORT +*-- Determino el tipo de InputFile (Archivo o Directorio) + If Empty(tcInputFile_Type) And Not Empty(tc_InputFile) + Do Case + Case Len(tc_InputFile) = 1 + tcInputFile_Type = C_FILETYPE_QUERYSUPPORT - CASE ADIR(laDirInfo, tc_InputFile, "D") = 1 AND SUBSTR( laDirInfo(1,5), 5, 1 ) = "D" - tcInputFile_Type = C_FILETYPE_DIRECTORY + Case Adir(laDirInfo, tc_InputFile, "D") = 1 And Substr( laDirInfo(1,5), 5, 1 ) = "D" + tcInputFile_Type = C_FILETYPE_DIRECTORY - OTHERWISE - tcInputFile_Type = C_FILETYPE_FILE - ENDCASE - ENDIF + Otherwise + tcInputFile_Type = C_FILETYPE_FILE + Endcase + Endif - IF .l_Main_CFG_Loaded AND NOT EMPTY(tc_InputFile) AND NOT tcInputFile_Type == C_FILETYPE_QUERYSUPPORT THEN - IF .n_CFG_EvaluateFromParam = 1 - * Si se indicó por parámetro (modo objeto), usarlo como Maestro - * Se saltea solo esta evaluación, y luego se usa la variable para determinar el Nº de CFG a usar. - .n_CFG_EvaluateFromParam = -1 && Luego se cambia por el Nº de CFG que corresponda. - ELSE - IF tcInputFile_Type == C_FILETYPE_DIRECTORY THEN - * INDICÓ DIRECTORIO - IF ISNULL(loCFG_Manual) - *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) - lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), ADDBS(tc_InputFile) ) - ENDIF - ELSE - * INDICÓ ARCHIVO - IF ISNULL(loCFG_Manual) - *lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) - lcConfigFile = FULLPATH( JUSTFNAME(lcConfigFile), tc_InputFile ) - ENDIF - ENDIF - ENDIF - ENDIF + If .l_Main_CFG_Loaded And Not Empty(tc_InputFile) And Not tcInputFile_Type == C_FILETYPE_QUERYSUPPORT Then + If .n_CFG_EvaluateFromParam = 1 +* Si se indicó por parámetro (modo objeto), usarlo como Maestro +* Se saltea solo esta evaluación, y luego se usa la variable para determinar el Nº de CFG a usar. + .n_CFG_EvaluateFromParam = -1 && Luego se cambia por el Nº de CFG que corresponda. + Else + If tcInputFile_Type == C_FILETYPE_DIRECTORY Then +* INDICÓ DIRECTORIO + If Isnull(loCFG_Manual) +*lcConfigFile = FULLPATH( 'foxbin2prg.cfg', ADDBS(tc_InputFile) ) + lcConfigFile = Fullpath( Justfname(lcConfigFile), Addbs(tc_InputFile) ) + Endif + Else +* INDICÓ ARCHIVO + If Isnull(loCFG_Manual) +*lcConfigFile = FULLPATH( 'foxbin2prg.cfg', tc_InputFile ) + lcConfigFile = Fullpath( Justfname(lcConfigFile), tc_InputFile ) + Endif + Endif + Endif + Endif - lo_Configuration = .o_Configuration - .n_CFG_Actual = 0 - .l_CFG_CachedAccess = .F. - lc_CFG_Path = UPPER( JUSTPATH( lcConfigFile ) ) - lo_CFG = THIS + lo_Configuration = .o_Configuration + .n_CFG_Actual = 0 + .l_CFG_CachedAccess = .F. + lc_CFG_Path = Upper( Justpath( lcConfigFile ) ) + lo_CFG = This - *-- Búsqueda del CFG del PATH indicado en la caché - IF .l_Main_CFG_Loaded +*-- Búsqueda del CFG del PATH indicado en la caché + If .l_Main_CFG_Loaded - IF lo_Configuration.Count > 0 THEN - IF .n_CFG_EvaluateFromParam > 1 - * Especial: Si hay una configuración de bloqueo (CFG Manual), se usa - .n_CFG_Actual = .n_CFG_EvaluateFromParam - ELSE - * Normalmente se buscará el CFG del directorio analizado - .n_CFG_Actual = lo_Configuration.GetKey( lc_CFG_Path ) && 0 = No hay CFG cacheada, >0 = Hay CFG cacheada - ENDIF + If lo_Configuration.Count > 0 Then + If .n_CFG_EvaluateFromParam > 1 +* Especial: Si hay una configuración de bloqueo (CFG Manual), se usa + .n_CFG_Actual = .n_CFG_EvaluateFromParam + Else +* Normalmente se buscará el CFG del directorio analizado + .n_CFG_Actual = lo_Configuration.GetKey( lc_CFG_Path ) && 0 = No hay CFG cacheada, >0 = Hay CFG cacheada + Endif - IF .n_CFG_Actual > 0 THEN - lo_CFG = lo_Configuration.Item(.n_CFG_Actual) - .l_CFG_CachedAccess = .T. + If .n_CFG_Actual > 0 Then + lo_CFG = lo_Configuration.Item(.n_CFG_Actual) + .l_CFG_CachedAccess = .T. - IF NOT ISNULL(loCFG_Manual) - * Si le paso un objeto CFG, prevalece sobre el guardado - lo_CFG.CopyFrom(@loCFG_Manual) - ENDIF - ENDIF - ENDIF + If Not Isnull(loCFG_Manual) +* Si le paso un objeto CFG, prevalece sobre el guardado + lo_CFG.CopyFrom(@loCFG_Manual) + Endif + Endif + Endif - *-- Si no se pasó un CFG padre y no hay CFGs o no encuentra el del PATH indicado, analizo la jararquía - IF ISNULL(toParentCFG) AND (lo_Configuration.Count = 0 OR .n_CFG_Actual = 0) THEN - llMasterEval = .T. - toParentCFG = THIS +*-- Si no se pasó un CFG padre y no hay CFGs o no encuentra el del PATH indicado, analizo la jararquía + If Isnull(toParentCFG) And (lo_Configuration.Count = 0 Or .n_CFG_Actual = 0) Then + llMasterEval = .T. + toParentCFG = This - IF LEFT( lc_CFG_Path, 2 ) == '\\' THEN - *lnDirs = OCCURS( '\', lc_CFG_Path ) - 3 - lnDirs = OCCURS( '\', lc_CFG_Path ) - 2 - ELSE - lnDirs = OCCURS( '\', lc_CFG_Path ) - ENDIF + If Left( lc_CFG_Path, 2 ) == '\\' Then +*lnDirs = OCCURS( '\', lc_CFG_Path ) - 3 + lnDirs = Occurs( '\', lc_CFG_Path ) - 2 + Else + lnDirs = Occurs( '\', lc_CFG_Path ) + Endif - IF lnDirs > 0 THEN - DIMENSION laDirs(lnDirs) + If lnDirs > 0 Then + Dimension laDirs(lnDirs) - *-- Creo el array con los PATH intermedios - FOR I = lnDirs TO 1 STEP -1 - IF m.I = lnDirs THEN - laDirs(m.I) = JUSTPATH(lc_CFG_Path) - ELSE - laDirs(m.I) = JUSTPATH(laDirs(m.I+1)) - ENDIF - ENDFOR +*-- Creo el array con los PATH intermedios + For I = lnDirs To 1 Step -1 + If m.I = lnDirs Then + laDirs(m.I) = Justpath(lc_CFG_Path) + Else + laDirs(m.I) = Justpath(laDirs(m.I+1)) + Endif + Endfor - IF lnDirs = 1 AND laDirs(1) = lc_CFG_Path - *-- Cuando no hay PATH intermedios, salteo esta parte para que más abajo lo agregue. 04/02/2016. FDBOZZO - *-- Ejemplo: Puede pasar cuando se convierte un archivo en C:\ u otro disco RAIZ. - ELSE - *-- Ahora evalúo las configuraciones de los PATH intermedios desde la raíz en adelante - *-- y mantengo la última configuración CFG Padre en toParentCFG para usarla como base. - FOR I = 1 TO lnDirs - .evaluateConfiguration( '', '', '', '', '', '', '', '', laDirs(m.I), C_FILETYPE_DIRECTORY, @toParentCFG) - ENDFOR - ENDIF + If lnDirs = 1 And laDirs(1) = lc_CFG_Path +*-- Cuando no hay PATH intermedios, salteo esta parte para que más abajo lo agregue. 04/02/2016. FDBOZZO +*-- Ejemplo: Puede pasar cuando se convierte un archivo en C:\ u otro disco RAIZ. + Else +*-- Ahora evalúo las configuraciones de los PATH intermedios desde la raíz en adelante +*-- y mantengo la última configuración CFG Padre en toParentCFG para usarla como base. + For I = 1 To lnDirs + .evaluateConfiguration( '', '', '', '', '', '', '', '', laDirs(m.I), C_FILETYPE_DIRECTORY, @toParentCFG) + Endfor + Endif - .l_CFG_CachedAccess = .F. - .n_CFG_Actual = 0 - ENDIF - ENDIF - ENDIF + .l_CFG_CachedAccess = .F. + .n_CFG_Actual = 0 + Endif + Endif + Endif - DO CASE - CASE .n_CFG_Actual = 0 - *-- Si no se encontró un CFG cacheado, se busca si existe un archivo CFG en disco - llExiste_CFG_EnDisco = ( ADIR( laDirInfo, lcConfigFile ) = 1 ) + Do Case + Case .n_CFG_Actual = 0 +*-- Si no se encontró un CFG cacheado, se busca si existe un archivo CFG en disco + llExiste_CFG_EnDisco = ( Adir( laDirInfo, lcConfigFile ) = 1 ) - IF NOT llExiste_CFG_EnDisco - .l_CFG_CachedAccess = .T. && Es cacheado porque sin archivo CFG usa config.interna - ENDIF + If Not llExiste_CFG_EnDisco + .l_CFG_CachedAccess = .T. && Es cacheado porque sin archivo CFG usa config.interna + Endif - CASE ISNULL( .o_Configuration( .n_CFG_Actual ) ) - *-- Si existe una configuración y es NULL, es la predeterminada. - *-- Este es el primer objeto CFG en cargarse cuando se inicializa FoxBin2Prg, - *-- y corresponde a la ruta de instalación del EXE (ej: c:\desa\foxbin2prg\foxbin2prg.cfg) - lo_CFG = THIS + Case Isnull( .o_Configuration( .n_CFG_Actual ) ) +*-- Si existe una configuración y es NULL, es la predeterminada. +*-- Este es el primer objeto CFG en cargarse cuando se inicializa FoxBin2Prg, +*-- y corresponde a la ruta de instalación del EXE (ej: c:\desa\foxbin2prg\foxbin2prg.cfg) + lo_CFG = This - ENDCASE + Endcase - IF .l_Main_CFG_Loaded - IF .l_CFG_CachedAccess AND .n_CFG_Actual > 0 THEN - toParentCFG = lo_CFG - .writeLog( '> ' + UPPER(loLang.C_USING_THIS_SETTINGS_LOC) + ': ' + lo_CFG.c_Foxbin2prg_ConfigFile + ' => ' + tc_InputFile + '' ) - ELSE - .writeLog( '> ' + UPPER(loLang.C_CACHING_CONFIG_FOR_DIRECTORY_LOC) + ': ' + lc_CFG_Path ) - lo_CFG = CREATEOBJECT('CL_CFG') - - lo_Configuration.Add( lo_CFG, lc_CFG_Path ) - .n_CFG_Actual = lo_Configuration.Count - - IF NOT ISNULL(toParentCFG) - lo_CFG.CopyFrom(@toParentCFG) + If .l_Main_CFG_Loaded + If .l_CFG_CachedAccess And .n_CFG_Actual > 0 Then toParentCFG = lo_CFG - .writeLog( C_TAB + '- ' + loLang.C_INHERITING_FROM_LOC + ': ' + lo_CFG.c_Foxbin2prg_ConfigFile ) - ENDIF - ENDIF + .writeLog( '> ' + Upper(loLang.C_USING_THIS_SETTINGS_LOC) + ': ' + lo_CFG.c_Foxbin2prg_ConfigFile + ' => ' + tc_InputFile + '' ) + Else + .writeLog( '> ' + Upper(loLang.C_CACHING_CONFIG_FOR_DIRECTORY_LOC) + ': ' + lc_CFG_Path ) + lo_CFG = Createobject('CL_CFG') + lo_Configuration.Add( lo_CFG, lc_CFG_Path ) + .n_CFG_Actual = lo_Configuration.Count - ELSE - lo_Configuration.Add( NULL, lc_CFG_Path ) && La NULL se carga solo cuando no hay Main_CFG_loaded todavía. - .n_CFG_Actual = lo_Configuration.Count - ENDIF + If Not Isnull(toParentCFG) + lo_CFG.CopyFrom(@toParentCFG) + toParentCFG = lo_CFG + .writeLog( C_TAB + '- ' + loLang.C_INHERITING_FROM_LOC + ': ' + lo_CFG.c_Foxbin2prg_ConfigFile ) + Endif + Endif - *-- NOTA: SOLO LOS QUE NO VENGAN DE PARÁMETROS EXTERNOS DEBEN ASIGNARSE A lo_CFG AQUÍ. - IF llExiste_CFG_EnDisco AND NOT .l_CFG_CachedAccess THEN - .writeLog() - .writeLog( '> ' + loLang.C_READING_CFG_VALUES_FROM_DISK_LOC + ':' ) - .writeLog( C_TAB + loLang.C_CONFIGFILE_LOC + ' ' + lcConfigFile ) + Else + lo_Configuration.Add( Null, lc_CFG_Path ) && La NULL se carga solo cuando no hay Main_CFG_loaded todavía. + .n_CFG_Actual = lo_Configuration.Count + Endif - lo_CFG.c_Foxbin2prg_ConfigFile = lcConfigFile +*-- NOTA: SOLO LOS QUE NO VENGAN DE PARÁMETROS EXTERNOS DEBEN ASIGNARSE A lo_CFG AQUÍ. + If llExiste_CFG_EnDisco And Not .l_CFG_CachedAccess Then + .writeLog() + .writeLog( '> ' + loLang.C_READING_CFG_VALUES_FROM_DISK_LOC + ':' ) + .writeLog( C_TAB + loLang.C_CONFIGFILE_LOC + ' ' + lcConfigFile ) - FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 ) - .set_Line( @lcConfigLine, @laConfig, m.I ) - .get_SeparatedLineAndComment( @lcConfigLine ) - laConfig(m.I) = LOWER( lcConfigLine ) + lo_CFG.c_Foxbin2prg_ConfigFile = lcConfigFile - DO CASE - CASE EMPTY( laConfig(m.I) ) OR INLIST( LEFT( laConfig(m.I), 1 ), '*', '#', '/', "'" ) - LOOP + For I = 1 To Alines( laConfig, Filetostr( lcConfigFile ), 1+4 ) + .set_Line( @lcConfigLine, @laConfig, m.I ) + .get_SeparatedLineAndComment( @lcConfigLine ) + laConfig(m.I) = Lower( lcConfigLine ) - CASE LEFT( laConfig(m.I), 10 ) == LOWER('Extension:') - lcConfData = ALLTRIM( SUBSTR( laConfig(m.I), 11 ) ) - lcExt = ALLTRIM( GETWORDNUM( lcConfData, 1, '=' ) ) - lcProp = 'c_' + lcExt - IF PEMSTATUS( lo_CFG, lcProp, 5 ) - lcValue = UPPER( ALLTRIM( GETWORDNUM( lcConfData, 2, '=' ) ) ) - lo_CFG.ADDPROPERTY( lcProp, lcValue ) - *.writeLog( 'Reconfiguración de extensión:' + ' ' + lcExt + ' a ' + lcValue ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ' + loLang.C_EXTENSION_RECONFIGURATION_LOC + ' ' + lcExt + ' -> ' + lcValue ) - ENDIF + Do Case + Case Empty( laConfig(m.I) ) Or Inlist( Left( laConfig(m.I), 1 ), '*', '#', '/', "'" ) + Loop - CASE LEFT( laConfig(m.I), 17 ) == LOWER('DontShowProgress:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 18 ) ) - IF NOT INLIST( TRANSFORM(tcDontShowProgress), '0', '1', '2' ) AND INLIST( lcValue, '0', '1', '2' ) THEN - tcDontShowProgress = lcValue - lo_CFG.n_ShowProgressbar = ICASE(lcValue=='0',1, lcValue=='1',0, 2) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > tcDontShowProgress: ' + TRANSFORM(tcDontShowProgress) ) - ENDIF + Case Left( laConfig(m.I), 10 ) == Lower('Extension:') + lcConfData = Alltrim( Substr( laConfig(m.I), 11 ) ) + lcExt = Alltrim( Getwordnum( lcConfData, 1, '=' ) ) + lcProp = 'c_' + lcExt + If Pemstatus( lo_CFG, lcProp, 5 ) + lcValue = Upper( Alltrim( Getwordnum( lcConfData, 2, '=' ) ) ) + lo_CFG.AddProperty( lcProp, lcValue ) +*.writeLog( 'Reconfiguración de extensión:' + ' ' + lcExt + ' a ' + lcValue ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ' + loLang.C_EXTENSION_RECONFIGURATION_LOC + ' ' + lcExt + ' -> ' + lcValue ) + Endif - CASE LEFT( laConfig(m.I), 16 ) == LOWER('ShowProgressbar:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 17 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.n_ShowProgressbar = INT( VAL(lcValue) ) - tcDontShowProgress = '' - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ShowProgressbar: ' + lcValue ) - ENDIF + Case Left( laConfig(m.I), 17 ) == Lower('DontShowProgress:') + lcValue = Alltrim( Substr( laConfig(m.I), 18 ) ) + If Not Inlist( Transform(tcDontShowProgress), '0', '1', '2' ) And Inlist( lcValue, '0', '1', '2' ) Then + tcDontShowProgress = lcValue + lo_CFG.n_ShowProgressbar = Icase(lcValue=='0',1, lcValue=='1',0, 2) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > tcDontShowProgress: ' + Transform(tcDontShowProgress) ) + Endif - CASE LEFT( laConfig(m.I), 15 ) == LOWER('DontShowErrors:') - *-- Priorizo si tcDontShowErrors NO viene con "0" como parámetro, ya que los scripts vbs - *-- los utilizan para sobreescribir la configuración por defecto de foxbin2prg.cfg - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 16 ) ) - IF NOT INLIST( TRANSFORM(tcDontShowErrors), '0', '1' ) AND INLIST( lcValue, '0', '1' ) THEN - tcDontShowErrors = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > tcDontShowErrors: ' + TRANSFORM(tcDontShowErrors) ) - ENDIF + Case Left( laConfig(m.I), 16 ) == Lower('ShowProgressbar:') + lcValue = Alltrim( Substr( laConfig(m.I), 17 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.n_ShowProgressbar = Int( Val(lcValue) ) + tcDontShowProgress = '' + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ShowProgressbar: ' + lcValue ) + Endif - CASE LEFT( laConfig(m.I), 13 ) == LOWER('NoTimestamps:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 14 ) ) - IF NOT INLIST( TRANSFORM(tcNoTimestamps), '0', '1' ) AND INLIST( lcValue, '0', '1' ) THEN - tcNoTimestamps = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > tcNoTimestamps: ' + TRANSFORM(tcNoTimestamps) ) - ENDIF + Case Left( laConfig(m.I), 15 ) == Lower('DontShowErrors:') +*-- Priorizo si tcDontShowErrors NO viene con "0" como parámetro, ya que los scripts vbs +*-- los utilizan para sobreescribir la configuración por defecto de foxbin2prg.cfg + lcValue = Alltrim( Substr( laConfig(m.I), 16 ) ) + If Not Inlist( Transform(tcDontShowErrors), '0', '1' ) And Inlist( lcValue, '0', '1' ) Then + tcDontShowErrors = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > tcDontShowErrors: ' + Transform(tcDontShowErrors) ) + Endif - CASE LEFT( laConfig(m.I), 6 ) == LOWER('Debug:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 7 ) ) - IF NOT INLIST( TRANSFORM(tcDebug), '0', '1' ) AND INLIST( lcValue, '0', '1' ) THEN - tcDebug = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > tcDebug: ' + TRANSFORM(tcDebug) ) - ENDIF + Case Left( laConfig(m.I), 13 ) == Lower('NoTimestamps:') + lcValue = Alltrim( Substr( laConfig(m.I), 14 ) ) + If Not Inlist( Transform(tcNoTimestamps), '0', '1' ) And Inlist( lcValue, '0', '1' ) Then + tcNoTimestamps = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > tcNoTimestamps: ' + Transform(tcNoTimestamps) ) + Endif - CASE LEFT( laConfig(m.I), 18 ) == LOWER('ExtraBackupLevels:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 19 ) ) - IF NOT ISDIGIT( TRANSFORM(tcExtraBackupLevels) ) AND ISDIGIT( lcValue ) THEN - tcExtraBackupLevels = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > tcExtraBackupLevels: ' + TRANSFORM(tcExtraBackupLevels) ) - ENDIF + Case Left( laConfig(m.I), 6 ) == Lower('Debug:') + lcValue = Alltrim( Substr( laConfig(m.I), 7 ) ) + If Not Inlist( Transform(tcDebug), '0', '1' ) And Inlist( lcValue, '0', '1' ) Then + tcDebug = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > tcDebug: ' + Transform(tcDebug) ) + Endif - CASE LEFT( laConfig(m.I), 14 ) == LOWER('ClearUniqueID:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 15 ) ) - IF NOT INLIST( TRANSFORM(tcClearUniqueID), '0', '1' ) AND INLIST( lcValue, '0', '1' ) THEN - tcClearUniqueID = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ClearUniqueID: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 18 ) == Lower('ExtraBackupLevels:') + lcValue = Alltrim( Substr( laConfig(m.I), 19 ) ) + If Not Isdigit( Transform(tcExtraBackupLevels) ) And Isdigit( lcValue ) Then + tcExtraBackupLevels = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > tcExtraBackupLevels: ' + Transform(tcExtraBackupLevels) ) + Endif - CASE LEFT( laConfig(m.I), 19 ) == LOWER('ClearDBFLastUpdate:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 20 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_ClearDBFLastUpdate = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ClearDBFLastUpdate: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 14 ) == Lower('ClearUniqueID:') + lcValue = Alltrim( Substr( laConfig(m.I), 15 ) ) + If Not Inlist( Transform(tcClearUniqueID), '0', '1' ) And Inlist( lcValue, '0', '1' ) Then + tcClearUniqueID = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ClearUniqueID: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 20 ) == LOWER('OptimizeByFilestamp:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 21 ) ) - 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 + Case Left( laConfig(m.I), 19 ) == Lower('ClearDBFLastUpdate:') + lcValue = Alltrim( Substr( laConfig(m.I), 20 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_ClearDBFLastUpdate = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ClearDBFLastUpdate: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 16 ) == LOWER('UseClassPerFile:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 17 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.n_UseClassPerFile = INT( VAL(lcValue) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > UseClassPerFile: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 20 ) == Lower('OptimizeByFilestamp:') + lcValue = Alltrim( Substr( laConfig(m.I), 21 ) ) + 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 - CASE LEFT( laConfig(m.I), 18 ) == LOWER('ClassPerFileCheck:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 19 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_ClassPerFileCheck = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ClassPerFileCheck: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 16 ) == Lower('UseClassPerFile:') + lcValue = Alltrim( Substr( laConfig(m.I), 17 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.n_UseClassPerFile = Int( Val(lcValue) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > UseClassPerFile: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 27 ) == LOWER('RedirectClassPerFileToMain:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 28 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_RedirectClassPerFileToMain = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectClassPerFileToMain: ' + TRANSFORM(lcValue) ) - ENDIF - CASE LEFT( laConfig(m.I), 18 ) == LOWER('RedirectClassType:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 19 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.n_RedirectClassType = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectClassType: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 18 ) == Lower('ClassPerFileCheck:') + lcValue = Alltrim( Substr( laConfig(m.I), 19 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_ClassPerFileCheck = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ClassPerFileCheck: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 24 ) == LOWER('RemoveNullCharsFromCode:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 25 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_RemoveNullCharsFromCode = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RemoveNullCharsFromCode: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 27 ) == Lower('RedirectClassPerFileToMain:') + lcValue = Alltrim( Substr( laConfig(m.I), 28 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_RedirectClassPerFileToMain = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > RedirectClassPerFileToMain: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 25 ) == LOWER('RemoveZOrderSetFromProps:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 26 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_RemoveZOrderSetFromProps = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RemoveZOrderSetFromProps: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 18 ) == Lower('RedirectClassType:') + lcValue = Alltrim( Substr( laConfig(m.I), 19 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.n_RedirectClassType = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > RedirectClassType: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 9 ) == LOWER('Language:') - *-- CASO ESPECIAL: El lenguaje no se guarda en lo_CFG, porque es un seteo Global. - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 10 ) ) - .changeLanguage(lcValue) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > Language: ' + TRANSFORM(lcValue) + ' (' + .c_Language + ')' ) + Case Left( laConfig(m.I), 24 ) == Lower('RemoveNullCharsFromCode:') + lcValue = Alltrim( Substr( laConfig(m.I), 25 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_RemoveNullCharsFromCode = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > RemoveNullCharsFromCode: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('PJX_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.PJX_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > PJX_Conversion_Support: ' + TRANSFORM(lo_CFG.PJX_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 25 ) == Lower('RemoveZOrderSetFromProps:') + lcValue = Alltrim( Substr( laConfig(m.I), 26 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_RemoveZOrderSetFromProps = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > RemoveZOrderSetFromProps: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('VCX_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.VCX_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > VCX_Conversion_Support: ' + TRANSFORM(lo_CFG.VCX_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 9 ) == Lower('Language:') +*-- CASO ESPECIAL: El lenguaje no se guarda en lo_CFG, porque es un seteo Global. + lcValue = Alltrim( Substr( laConfig(m.I), 10 ) ) + .changeLanguage(lcValue) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > Language: ' + Transform(lcValue) + ' (' + .c_Language + ')' ) - CASE LEFT( laConfig(m.I), 23 ) == LOWER('SCX_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.SCX_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > SCX_Conversion_Support: ' + TRANSFORM(lo_CFG.SCX_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('PJX_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.PJX_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > PJX_Conversion_Support: ' + Transform(lo_CFG.PJX_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('FRX_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.FRX_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > FRX_Conversion_Support: ' + TRANSFORM(lo_CFG.FRX_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('VCX_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.VCX_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > VCX_Conversion_Support: ' + Transform(lo_CFG.VCX_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('LBX_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.LBX_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > LBX_Conversion_Support: ' + TRANSFORM(lo_CFG.LBX_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('SCX_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.SCX_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > SCX_Conversion_Support: ' + Transform(lo_CFG.SCX_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('MNX_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.MNX_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > MNX_Conversion_Support: ' + TRANSFORM(lo_CFG.MNX_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('FRX_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.FRX_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > FRX_Conversion_Support: ' + Transform(lo_CFG.FRX_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('FKY_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.FKY_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > FKY_Conversion_Support: ' + TRANSFORM(lo_CFG.FKY_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('LBX_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.LBX_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > LBX_Conversion_Support: ' + Transform(lo_CFG.LBX_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('MEM_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.MEM_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > MEM_Conversion_Support: ' + TRANSFORM(lo_CFG.MEM_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('MNX_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.MNX_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > MNX_Conversion_Support: ' + Transform(lo_CFG.MNX_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('DBF_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2', '4', '8' ) THEN - lo_CFG.DBF_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_Conversion_Support: ' + TRANSFORM(lo_CFG.DBF_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('FKY_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.FKY_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > FKY_Conversion_Support: ' + Transform(lo_CFG.FKY_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 24 ) == LOWER('DBF_Conversion_Included:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 25 ) ) - IF NOT EMPTY(lcValue) THEN - lo_CFG.DBF_Conversion_Included = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_Conversion_Included: ' + TRANSFORM(lo_CFG.DBF_Conversion_Included) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('MEM_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.MEM_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > MEM_Conversion_Support: ' + Transform(lo_CFG.MEM_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 24 ) == LOWER('DBF_Conversion_Excluded:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 25 ) ) - IF NOT EMPTY(lcValue) THEN - lo_CFG.DBF_Conversion_Excluded = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_Conversion_Excluded: ' + TRANSFORM(lo_CFG.DBF_Conversion_Excluded) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('DBF_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2', '4', '8' ) Then + lo_CFG.DBF_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > DBF_Conversion_Support: ' + Transform(lo_CFG.DBF_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 23 ) == LOWER('DBC_Conversion_Support:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2' ) THEN - lo_CFG.DBC_Conversion_Support = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBC_Conversion_Support: ' + TRANSFORM(lo_CFG.DBC_Conversion_Support) ) - ENDIF + Case Left( laConfig(m.I), 24 ) == Lower('DBF_Conversion_Included:') + lcValue = Alltrim( Substr( laConfig(m.I), 25 ) ) + If Not Empty(lcValue) Then + lo_CFG.DBF_Conversion_Included = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > DBF_Conversion_Included: ' + Transform(lo_CFG.DBF_Conversion_Included) ) + Endif - CASE LEFT( laConfig(m.I), 16 ) == LOWER('BackgroundImage:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 17 ) ) - IF EMPTY(lcValue) OR ADIR( laDirInfo, lcValue ) > 0 THEN - lo_CFG.c_BackgroundImage = lcValue - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > BackgroundImage: ' + TRANSFORM(lo_CFG.c_BackgroundImage) ) - ENDIF + Case Left( laConfig(m.I), 24 ) == Lower('DBF_Conversion_Excluded:') + lcValue = Alltrim( Substr( laConfig(m.I), 25 ) ) + If Not Empty(lcValue) Then + lo_CFG.DBF_Conversion_Excluded = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > DBF_Conversion_Excluded: ' + Transform(lo_CFG.DBF_Conversion_Excluded) ) + Endif - CASE LEFT( laConfig(m.I), 25 ) == LOWER('ExcludeDBFAutoincNextval:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 26 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.n_ExcludeDBFAutoincNextval = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ExcludeDBFAutoincNextval: ' + TRANSFORM(lo_CFG.n_ExcludeDBFAutoincNextval) ) - ENDIF + Case Left( laConfig(m.I), 23 ) == Lower('DBC_Conversion_Support:') + lcValue = Alltrim( Substr( laConfig(m.I), 24 ) ) + If Inlist( lcValue, '0', '1', '2' ) Then + lo_CFG.DBC_Conversion_Support = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > DBC_Conversion_Support: ' + Transform(lo_CFG.DBC_Conversion_Support) ) + Endif - CASE LEFT( laConfig(m.I), 12 ) == LOWER('BodyDevInfo:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 13 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.n_BodyDevInfo = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > BodyDevInfo: ' + TRANSFORM(lo_CFG.n_BodyDevInfo) ) - ENDIF + Case Left( laConfig(m.I), 16 ) == Lower('BackgroundImage:') + lcValue = Alltrim( Substr( laConfig(m.I), 17 ) ) + If Empty(lcValue) Or Adir( laDirInfo, lcValue ) > 0 Then + lo_CFG.c_BackgroundImage = lcValue + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > BackgroundImage: ' + Transform(lo_CFG.c_BackgroundImage) ) + Endif - CASE LEFT( laConfig(I), 17 ) == LOWER('PRG_Compat_Level:') - lcValue = ALLTRIM( SUBSTR( laConfig(I), 18 ) ) - lo_CFG.n_PRG_Compat_Level = INT( VAL( lcValue ) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > PRG_Compat_Level: ' + TRANSFORM(lo_CFG.n_PRG_Compat_Level) ) + Case Left( laConfig(m.I), 25 ) == Lower('ExcludeDBFAutoincNextval:') + lcValue = Alltrim( Substr( laConfig(m.I), 26 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.n_ExcludeDBFAutoincNextval = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ExcludeDBFAutoincNextval: ' + Transform(lo_CFG.n_ExcludeDBFAutoincNextval) ) + Endif - ENDCASE - ENDFOR + Case Left( laConfig(m.I), 12 ) == Lower('BodyDevInfo:') + lcValue = Alltrim( Substr( laConfig(m.I), 13 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.n_BodyDevInfo = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > BodyDevInfo: ' + Transform(lo_CFG.n_BodyDevInfo) ) + Endif + + Case Left( laConfig(I), 17 ) == Lower('PRG_Compat_Level:') + lcValue = Alltrim( Substr( laConfig(I), 18 ) ) + lo_CFG.n_PRG_Compat_Level = Int( Val( lcValue ) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > PRG_Compat_Level: ' + Transform(lo_CFG.n_PRG_Compat_Level) ) + + Endcase + Endfor + + .writeLog( ) + + Endif && llExiste_CFG_EnDisco + +*-- ESTOS SE EVALÚAN FUERA DEL IF PORQUE NO DEPENDEN DEL CFG +*-- Y PUEDEN VENIR TAMBIÉN DE PARÁMETROS EXTERNOS. + If Inlist( Transform(tcDontShowProgress), '0', '1', '2' ) Then + lo_CFG.n_ShowProgressbar = Icase(tcDontShowProgress=='0',1, tcDontShowProgress=='1',0, 2) + Endif + If Inlist( Transform(tcDontShowErrors), '0', '1' ) Then + lo_CFG.l_ShowErrors = Not (Transform(tcDontShowErrors) == '1') + Endif +*IF NOT .l_Main_CFG_Loaded + lo_CFG.l_Recompile = (Empty(tcRecompile) Or Transform(tcRecompile) == '1' Or Directory(tcRecompile)) +*ENDIF + If Inlist( Transform(tcNoTimestamps), '0', '1' ) Then + lo_CFG.l_NoTimestamps = Not (Transform(tcNoTimestamps) == '0') + Endif + If Inlist( Transform(tcClearUniqueID), '0', '1' ) Then + lo_CFG.l_ClearUniqueID = Not (Transform(tcClearUniqueID) == '0') + Endif + If Inlist( Transform(tcDebug), '0', '1', '2' ) Then + lo_CFG.n_Debug = Int(Val(tcDebug)) + Endif + tcExtraBackupLevels = Evl( tcExtraBackupLevels, Transform( .n_ExtraBackupLevels ) ) + If Isdigit(tcExtraBackupLevels) + lo_CFG.n_ExtraBackupLevels = Int( Val( Transform(tcExtraBackupLevels) ) ) + Endif + If Inlist( Transform(tcOptimizeByFilestamp), '0', '1', '2' ) Then + lo_CFG.n_OptimizeByFilestamp = Int(Val(tcOptimizeByFilestamp)) + Endif + + .l_Main_CFG_Loaded = .T. + + If llMasterEval +* Si se inidicó un archivo CFG por parámetro (modo objeto), aqui se bloquea +* al Nº de configuración correspondiente. + If .n_CFG_EvaluateFromParam = -1 + .n_CFG_EvaluateFromParam = .n_CFG_Actual + Endif + Else +*-- Si no es llMasterEval, es porque esta llamada es cíclica desde este mismo método, +*-- y no hay parámetros para evaluar, ya que se mandan todos vacíos desde el inicial. + Exit + Endif + + .writeLog( '> ' + Upper(loLang.C_USING_THIS_SETTINGS_LOC) + ':' ) + .writeLog( C_TAB + 'n_CFG_Actual: ' + Transform(.n_CFG_Actual) + Icase(.n_CFG_Actual=1, ' [MASTER]', ' [SECONDARY]') ) + .writeLog( C_TAB + 'l_CFG_CachedAccess: ' + Transform(.l_CFG_CachedAccess) ) + .writeLog( C_TAB + 'tc_InputFile: ' + Transform(Evl(tc_InputFile,'') ) ) + .writeLog( C_TAB + 'c_Foxbin2prg_ConfigFile: ' + Transform(Evl(lo_CFG.c_Foxbin2prg_ConfigFile, '(Internal defaults)') ) ) + .writeLog( C_TAB + 'n_ShowProgressbar: ' + Transform(.n_ShowProgressbar) ) + .writeLog( C_TAB + 'l_ShowErrors: ' + Transform(.l_ShowErrors) ) + .writeLog( C_TAB + 'l_Recompile: ' + Transform(.l_Recompile) + ' (' + tcRecompile + ')' ) + .writeLog( C_TAB + 'l_NoTimestamps: ' + Transform(.l_NoTimestamps) ) + .writeLog( C_TAB + 'l_ClearUniqueID: ' + Transform(.l_ClearUniqueID) ) + .writeLog( C_TAB + 'n_UseClassPerFile: ' + Transform(.n_UseClassPerFile) ) + .writeLog( C_TAB + 'l_ClassPerFileCheck: ' + Transform(.l_ClassPerFileCheck) ) + .writeLog( C_TAB + 'l_RedirectClassPerFileToMain: ' + Transform(.l_RedirectClassPerFileToMain) ) + .writeLog( C_TAB + 'n_RedirectClassType: ' + Transform(.n_RedirectClassType) ) + .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 + 'n_OptimizeByFilestamp: ' + Transform(.n_OptimizeByFilestamp) ) + .writeLog( C_TAB + 'n_ExcludeDBFAutoincNextval: ' + Transform(.n_ExcludeDBFAutoincNextval) ) + .writeLog( C_TAB + 'l_RemoveNullCharsFromCode: ' + Transform(.l_RemoveNullCharsFromCode) ) + .writeLog( C_TAB + 'l_RemoveZOrderSetFromProps: ' + Transform(.l_RemoveZOrderSetFromProps) ) + .writeLog( C_TAB + 'l_ClearDBFLastUpdate: ' + Transform(.l_ClearDBFLastUpdate) ) + .writeLog( C_TAB + 'c_Language: ' + Transform(.c_Language) ) .writeLog( ) + Endwith && THIS - ENDIF && llExiste_CFG_EnDisco + Catch To loEx + loEx.UserValue = loEx.UserValue + 'lcConfigFile = [' + Transform(lcConfigFile) + ']' + CR_LF + loEx.UserValue = loEx.UserValue + 'lc_CFG_Path = [' + Transform(lc_CFG_Path) + ']' + CR_LF + loEx.UserValue = loEx.UserValue + 'lcValue = [' + Transform(lcValue) + ']' + CR_LF - *-- ESTOS SE EVALÚAN FUERA DEL IF PORQUE NO DEPENDEN DEL CFG - *-- Y PUEDEN VENIR TAMBIÉN DE PARÁMETROS EXTERNOS. - IF INLIST( TRANSFORM(tcDontShowProgress), '0', '1', '2' ) THEN - lo_CFG.n_ShowProgressbar = ICASE(tcDontShowProgress=='0',1, tcDontShowProgress=='1',0, 2) - ENDIF - IF INLIST( TRANSFORM(tcDontShowErrors), '0', '1' ) THEN - lo_CFG.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1') - ENDIF - *IF NOT .l_Main_CFG_Loaded - lo_CFG.l_Recompile = (EMPTY(tcRecompile) OR TRANSFORM(tcRecompile) == '1' OR DIRECTORY(tcRecompile)) - *ENDIF - IF INLIST( TRANSFORM(tcNoTimestamps), '0', '1' ) THEN - lo_CFG.l_NoTimestamps = NOT (TRANSFORM(tcNoTimestamps) == '0') - ENDIF - IF INLIST( TRANSFORM(tcClearUniqueID), '0', '1' ) THEN - lo_CFG.l_ClearUniqueID = NOT (TRANSFORM(tcClearUniqueID) == '0') - ENDIF - IF INLIST( TRANSFORM(tcDebug), '0', '1', '2' ) THEN - lo_CFG.n_Debug = INT(VAL(tcDebug)) - ENDIF - tcExtraBackupLevels = EVL( tcExtraBackupLevels, TRANSFORM( .n_ExtraBackupLevels ) ) - IF ISDIGIT(tcExtraBackupLevels) - lo_CFG.n_ExtraBackupLevels = INT( VAL( TRANSFORM(tcExtraBackupLevels) ) ) - ENDIF - IF INLIST( TRANSFORM(tcOptimizeByFilestamp), '0', '1', '2' ) THEN - lo_CFG.n_OptimizeByFilestamp = INT(VAL(tcOptimizeByFilestamp)) - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - .l_Main_CFG_Loaded = .T. + Throw - IF llMasterEval - * Si se inidicó un archivo CFG por parámetro (modo objeto), aqui se bloquea - * al Nº de configuración correspondiente. - IF .n_CFG_EvaluateFromParam = -1 - .n_CFG_EvaluateFromParam = .n_CFG_Actual - ENDIF - ELSE - *-- Si no es llMasterEval, es porque esta llamada es cíclica desde este mismo método, - *-- y no hay parámetros para evaluar, ya que se mandan todos vacíos desde el inicial. - EXIT - ENDIF + Finally + Store Null To lo_Configuration, lo_CFG, loEx + Release tcDontShowProgress, tcDontShowErrors, tcNoTimestamps, tcDebug, tcRecompile, tcExtraBackupLevels ; + , tcClearUniqueID, tcOptimizeByFilestamp, tc_InputFile ; + , lcConfigFile, llExiste_CFG_EnDisco, laConfig, I, lcConfData, lcExt, lcValue, lc_CFG_Path ; + , lo_CFG, lo_Configuration, loEx - .writeLog( '> ' + UPPER(loLang.C_USING_THIS_SETTINGS_LOC) + ':' ) - .writeLog( C_TAB + 'n_CFG_Actual: ' + TRANSFORM(.n_CFG_Actual) + ICASE(.n_CFG_Actual=1, ' [MASTER]', ' [SECONDARY]') ) - .writeLog( C_TAB + 'l_CFG_CachedAccess: ' + TRANSFORM(.l_CFG_CachedAccess) ) - .writeLog( C_TAB + 'tc_InputFile: ' + TRANSFORM(EVL(tc_InputFile,'') ) ) - .writeLog( C_TAB + 'c_Foxbin2prg_ConfigFile: ' + TRANSFORM(EVL(lo_CFG.c_Foxbin2prg_ConfigFile, '(Internal defaults)') ) ) - .writeLog( C_TAB + 'n_ShowProgressbar: ' + TRANSFORM(.n_ShowProgressbar) ) - .writeLog( C_TAB + 'l_ShowErrors: ' + TRANSFORM(.l_ShowErrors) ) - .writeLog( C_TAB + 'l_Recompile: ' + TRANSFORM(.l_Recompile) + ' (' + tcRecompile + ')' ) - .writeLog( C_TAB + 'l_NoTimestamps: ' + TRANSFORM(.l_NoTimestamps) ) - .writeLog( C_TAB + 'l_ClearUniqueID: ' + TRANSFORM(.l_ClearUniqueID) ) - .writeLog( C_TAB + 'n_UseClassPerFile: ' + TRANSFORM(.n_UseClassPerFile) ) - .writeLog( C_TAB + 'l_ClassPerFileCheck: ' + TRANSFORM(.l_ClassPerFileCheck) ) - .writeLog( C_TAB + 'l_RedirectClassPerFileToMain: ' + TRANSFORM(.l_RedirectClassPerFileToMain) ) - .writeLog( C_TAB + 'n_RedirectClassType: ' + TRANSFORM(.n_RedirectClassType) ) - .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 + 'n_OptimizeByFilestamp: ' + TRANSFORM(.n_OptimizeByFilestamp) ) - .writeLog( C_TAB + 'n_ExcludeDBFAutoincNextval: ' + TRANSFORM(.n_ExcludeDBFAutoincNextval) ) - .writeLog( C_TAB + 'l_RemoveNullCharsFromCode: ' + TRANSFORM(.l_RemoveNullCharsFromCode) ) - .writeLog( C_TAB + 'l_RemoveZOrderSetFromProps: ' + TRANSFORM(.l_RemoveZOrderSetFromProps) ) - .writeLog( C_TAB + 'l_ClearDBFLastUpdate: ' + TRANSFORM(.l_ClearDBFLastUpdate) ) - .writeLog( C_TAB + 'c_Language: ' + TRANSFORM(.c_Language) ) + Endtry - .writeLog( ) - ENDWITH && THIS - - CATCH TO loEx - loEx.UserValue = loEx.UserValue + 'lcConfigFile = [' + TRANSFORM(lcConfigFile) + ']' + CR_LF - loEx.UserValue = loEx.UserValue + 'lc_CFG_Path = [' + TRANSFORM(lc_CFG_Path) + ']' + CR_LF - loEx.UserValue = loEx.UserValue + 'lcValue = [' + TRANSFORM(lcValue) + ']' + CR_LF - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - STORE NULL TO lo_Configuration, lo_CFG, loEx - RELEASE tcDontShowProgress, tcDontShowErrors, tcNoTimestamps, tcDebug, tcRecompile, tcExtraBackupLevels ; - , tcClearUniqueID, tcOptimizeByFilestamp, tc_InputFile ; - , lcConfigFile, llExiste_CFG_EnDisco, laConfig, I, lcConfData, lcExt, lcValue, lc_CFG_Path ; - , lo_CFG, lo_Configuration, loEx - - ENDTRY - - RETURN - ENDPROC + Return + Endproc - FUNCTION comparedFilesAreEqual - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFilename1 (v! IN ) Nombre del archivo1 a comparar - * tcFilename2 (v! IN ) Nombre del archivo2 a comparar - * tcStrFileName2 (v! IN ) ***NO IMPLEMENTADO*** Contenido del archivo2 a comparar - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcFilename1, tcFilename2, tcStrFileName2 + Function comparedFilesAreEqual +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFilename1 (v! IN ) Nombre del archivo1 a comparar +* tcFilename2 (v! IN ) Nombre del archivo2 a comparar +* tcStrFileName2 (v! IN ) ***NO IMPLEMENTADO*** Contenido del archivo2 a comparar +*--------------------------------------------------------------------------------------------------- + Lparameters tcFilename1, tcFilename2, tcStrFileName2 - LOCAL lnComparacion, lnLen1, lnLen2, lnHandle1, lnHandle2, lnTipoComp, lnChunkSize ; - , loEx as Exception + Local lnComparacion, lnLen1, lnLen2, lnHandle1, lnHandle2, lnTipoComp, lnChunkSize ; + , loEx As Exception - TRY - STORE -1 TO lnComparacion, lnHandle1, lnHandle2 - lnTipoComp = 0 - lnChunkSize = 65535 + Try + Store -1 To lnComparacion, lnHandle1, lnHandle2 + lnTipoComp = 0 + lnChunkSize = 65535 - DO CASE - CASE NOT EMPTY(tcFilename1) AND NOT EMPTY(tcFilename2) - lnTipoComp = 1 - lnHandle1 = FOPEN( tcFilename1 ) + Do Case + Case Not Empty(tcFilename1) And Not Empty(tcFilename2) + lnTipoComp = 1 + lnHandle1 = Fopen( tcFilename1 ) - IF lnHandle1 = -1 - EXIT - ENDIF + If lnHandle1 = -1 + Exit + Endif - lnHandle2 = FOPEN( tcFilename2 ) + lnHandle2 = Fopen( tcFilename2 ) - IF lnHandle2 = -1 - EXIT - ENDIF + If lnHandle2 = -1 + Exit + Endif - lnLen1 = FSEEK( lnHandle1, 0, 2 ) - lnLen2 = FSEEK( lnHandle2, 0, 2 ) + lnLen1 = Fseek( lnHandle1, 0, 2 ) + lnLen2 = Fseek( lnHandle2, 0, 2 ) - *-- Comparación de tamaño - IF lnLen1 <> lnLen2 THEN - lnComparacion = 0 && Son distintos - EXIT - ENDIF +*-- Comparación de tamaño + If lnLen1 <> lnLen2 Then + lnComparacion = 0 && Son distintos + Exit + Endif - *-- Comparación de contenido - FSEEK( lnHandle1, 0, 0 ) - FSEEK( lnHandle2, 0, 0 ) +*-- Comparación de contenido + Fseek( lnHandle1, 0, 0 ) + Fseek( lnHandle2, 0, 0 ) - DO WHILE NOT ( FEOF(lnHandle1) OR FEOF(lnHandle2) ) - *IF NOT SYS( 2007, FREAD( lnHandle1, lnChunkSize ), -1, 1 ) == SYS( 2007, FREAD( lnHandle2, lnChunkSize ), -1, 1 ) THEN - IF NOT FREAD( lnHandle1, lnChunkSize ) == FREAD( lnHandle2, lnChunkSize ) THEN - lnComparacion = 0 && Son distintos - EXIT - ENDIF - ENDDO + Do While Not ( Feof(lnHandle1) Or Feof(lnHandle2) ) +*IF NOT SYS( 2007, FREAD( lnHandle1, lnChunkSize ), -1, 1 ) == SYS( 2007, FREAD( lnHandle2, lnChunkSize ), -1, 1 ) THEN + If Not Fread( lnHandle1, lnChunkSize ) == Fread( lnHandle2, lnChunkSize ) Then + lnComparacion = 0 && Son distintos + Exit + Endif + Enddo - IF lnComparacion = 0 THEN - EXIT - ENDIF + If lnComparacion = 0 Then + Exit + Endif - lnComparacion = 1 && Son iguales + lnComparacion = 1 && Son iguales - ENDCASE + Endcase - CATCH TO loEx - lnComparacion = -1 && Error - THROW + Catch To loEx + lnComparacion = -1 && Error + Throw - FINALLY - DO CASE - CASE lnTipoComp = 1 - FCLOSE( lnHandle1 ) - FCLOSE( lnHandle2 ) + Finally + Do Case + Case lnTipoComp = 1 + Fclose( lnHandle1 ) + Fclose( lnHandle2 ) - ENDCASE + Endcase - ENDTRY + Endtry - RETURN lnComparacion - ENDFUNC + Return lnComparacion + Endfunc - FUNCTION filenameFoundInFilter - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFilename (v! IN ) Nombre del archivo a evaluar - * tcFilters (v! IN ) Filtros a evaluar (*,??E.*,R*.*) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcFileName, tcFilters + Function filenameFoundInFilter +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFilename (v! IN ) Nombre del archivo a evaluar +* tcFilters (v! IN ) Filtros a evaluar (*,??E.*,R*.*) +*--------------------------------------------------------------------------------------------------- + Lparameters tcFileName, tcFilters - LOCAL llFound, laFiltros(1) - tcFileName = UPPER(tcFileName) + Local llFound, laFiltros(1) + tcFileName = Upper(tcFileName) - FOR I = 1 TO ALINES( laFiltros, tcFilters + ',', 1+4, ',' ) - IF LIKE( UPPER(laFiltros(m.I)), tcFileName ) + For I = 1 To Alines( laFiltros, tcFilters + ',', 1+4, ',' ) + If Like( Upper(laFiltros(m.I)), tcFileName ) llFound = .T. - EXIT - ENDIF - ENDFOR + Exit + Endif + Endfor - RELEASE tcFileName, tcFilters, laFiltros - RETURN llFound - ENDFUNC + Release tcFileName, tcFilters, laFiltros + Return llFound + Endfunc - PROCEDURE get_DBF_Configuration(tc_InputFile as String, to_out_DBF_CFG as Object, tlGenerateLog as Boolean) as Integer - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tc_InputFile (@! IN ) Ruta al archivo con Extensión para comprobar si tiene soporte de conversión - * to_out_DBF_CFG (@? OUT) Objeto CFG del DBF indicado, con las propiedades que contenga el CFG y sus valores - * RETORNO (v? OUT) Devuelve 0 si no existe el archivo CFG y 1 si lo encuentra - *--------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL to_out_DBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' - #ENDIF + Procedure get_DBF_Configuration(tc_InputFile As String, to_out_DBF_CFG As Object, tlGenerateLog As Boolean) As Integer +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tc_InputFile (@! IN ) Ruta al archivo con Extensión para comprobar si tiene soporte de conversión +* to_out_DBF_CFG (@? OUT) Objeto CFG del DBF indicado, con las propiedades que contenga el CFG y sus valores +* RETORNO (v? OUT) Devuelve 0 si no existe el archivo CFG y 1 si lo encuentra +*--------------------------------------------------------------------------------------------------- + #If .F. + Local to_out_DBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcTableCFG, lnFileCount, laDirFile(1,5), I, lcConfigItem + Local lcTableCFG, lnFileCount, laDirFile(1,5), I, lcConfigItem lcTableCFG = tc_InputFile + '.CFG' - lnFileCount = ADIR(laDirFile, lcTableCFG) + lnFileCount = Adir(laDirFile, lcTableCFG) - IF lnFileCount = 1 - to_out_DBF_CFG = CREATEOBJECT("CL_DBF_CFG") + If lnFileCount = 1 + to_out_DBF_CFG = Createobject("CL_DBF_CFG") - IF tlGenerateLog THEN - THIS.writeLog() - THIS.writeLog(' > Found DBF configuration file: ' + lcTableCFG) - ENDIF + If tlGenerateLog Then + This.writeLog() + This.writeLog(' > Found DBF configuration file: ' + lcTableCFG) + Endif - FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcTableCFG ), 1+4 ) - lcConfigItem = LOWER( laConfig(m.I) ) + For I = 1 To Alines( laConfig, Filetostr( lcTableCFG ), 1+4 ) + lcConfigItem = Lower( laConfig(m.I) ) - DO CASE - CASE INLIST( LEFT( lcConfigItem, 1 ), '*', '#', '/', "'" ) - LOOP + Do Case + Case Inlist( Left( lcConfigItem, 1 ), '*', '#', '/', "'" ) + Loop - CASE LEFT( lcConfigItem, 21 ) == LOWER('DBF_Conversion_Order:') - to_out_DBF_CFG.DBF_Conversion_Order = ALLTRIM( SUBSTR( laConfig(m.I), 22 ) ) - IF tlGenerateLog THEN - THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Order: ' + to_out_DBF_CFG.DBF_Conversion_Order ) - ENDIF + Case Left( lcConfigItem, 21 ) == Lower('DBF_Conversion_Order:') + to_out_DBF_CFG.DBF_Conversion_Order = Alltrim( Substr( laConfig(m.I), 22 ) ) + If tlGenerateLog Then + This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_Conversion_Order: ' + to_out_DBF_CFG.DBF_Conversion_Order ) + Endif - CASE LEFT( lcConfigItem, 25 ) == LOWER('DBF_Conversion_Condition:') - to_out_DBF_CFG.DBF_Conversion_Condition = ALLTRIM( SUBSTR( laConfig(m.I), 26 ) ) - IF tlGenerateLog THEN - THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Condition: ' + to_out_DBF_CFG.DBF_Conversion_Condition ) - ENDIF + Case Left( lcConfigItem, 25 ) == Lower('DBF_Conversion_Condition:') + to_out_DBF_CFG.DBF_Conversion_Condition = Alltrim( Substr( laConfig(m.I), 26 ) ) + If tlGenerateLog Then + This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_Conversion_Condition: ' + to_out_DBF_CFG.DBF_Conversion_Condition ) + Endif - CASE LEFT( lcConfigItem, 23 ) == LOWER('DBF_Conversion_Support:') - to_out_DBF_CFG.DBF_Conversion_Support = INT( VAL( SUBSTR( laConfig(m.I), 24 ) ) ) - IF tlGenerateLog THEN - THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Support: ' + TRANSFORM(to_out_DBF_CFG.DBF_Conversion_Support) ) - ENDIF + Case Left( lcConfigItem, 23 ) == Lower('DBF_Conversion_Support:') + to_out_DBF_CFG.DBF_Conversion_Support = Int( Val( Substr( laConfig(m.I), 24 ) ) ) + If tlGenerateLog Then + This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_Conversion_Support: ' + Transform(to_out_DBF_CFG.DBF_Conversion_Support) ) + Endif - ENDCASE - ENDFOR + Endcase + Endfor - IF tlGenerateLog THEN - THIS.writeLog() - ENDIF + If tlGenerateLog Then + This.writeLog() + Endif - ENDIF + Endif - RETURN lnFileCount - ENDPROC + Return lnFileCount + Endproc - PROCEDURE get_Ext2FromExt - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcExt (@! IN ) Extensión para comprobar si tiene soporte de conversión - * tcDir (@? IN ) Directorio del que devolver su configuración - * RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcExt, tcDir + Procedure get_Ext2FromExt +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcExt (@! IN ) Extensión para comprobar si tiene soporte de conversión +* tcDir (@? IN ) Directorio del que devolver su configuración +* RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene +*--------------------------------------------------------------------------------------------------- + Lparameters tcExt, tcDir - LOCAL lcExt2 - tcExt = UPPER(tcExt) + Local lcExt2 + tcExt = Upper(tcExt) - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF NOT EMPTY(tcDir) + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If Not Empty(tcDir) .evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' ) - ENDIF + Endif - lcExt2 = ICASE( tcExt == 'PJX', .c_PJ2 ; + lcExt2 = Icase( tcExt == 'PJX', .c_PJ2 ; , tcExt == 'VCX', .c_VC2 ; , tcExt == 'SCX', .c_SC2 ; , tcExt == 'FRX', .c_FR2 ; @@ -2701,39 +2700,39 @@ DEFINE CLASS c_foxbin2prg AS Session , tcExt == 'DBF', .c_DB2 ; , tcExt == 'DBC', .c_DC2 ; , tcExt ) - ENDWITH && THIS + Endwith && THIS - RELEASE tcExt - RETURN lcExt2 - ENDPROC + Release tcExt + Return lcExt2 + Endproc - PROCEDURE hasSupport_Bin2Prg(tcFileName as String, tcDir as String) as Boolean - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión - * tcDir (@? IN ) Directorio del que devolver su configuración - * RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene - *--------------------------------------------------------------------------------------------------- - LOCAL llhasSupport, lcExt, lcDir ; - , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' + Procedure hasSupport_Bin2Prg(tcFileName As String, tcDir As String) As Boolean +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión +* tcDir (@? IN ) Directorio del que devolver su configuración +* RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene +*--------------------------------------------------------------------------------------------------- + Local llhasSupport, lcExt, lcDir ; + , loDBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loDBF_CFG = NULL - lcExt = UPPER(JUSTEXT('.' + tcFileName)) + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loDBF_CFG = Null + lcExt = Upper(Justext('.' + tcFileName)) - IF '\' $ tcFileName AND lcExt == 'DBF' THEN - lcDir = JUSTPATH(tcFileName) + If '\' $ tcFileName And lcExt == 'DBF' Then + lcDir = Justpath(tcFileName) .get_DBF_Configuration(tcFileName, @loDBF_CFG) - ELSE + Else lcDir = tcDir - ENDIF + Endif - IF NOT EMPTY(lcDir) + If Not Empty(lcDir) .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) - ENDIF + Endif - llhasSupport = ICASE( lcExt == 'PJX', .PJX_Conversion_Support > 0 ; + llhasSupport = Icase( lcExt == 'PJX', .PJX_Conversion_Support > 0 ; , lcExt == 'VCX', .VCX_Conversion_Support > 0 ; , lcExt == 'SCX', .SCX_Conversion_Support > 0 ; , lcExt == 'FRX', .FRX_Conversion_Support > 0 ; @@ -2741,41 +2740,41 @@ DEFINE CLASS c_foxbin2prg AS Session , lcExt == 'MNX', .MNX_Conversion_Support > 0 ; , lcExt == 'FKY', .FKY_Conversion_Support > 0 ; , lcExt == 'MEM', .MEM_Conversion_Support > 0 ; - , lcExt == 'DBF', NOT ISNULL(loDBF_CFG) AND loDBF_CFG.DBF_Conversion_Support > 0 OR .DBF_Conversion_Support > 0 ; + , lcExt == 'DBF', Not Isnull(loDBF_CFG) And loDBF_CFG.DBF_Conversion_Support > 0 Or .DBF_Conversion_Support > 0 ; , lcExt == 'DBC', .DBC_Conversion_Support > 0 ; , .F. ) - ENDWITH && THIS + Endwith && THIS - RETURN llhasSupport - ENDPROC + Return llhasSupport + Endproc - PROCEDURE hasSupport_Prg2Bin(tcFileName as String, tcDir as String) as Boolean - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión - * tcDir (@? IN ) Directorio del que devolver su configuración - * RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene - *--------------------------------------------------------------------------------------------------- - LOCAL llhasSupport, lcExt, lcDir ; - , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' + Procedure hasSupport_Prg2Bin(tcFileName As String, tcDir As String) As Boolean +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión +* tcDir (@? IN ) Directorio del que devolver su configuración +* RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene +*--------------------------------------------------------------------------------------------------- + Local llhasSupport, lcExt, lcDir ; + , loDBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loDBF_CFG = NULL - lcExt = UPPER(JUSTEXT('.' + tcFileName)) + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loDBF_CFG = Null + lcExt = Upper(Justext('.' + tcFileName)) - IF '\' $ tcFileName AND lcExt == .c_DB2 THEN - lcDir = JUSTPATH(tcFileName) + If '\' $ tcFileName And lcExt == .c_DB2 Then + lcDir = Justpath(tcFileName) .get_DBF_Configuration(tcFileName, @loDBF_CFG) - ELSE + Else lcDir = tcDir - ENDIF + Endif - IF NOT EMPTY(lcDir) + If Not Empty(lcDir) .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) - ENDIF + Endif - llhasSupport = ICASE( lcExt == .c_PJ2, .PJX_Conversion_Support = 2 ; + llhasSupport = Icase( lcExt == .c_PJ2, .PJX_Conversion_Support = 2 ; , lcExt == .c_VC2, .VCX_Conversion_Support = 2 ; , lcExt == .c_SC2, .SCX_Conversion_Support = 2 ; , lcExt == .c_FR2, .FRX_Conversion_Support = 2 ; @@ -2783,1565 +2782,1566 @@ DEFINE CLASS c_foxbin2prg AS Session , lcExt == .c_MN2, .MNX_Conversion_Support = 2 ; , lcExt == .c_FK2, .FKY_Conversion_Support = 2 ; , lcExt == .c_ME2, .MEM_Conversion_Support = 2 ; - , lcExt == .c_DB2, NOT ISNULL(loDBF_CFG) AND INLIST(loDBF_CFG.DBF_Conversion_Support, 2, 8) ; - OR (INLIST(.DBF_Conversion_Support, 2, 8) ; - AND (ISNULL(loDBF_CFG) OR NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ; + , lcExt == .c_DB2, Not Isnull(loDBF_CFG) And Inlist(loDBF_CFG.DBF_Conversion_Support, 2, 8) ; + OR (Inlist(.DBF_Conversion_Support, 2, 8) ; + AND (Isnull(loDBF_CFG) Or Not Inlist(loDBF_CFG.DBF_Conversion_Support, 1, 4))) ; , lcExt == .c_DC2, .DBC_Conversion_Support = 2 ; , .F. ) - ENDWITH && THIS - - RETURN llhasSupport - ENDPROC - - - PROCEDURE conversionSupportType(tcFileName as String, tlGenerarLog as Boolean) as Integer - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión - * RETORNO (v? OUT) Devuelve el código de soporte - *--------------------------------------------------------------------------------------------------- - LOCAL lnSupportType, lcExt, lcDir, lcFilename ; - , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' - - TRY - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loDBF_CFG = NULL - lcExt = UPPER(JUSTEXT('.' + tcFileName)) - - IF '\' $ tcFileName AND INLIST(lcExt, .c_DB2, 'DBF') THEN - lcFilename = FORCEEXT(tcFileName, 'DBF') - lcDir = JUSTPATH(lcFilename) - .get_DBF_Configuration(lcFilename, @loDBF_CFG, tlGenerarLog) - ELSE - lcDir = SYS(5) + CURDIR() - ENDIF - - IF NOT EMPTY(lcDir) - .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) - ENDIF - - lnSupportType = ICASE( ; - INLIST(lcExt, .c_PJ2, 'PJX'), .PJX_Conversion_Support ; - , INLIST(lcExt, .c_VC2, 'VCX'), .VCX_Conversion_Support ; - , INLIST(lcExt, .c_SC2, 'SCX'), .SCX_Conversion_Support ; - , INLIST(lcExt, .c_FR2, 'FRX'), .FRX_Conversion_Support ; - , INLIST(lcExt, .c_LB2, 'LBX'), .LBX_Conversion_Support ; - , INLIST(lcExt, .c_MN2, 'MNX'), .MNX_Conversion_Support ; - , INLIST(lcExt, .c_FK2, 'FKY'), .FKY_Conversion_Support ; - , INLIST(lcExt, .c_ME2, 'MEM'), .MEM_Conversion_Support ; - , INLIST(lcExt, .c_DB2, 'DBF'), ICASE( ISNULL(loDBF_CFG) OR loDBF_CFG.DBF_Conversion_Support = 0, .DBF_Conversion_Support, loDBF_CFG.DBF_Conversion_Support ) ; - , INLIST(lcExt, .c_DC2, 'DBC'), .DBC_Conversion_Support ; - , 0 ) - - lnSupportType = INT(lnSupportType) - ENDWITH && THIS - - FINALLY - STORE NULL TO loDBF_CFG - RELEASE loDBF_CFG - ENDTRY - - RETURN lnSupportType - ENDPROC - - - PROCEDURE execute - *-------------------------------------------------------------------------------------------------------------- - * 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 - * - 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 - * toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) - * toEx (@? OUT) Objeto con información del error - * tlRelanzarError (v? IN ) Indica si el error debe relanzarse o no - * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar - * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) - * tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] - * Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg - * se hace desde el directorio del archivo, con lo que las referencias relativas pueden - * generar errores de compilación, típicamente los #include. - * NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar - * 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 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 ; - , toModulo, toEx AS EXCEPTION, tlRelanzarError, tcOriginalFileName, tcRecompile, tcNoTimestamps ; - , tcBackupLevels, tcClearUniqueID, tcOptimizeByFilestamp, tcCFG_File, lnVFPVersion - - TRY - LOCAL I, lcPath, lnCodError, lcFileSpec, lcFile, laFiles(1,5), laDirInfo(1,5), lcInputFile_Type, lc_OldSetNotify ; - , lnFileCount, lcErrorInfo, lcErrorFile, lnPCount, laParams(1), lnConversionOption, lnErrorIcon, llError ; - , lcOldSetEscape, lcOldOnEscape, llEscKeyRestored ; - , loEx AS EXCEPTION ; - , loCFG AS CL_CFG OF 'FOXBIN2PRG.PRG' ; - , loFSO AS Scripting.FileSystemObject ; - , loLang AS CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loFrm_Interactive AS frm_interactive OF 'FOXBIN2PRG.PRG' ; - , loFrm_Main AS frm_main OF 'FOXBIN2PRG.PRG' ; - , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' ; - , loWSH AS WScript.Shell - - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - lc_OldSetNotify = SET("Notify") - SET NOTIFY OFF - lnCodError = 0 - loLang = _SCREEN.o_FoxBin2Prg_Lang - loFSO = .o_FSO - loWSH = .o_WSH - loCFG = NULL - lnPCount = 0 - lcInputFile_Type = '' - .l_Error = .F. - tcType = UPPER( EVL(tcType,'') ) - llEscKeyRestored = .T. - lnVFPVersion = VERSION(5) - .declareDLL() - - IF THIS.l_CancelWithEscKey THEN - lcOldSetEscape = SET("Escape") - lcOldOnEscape = ON("Escape") - ON ESCAPE ERROR 1799 - SET ESCAPE ON - llEscKeyRestored = .F. - ENDIF - - DO CASE - CASE lnVFPVersion = 900 AND INT( VAL( SUBSTR( VERSION(4), RAT('.', VERSION(4)) + 1 ) ) ) < 3504 - ERROR loLang.C_INCORRECT_VFP9_VERSION__MISSING_SP1_LOC - - CASE lnVFPVersion < 900 - ERROR loLang.C_INCORRECT_VFP9_VERSION__MISSING_SP1_LOC - - CASE '\' $ tcType - ERROR loLang.C_INVALID_PARAMETER_LOC + ':' + CR_LF ; - + 'tcType = "' + tcType + '"' + CR_LF ; - + CR_LF ; - + loLang.C_ALLOWED_VALUES_ARE_LOC + ': ' + CR_LF ; - + '*, *-, -BIN2PRG, -PRG2BIN, -SHOWMSG, -SIMERR_I0, -SIMERR_I1, -SIMERR_O1' - - OTHERWISE - * OK all versions from 900(3504) and up. For VFPA Guys :) - ENDCASE - - DO CASE - CASE ATC('-SIMERR_I0','-'+tcType) > 0 - .c_SimulateError = 'SIMERR_I0' - CASE ATC('-SIMERR_I1','-'+tcType) > 0 - .c_SimulateError = 'SIMERR_I1' - CASE ATC('-SIMERR_O1','-'+tcType) > 0 - .c_SimulateError = 'SIMERR_O1' - ENDCASE - - IF .l_AutoClearProcessedFiles THEN - .clearProcessedFiles() && Para evitar acumular procesos anteriores - ENDIF - - *-- Funciona y lee los parámetros, pero no le veo un caso de uso claro, ya que si se eligen - *-- varios directorios de proyecto, la compilación será errónea. 12/12/2014 - *.readInputVFPParams( @laParams, @lnPCount ) - - *IF lnPCount > 0 THEN - * .writeLog( 'Params.Externos: ' + TRANSFORM(lnPCount,'@L ##') ) - * FOR I = 1 TO lnPCount - * .writeLog( 'Param.' + TRANSFORM(m.I,'@L ##') + ' [' + laParams(m.I) + ']' ) - * ENDFOR - * EXIT - *ENDIF - - *-- Reconocimiento de la clase indicada - *-- Ej: [c:\desa\test\library.vcx::classname] - IF '::' $ tc_InputFile THEN - tc_InputFile = STRTRAN(tc_InputFile, '::', '|') - .c_ClassOperationType = EVL( UPPER( LEFT( ALLTRIM( GETWORDNUM( tc_InputFile, 3, '|' ) ), 1) ), 'E') - .c_ClassToConvert = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 2, '|' ) ) ) - * CUIDADO!, evaluar esta última, que si no las anteriores no evalúan. - tc_InputFile = LOWER( ALLTRIM( GETWORDNUM( tc_InputFile, 1, '|' ) ) ) - ELSE - .c_ClassOperationType = '' - ENDIF - - IF VARTYPE(tcCFG_File) = "O" - * Validar el objeto - loCFG = tcCFG_File - IF NOT (loCFG.Class == PROPER('CL_CFG')) - ERROR 'CFG object: Invalid class. Please, generate it with get_DirSettings()' - ENDIF - - .c_Foxbin2prg_ConfigFile = loCFG - .n_CFG_EvaluateFromParam = 1 - - ELSE - .c_Foxbin2prg_ConfigFile = EVL( tcCFG_File, .c_Foxbin2prg_ConfigFile ) - .n_CFG_EvaluateFromParam = (IIF(EMPTY(tcCFG_File), 0, 1)) - ENDIF - - *-- Ajusto la ruta si no es absoluta - tc_InputFile = .get_AbsolutePath( tc_InputFile, .c_CurDir ) - - *-- Determino el tipo de InputFile (Archivo o Directorio) - IF EMPTY(lcInputFile_Type) AND NOT EMPTY(tc_InputFile) - DO CASE - CASE LEN(tc_InputFile) = 1 - lcInputFile_Type = C_FILETYPE_QUERYSUPPORT - - CASE ADIR(laDirInfo, tc_InputFile, "D") = 1 AND SUBSTR( laDirInfo(1,5), 5, 1 ) = "D" - *-- Ejemplo: "c:\desa\" - lcInputFile_Type = C_FILETYPE_DIRECTORY - - OTHERWISE - *-- Ejemplo: "c:\desa\*.scx", "c:\desa\file.ext", (lista de archivos) - lcInputFile_Type = C_FILETYPE_FILE - ENDCASE - ENDIF - - IF EMPTY(tcRecompile) AND NOT EMPTY(lcInputFile_Type) AND NOT lcInputFile_Type == C_FILETYPE_QUERYSUPPORT THEN - IF lcInputFile_Type == C_FILETYPE_DIRECTORY THEN - tcRecompile = tc_InputFile - ELSE - tcRecompile = JUSTPATH( tc_InputFile ) - ENDIF - ENDIF - - tcRecompile = EVL(tcRecompile,'1') - .c_Recompile = tcRecompile - - .writeLog( REPLICATE( '*', 100 ) ) - .writeLog( loLang.C_MAIN_EXECUTION_LOC, 2 ) - .writeLog( REPLICATE( '*', 100 ) ) - .writeLog( '> ' + loLang.C_EXTERNAL_PARAMETERS_LOC + ':' ) - .writeLog( C_TAB + 'tc_InputFile: ' + TRANSFORM( EVL(tc_InputFile, '(empty) -> Will use Default [' + .c_InputFile + ']' ) ) ) - .writeLog( C_TAB + 'tcType: ' + TRANSFORM( EVL(tcType, '(empty)' ) ) ) - .writeLog( C_TAB + 'tcTextName: ' + TRANSFORM( EVL(tcTextName, '(empty)' ) ) ) - .writeLog( C_TAB + 'tlGenText: ' + TRANSFORM( EVL(tlGenText, '(empty)' ) ) ) - .writeLog( C_TAB + 'tcDontShowErrors: ' + TRANSFORM( EVL(tcDontShowErrors, '(empty) -> Will use Default [' + TRANSFORM(.l_ShowErrors) + ']' ) ) ) - .writeLog( C_TAB + 'tcDebug: ' + TRANSFORM( EVL(tcDebug, '(empty) -> Will use Default [' + TRANSFORM(.n_Debug) + ']' ) ) ) - .writeLog( C_TAB + 'tcDontShowProgress: ' + TRANSFORM( EVL(tcDontShowProgress, '(empty) -> Will use Default [' + TRANSFORM(.n_ShowProgressbar) + ']' ) ) ) - .writeLog( C_TAB + 'tlRelanzarError: ' + TRANSFORM( EVL(tlRelanzarError, '(empty)' ) ) ) - .writeLog( C_TAB + 'tcOriginalFileName: ' + TRANSFORM( EVL(tcOriginalFileName, '(empty) -> Will use Default [' + .c_OriginalFileName + ']' ) ) ) - .writeLog( C_TAB + 'tcRecompile: ' + TRANSFORM( EVL(tcRecompile, '(empty) -> Will use Default [' + .c_Recompile + ']' ) ) ) - .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(.n_OptimizeByFilestamp) + ']' ) ) ) - .writeLog( ) - - *-- ARCHIVO DE CONFIGURACIÓN PRINCIPAL - .evaluateConfiguration( @tcDontShowProgress, @tcDontShowErrors, @tcNoTimestamps, @tcDebug, @tcRecompile, @tcBackupLevels ; - , @tcClearUniqueID, @tcOptimizeByFilestamp, @tc_InputFile, @lcInputFile_Type ) - - * Redefinir nombre archivo de entrada según el tipo de conversión (IMPORT/EXPORT) - IF .c_ClassOperationType = 'I' - * En el caso de importar, debo cambiar la sintaxis de tc_InputFile para poder usar - * la conversión existente de clase vc2. - * Esto deja un archivo con sintaxis "classlib.vcx::classname::import" en "classlib.classname.vc2" - IF .n_UseClassPerFile = 2 - tc_InputFile = FORCEEXT(tc_InputFile, '') + '.*.' + .c_ClassToConvert + '.' + .c_VC2 - - IF ADIR(laFiles, tc_InputFile) = 1 - tc_InputFile = FULLPATH( laFiles(1,1), tc_InputFile ) - ENDIF - - ELSE && Asumo .n_UseClassPerFile = 1 - tc_InputFile = FORCEEXT(tc_InputFile, '') + '.' + .c_ClassToConvert + '.' + .c_VC2 - - ENDIF - ENDIF - - loLang = _SCREEN.o_FoxBin2Prg_Lang - - DO CASE - CASE VERSION(5) < 900 - *-- '¡FOXBIN2PRG es solo para Visual FoxPro 9.0!' - MESSAGEBOX( loLang.C_FOXBIN2PRG_JUST_VFP_9_LOC, 0+64+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_WARN_CAPTION_LOC + ' (' + .c_Language + ')', 60000 ) - lnCodError = 1 - - CASE EMPTY(tc_InputFile) - *-- (Ejemplo de sintaxis y uso) - *MESSAGEBOX( loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC, 0+64+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_SYNTAX_INFO_LOC + ' (' + .c_Language + ')', 60000 ) - loFrm_Main = CREATEOBJECT('frm_main', THIS) - loFrm_Main.Show() - READ EVENTS - lnCodError = 0 - - OTHERWISE - *-- EJECUCIÓN NORMAL - - - IF ATC('-INTERACTIVE', ('-' + tcType)) > 0 ; - AND ATC('-BIN2PRG', ('-' + tcType)) = 0 AND ATC('-PRG2BIN', ('-' + tcType)) = 0 ; - AND lcInputFile_Type == C_FILETYPE_DIRECTORY THEN - *-- Se seleccionó un directorio y se puede elegir: Bin2Txt, Txt2Bin y Nada - .writeLog( loLang.C_INTERACTIVE_DIRECTORY_SELECTION_LOC ) - loFrm_Interactive = CREATEOBJECT('frm_interactive', THIS) - 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 - - DO CASE - CASE lnConversionOption = 1 && Bin2Txt - tcType = tcType + '-BIN2PRG' - - CASE lnConversionOption = 2 && Txt2Bin - tcType = tcType + '-PRG2BIN' - - OTHERWISE && None - ERROR 1799 && Conversion Cancelled - ENDCASE - ENDIF - - - *-- Evaluación de FileSpec de entrada - DO CASE - CASE ATC('-BIN2PRG', ('-' + tcType)) = 0 AND ATC('-PRG2BIN', ('-' + tcType)) = 0 ; - AND lcInputFile_Type == C_FILETYPE_FILE ; - AND ( '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile ) ) - - IF .l_ShowErrors - *MESSAGEBOX( 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vacíos).', 0+48+4096, 'FOXBIN2PRG: ERROR!!', 60000 ) - MESSAGEBOX( loLang.C_ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_ERROR_CAPTION_LOC, 60000 ) - EXIT - ELSE - ERROR loLang.C_ASTERISK_EXT_NOT_ALLOWED_LOC - ENDIF - - - CASE lcInputFile_Type == C_FILETYPE_FILE AND ( '*' $ JUSTSTEM( tc_InputFile ) OR '?' $ JUSTSTEM( tc_InputFile ) ) - *-- SE QUIEREN TODOS LOS ARCHIVOS DE UNA EXTENSIÓN - lcFileSpec = FULLPATH( tc_InputFile ) - .c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' - - IF .n_Debug > 0 THEN - ERASE ( .c_LogFile ) - ENDIF - - IF EVL(tcType,'0') <> '*' THEN - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - ENDIF - - DO CASE - CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) - CD (tcRecompile) - CASE tcRecompile == '1' - CD (JUSTPATH(lcFileSpec)) - ENDCASE - ENDIF - - lnFileCount = ADIR( laFiles, lcFileSpec, '', 1 ) - - FOR I = 1 TO lnFileCount - toModulo = NULL - lcFile = FORCEPATH( laFiles(m.I,1), JUSTPATH( lcFileSpec ) ) - - DO CASE - CASE UPPER( JUSTEXT( EVL(tc_InputFile,'') ) ) == 'PJX' AND LEFT(EVL(tcType,'0'),1) == '*' - *-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UNO O MÁS PROYECTOS PJX - *-- Filespec: "*.PJX", "*" - .evaluate_Full_PJX(lcFile, tcRecompile, @toModulo, @toEx, tcOriginalFileName, .c_LogFile, tcType) - - CASE UPPER( JUSTEXT( EVL(tc_InputFile,'') ) ) == .c_PJ2 AND LEFT(EVL(tcType,'0'),1) == '*' - *-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UNO O MÁS PROYECTOS PJ2 - *-- Filespec: "*.PJ2", "*" - .evaluate_Full_PJ2(lcFile, tcRecompile, @toModulo, @toEx, tcOriginalFileName, .c_LogFile, tcType) - - CASE ATC('-BIN2PRG', ('-' + tcType)) > 0 - *-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN DIRECTORIO - *-- Filespec: "*.*" - IF .hasSupport_Bin2Prg(lcFile) THEN - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) - .writeLog_Flush() - - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 - - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - llError = .T. - .l_Error = .F. - ENDCASE - ENDIF - - CASE ATC('-PRG2BIN', ('-' + tcType)) > 0 - *-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN DIRECTORIO - *-- Filespec: "*.*" - IF .hasSupport_Prg2Bin(lcFile) THEN - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) - .writeLog_Flush() - - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 - - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - llError = .T. - .l_Error = .F. - ENDCASE - ENDIF - - CASE EMPTY( JUSTEXT( EVL(tc_InputFile,'') ) ) - *-- NO SE INDICÓ NINGUNA EXTENSIÓN - ERROR loLang.C_INVALID_PARAMETER_LOC + ': cInputFile = "' + tc_InputFile + '"' - - OTHERWISE - *-- DEMÁS ARCHIVOS - *-- Filespec: "*.EXT" - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - lnCodError = .convert( lcFile, @toModulo, @toEx, .T., tcOriginalFileName ) - .writeLog_Flush() - - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 - - CASE lnCodError > 0 + Endwith && THIS + + Return llhasSupport + Endproc + + + Procedure conversionSupportType(tcFileName As String, tlGenerarLog As Boolean) As Integer +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión +* RETORNO (v? OUT) Devuelve el código de soporte +*--------------------------------------------------------------------------------------------------- + Local lnSupportType, lcExt, lcDir, lcFilename ; + , loDBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' + + Try + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loDBF_CFG = Null + lcExt = Upper(Justext('.' + tcFileName)) + + If '\' $ tcFileName And Inlist(lcExt, .c_DB2, 'DBF') Then + lcFilename = Forceext(tcFileName, 'DBF') + lcDir = Justpath(lcFilename) + .get_DBF_Configuration(lcFilename, @loDBF_CFG, tlGenerarLog) + Else + lcDir = Sys(5) + Curdir() + Endif + + If Not Empty(lcDir) + .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) + Endif + + lnSupportType = Icase( ; + INLIST(lcExt, .c_PJ2, 'PJX'), .PJX_Conversion_Support ; + , Inlist(lcExt, .c_VC2, 'VCX'), .VCX_Conversion_Support ; + , Inlist(lcExt, .c_SC2, 'SCX'), .SCX_Conversion_Support ; + , Inlist(lcExt, .c_FR2, 'FRX'), .FRX_Conversion_Support ; + , Inlist(lcExt, .c_LB2, 'LBX'), .LBX_Conversion_Support ; + , Inlist(lcExt, .c_MN2, 'MNX'), .MNX_Conversion_Support ; + , Inlist(lcExt, .c_FK2, 'FKY'), .FKY_Conversion_Support ; + , Inlist(lcExt, .c_ME2, 'MEM'), .MEM_Conversion_Support ; + , Inlist(lcExt, .c_DB2, 'DBF'), Icase( Isnull(loDBF_CFG) Or loDBF_CFG.DBF_Conversion_Support = 0, .DBF_Conversion_Support, loDBF_CFG.DBF_Conversion_Support ) ; + , Inlist(lcExt, .c_DC2, 'DBC'), .DBC_Conversion_Support ; + , 0 ) + + lnSupportType = Int(lnSupportType) + Endwith && THIS + + Finally + Store Null To loDBF_CFG + Release loDBF_CFG + Endtry + + Return lnSupportType + Endproc + + + Procedure execute +*-------------------------------------------------------------------------------------------------------------- +* 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 +* - 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 +* toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) +* toEx (@? OUT) Objeto con información del error +* tlRelanzarError (v? IN ) Indica si el error debe relanzarse o no +* tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar +* el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) +* tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] +* Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg +* se hace desde el directorio del archivo, con lo que las referencias relativas pueden +* generar errores de compilación, típicamente los #include. +* NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar +* 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 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 ; + , toModulo, toEx As Exception, tlRelanzarError, tcOriginalFileName, tcRecompile, tcNoTimestamps ; + , tcBackupLevels, tcClearUniqueID, tcOptimizeByFilestamp, tcCFG_File + + Try + Local I, lcPath, lnCodError, lcFileSpec, lcFile, laFiles(1,5), laDirInfo(1,5), lcInputFile_Type, lc_OldSetNotify ; + , lnFileCount, lcErrorInfo, lcErrorFile, lnPCount, laParams(1), lnConversionOption, lnErrorIcon, llError ; + , lcOldSetEscape, lcOldOnEscape, llEscKeyRestored ; + , loEx As Exception ; + , loCFG As CL_CFG Of 'FOXBIN2PRG.PRG' ; + , loFSO As Scripting.FileSystemObject ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loFrm_Interactive As frm_interactive Of 'FOXBIN2PRG.PRG' ; + , loFrm_Main As frm_main Of 'FOXBIN2PRG.PRG' ; + , loDBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' ; + , loWSH As WScript.Shell ; + , lnVFPVersion + + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + lc_OldSetNotify = Set("Notify") + Set Notify Off + lnCodError = 0 + loLang = _Screen.o_FoxBin2Prg_Lang + loFSO = .o_FSO + loWSH = .o_WSH + loCFG = Null + lnPCount = 0 + lcInputFile_Type = '' + .l_Error = .F. + tcType = Upper( Evl(tcType,'') ) + llEscKeyRestored = .T. + lnVFPVersion = Version(5) + .declareDLL() + + If This.l_CancelWithEscKey Then + lcOldSetEscape = Set("Escape") + lcOldOnEscape = On("Escape") + On Escape Error 1799 + Set Escape On + llEscKeyRestored = .F. + Endif + + Do Case + Case lnVFPVersion = 900 And Int( Val( Substr( Version(4), Rat('.', Version(4)) + 1 ) ) ) < 3504 + Error loLang.C_INCORRECT_VFP9_VERSION__MISSING_SP1_LOC + + Case lnVFPVersion < 900 + Error loLang.C_INCORRECT_VFP9_VERSION__MISSING_SP1_LOC + + Case '\' $ tcType + Error loLang.C_INVALID_PARAMETER_LOC + ':' + CR_LF ; + + 'tcType = "' + tcType + '"' + CR_LF ; + + CR_LF ; + + loLang.C_ALLOWED_VALUES_ARE_LOC + ': ' + CR_LF ; + + '*, *-, -BIN2PRG, -PRG2BIN, -SHOWMSG, -SIMERR_I0, -SIMERR_I1, -SIMERR_O1' + + Otherwise +* OK all versions from 900(3504) and up. For VFPA Guys :) + Endcase + + Do Case + Case Atc('-SIMERR_I0','-'+tcType) > 0 + .c_SimulateError = 'SIMERR_I0' + Case Atc('-SIMERR_I1','-'+tcType) > 0 + .c_SimulateError = 'SIMERR_I1' + Case Atc('-SIMERR_O1','-'+tcType) > 0 + .c_SimulateError = 'SIMERR_O1' + Endcase + + If .l_AutoClearProcessedFiles Then + .clearProcessedFiles() && Para evitar acumular procesos anteriores + Endif + +*-- Funciona y lee los parámetros, pero no le veo un caso de uso claro, ya que si se eligen +*-- varios directorios de proyecto, la compilación será errónea. 12/12/2014 +*.readInputVFPParams( @laParams, @lnPCount ) + +*IF lnPCount > 0 THEN +* .writeLog( 'Params.Externos: ' + TRANSFORM(lnPCount,'@L ##') ) +* FOR I = 1 TO lnPCount +* .writeLog( 'Param.' + TRANSFORM(m.I,'@L ##') + ' [' + laParams(m.I) + ']' ) +* ENDFOR +* EXIT +*ENDIF + +*-- Reconocimiento de la clase indicada +*-- Ej: [c:\desa\test\library.vcx::classname] + If '::' $ tc_InputFile Then + tc_InputFile = Strtran(tc_InputFile, '::', '|') + .c_ClassOperationType = Evl( Upper( Left( Alltrim( Getwordnum( tc_InputFile, 3, '|' ) ), 1) ), 'E') + .c_ClassToConvert = Lower( Alltrim( Getwordnum( tc_InputFile, 2, '|' ) ) ) +* CUIDADO!, evaluar esta última, que si no las anteriores no evalúan. + tc_InputFile = Lower( Alltrim( Getwordnum( tc_InputFile, 1, '|' ) ) ) + Else + .c_ClassOperationType = '' + Endif + + If Vartype(tcCFG_File) = "O" +* Validar el objeto + loCFG = tcCFG_File + If Not (loCFG.Class == Proper('CL_CFG')) + Error 'CFG object: Invalid class. Please, generate it with get_DirSettings()' + Endif + + .c_Foxbin2prg_ConfigFile = loCFG + .n_CFG_EvaluateFromParam = 1 + + Else + .c_Foxbin2prg_ConfigFile = Evl( tcCFG_File, .c_Foxbin2prg_ConfigFile ) + .n_CFG_EvaluateFromParam = (Iif(Empty(tcCFG_File), 0, 1)) + Endif + +*-- Ajusto la ruta si no es absoluta + tc_InputFile = .get_AbsolutePath( tc_InputFile, .c_CurDir ) + +*-- Determino el tipo de InputFile (Archivo o Directorio) + If Empty(lcInputFile_Type) And Not Empty(tc_InputFile) + Do Case + Case Len(tc_InputFile) = 1 + lcInputFile_Type = C_FILETYPE_QUERYSUPPORT + + Case Adir(laDirInfo, tc_InputFile, "D") = 1 And Substr( laDirInfo(1,5), 5, 1 ) = "D" +*-- Ejemplo: "c:\desa\" + lcInputFile_Type = C_FILETYPE_DIRECTORY + + Otherwise +*-- Ejemplo: "c:\desa\*.scx", "c:\desa\file.ext", (lista de archivos) + lcInputFile_Type = C_FILETYPE_FILE + Endcase + Endif + + If Empty(tcRecompile) And Not Empty(lcInputFile_Type) And Not lcInputFile_Type == C_FILETYPE_QUERYSUPPORT Then + If lcInputFile_Type == C_FILETYPE_DIRECTORY Then + tcRecompile = tc_InputFile + Else + tcRecompile = Justpath( tc_InputFile ) + Endif + Endif + + tcRecompile = Evl(tcRecompile,'1') + .c_Recompile = tcRecompile + + .writeLog( Replicate( '*', 100 ) ) + .writeLog( loLang.C_MAIN_EXECUTION_LOC, 2 ) + .writeLog( Replicate( '*', 100 ) ) + .writeLog( '> ' + loLang.C_EXTERNAL_PARAMETERS_LOC + ':' ) + .writeLog( C_TAB + 'tc_InputFile: ' + Transform( Evl(tc_InputFile, '(empty) -> Will use Default [' + .c_InputFile + ']' ) ) ) + .writeLog( C_TAB + 'tcType: ' + Transform( Evl(tcType, '(empty)' ) ) ) + .writeLog( C_TAB + 'tcTextName: ' + Transform( Evl(tcTextName, '(empty)' ) ) ) + .writeLog( C_TAB + 'tlGenText: ' + Transform( Evl(tlGenText, '(empty)' ) ) ) + .writeLog( C_TAB + 'tcDontShowErrors: ' + Transform( Evl(tcDontShowErrors, '(empty) -> Will use Default [' + Transform(.l_ShowErrors) + ']' ) ) ) + .writeLog( C_TAB + 'tcDebug: ' + Transform( Evl(tcDebug, '(empty) -> Will use Default [' + Transform(.n_Debug) + ']' ) ) ) + .writeLog( C_TAB + 'tcDontShowProgress: ' + Transform( Evl(tcDontShowProgress, '(empty) -> Will use Default [' + Transform(.n_ShowProgressbar) + ']' ) ) ) + .writeLog( C_TAB + 'tlRelanzarError: ' + Transform( Evl(tlRelanzarError, '(empty)' ) ) ) + .writeLog( C_TAB + 'tcOriginalFileName: ' + Transform( Evl(tcOriginalFileName, '(empty) -> Will use Default [' + .c_OriginalFileName + ']' ) ) ) + .writeLog( C_TAB + 'tcRecompile: ' + Transform( Evl(tcRecompile, '(empty) -> Will use Default [' + .c_Recompile + ']' ) ) ) + .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(.n_OptimizeByFilestamp) + ']' ) ) ) + .writeLog( ) + +*-- ARCHIVO DE CONFIGURACIÓN PRINCIPAL + .evaluateConfiguration( @tcDontShowProgress, @tcDontShowErrors, @tcNoTimestamps, @tcDebug, @tcRecompile, @tcBackupLevels ; + , @tcClearUniqueID, @tcOptimizeByFilestamp, @tc_InputFile, @lcInputFile_Type ) + +* Redefinir nombre archivo de entrada según el tipo de conversión (IMPORT/EXPORT) + If .c_ClassOperationType = 'I' +* En el caso de importar, debo cambiar la sintaxis de tc_InputFile para poder usar +* la conversión existente de clase vc2. +* Esto deja un archivo con sintaxis "classlib.vcx::classname::import" en "classlib.classname.vc2" + If .n_UseClassPerFile = 2 + tc_InputFile = Forceext(tc_InputFile, '') + '.*.' + .c_ClassToConvert + '.' + .c_VC2 + + If Adir(laFiles, tc_InputFile) = 1 + tc_InputFile = Fullpath( laFiles(1,1), tc_InputFile ) + Endif + + Else && Asumo .n_UseClassPerFile = 1 + tc_InputFile = Forceext(tc_InputFile, '') + '.' + .c_ClassToConvert + '.' + .c_VC2 + + Endif + Endif + + loLang = _Screen.o_FoxBin2Prg_Lang + + Do Case + Case Version(5) < 900 +*-- '¡FOXBIN2PRG es solo para Visual FoxPro 9.0!' + Messagebox( loLang.C_FOXBIN2PRG_JUST_VFP_9_LOC, 0+64+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_WARN_CAPTION_LOC + ' (' + .c_Language + ')', 60000 ) + lnCodError = 1 + + Case Empty(tc_InputFile) +*-- (Ejemplo de sintaxis y uso) +*MESSAGEBOX( loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC, 0+64+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_SYNTAX_INFO_LOC + ' (' + .c_Language + ')', 60000 ) + loFrm_Main = Createobject('frm_main', This) + loFrm_Main.Show() + Read Events + lnCodError = 0 + + Otherwise +*-- EJECUCIÓN NORMAL + + + If Atc('-INTERACTIVE', ('-' + tcType)) > 0 ; + AND Atc('-BIN2PRG', ('-' + tcType)) = 0 And Atc('-PRG2BIN', ('-' + tcType)) = 0 ; + AND lcInputFile_Type == C_FILETYPE_DIRECTORY Then +*-- Se seleccionó un directorio y se puede elegir: Bin2Txt, Txt2Bin y Nada + .writeLog( loLang.C_INTERACTIVE_DIRECTORY_SELECTION_LOC ) + loFrm_Interactive = Createobject('frm_interactive', This) + 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 + + Do Case + Case lnConversionOption = 1 && Bin2Txt + tcType = tcType + '-BIN2PRG' + + Case lnConversionOption = 2 && Txt2Bin + tcType = tcType + '-PRG2BIN' + + Otherwise && None + Error 1799 && Conversion Cancelled + Endcase + Endif + + +*-- Evaluación de FileSpec de entrada + Do Case + Case Atc('-BIN2PRG', ('-' + tcType)) = 0 And Atc('-PRG2BIN', ('-' + tcType)) = 0 ; + AND lcInputFile_Type == C_FILETYPE_FILE ; + AND ( '*' $ Justext( tc_InputFile ) Or '?' $ Justext( tc_InputFile ) ) + + If .l_ShowErrors +*MESSAGEBOX( 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vacíos).', 0+48+4096, 'FOXBIN2PRG: ERROR!!', 60000 ) + Messagebox( loLang.C_ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version + ': ' + loLang.C_FOXBIN2PRG_ERROR_CAPTION_LOC, 60000 ) + Exit + Else + Error loLang.C_ASTERISK_EXT_NOT_ALLOWED_LOC + Endif + + + Case lcInputFile_Type == C_FILETYPE_FILE And ( '*' $ Juststem( tc_InputFile ) Or '?' $ Juststem( tc_InputFile ) ) +*-- SE QUIEREN TODOS LOS ARCHIVOS DE UNA EXTENSIÓN + lcFileSpec = Fullpath( tc_InputFile ) + .c_LogFile = Addbs( Justpath( lcFileSpec ) ) + Strtran( Justfname( lcFileSpec ), '*', '_ALL' ) + '.LOG' + + If .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif + + If Evl(tcType,'0') <> '*' Then + If .n_ShowProgressbar <> 0 And .l_ProcessFiles Then + .loadProgressbarForm() + Endif + + Do Case + Case .l_Recompile And Len(tcRecompile) > 3 And Directory(tcRecompile) + Cd (tcRecompile) + Case tcRecompile == '1' + Cd (Justpath(lcFileSpec)) + Endcase + Endif + + lnFileCount = Adir( laFiles, lcFileSpec, '', 1 ) + + For I = 1 To lnFileCount + toModulo = Null + lcFile = Forcepath( laFiles(m.I,1), Justpath( lcFileSpec ) ) + + Do Case + Case Upper( Justext( Evl(tc_InputFile,'') ) ) == 'PJX' And Left(Evl(tcType,'0'),1) == '*' +*-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UNO O MÁS PROYECTOS PJX +*-- Filespec: "*.PJX", "*" + .evaluate_Full_PJX(lcFile, tcRecompile, @toModulo, @toEx, tcOriginalFileName, .c_LogFile, tcType) + + Case Upper( Justext( Evl(tc_InputFile,'') ) ) == .c_PJ2 And Left(Evl(tcType,'0'),1) == '*' +*-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UNO O MÁS PROYECTOS PJ2 +*-- Filespec: "*.PJ2", "*" + .evaluate_Full_PJ2(lcFile, tcRecompile, @toModulo, @toEx, tcOriginalFileName, .c_LogFile, tcType) + + Case Atc('-BIN2PRG', ('-' + tcType)) > 0 +*-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN DIRECTORIO +*-- Filespec: "*.*" + If .hasSupport_Bin2Prg(lcFile) Then + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) + lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) + .writeLog_Flush() + + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 + + Case lnCodError > 0 + .doWriteErrorLog( @toEx ) + llError = .T. + .l_Error = .F. + Endcase + Endif + + Case Atc('-PRG2BIN', ('-' + tcType)) > 0 +*-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN DIRECTORIO +*-- Filespec: "*.*" + If .hasSupport_Prg2Bin(lcFile) Then + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) + lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) + .writeLog_Flush() + + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 + + Case lnCodError > 0 + .doWriteErrorLog( @toEx ) + llError = .T. + .l_Error = .F. + Endcase + Endif + + Case Empty( Justext( Evl(tc_InputFile,'') ) ) +*-- NO SE INDICÓ NINGUNA EXTENSIÓN + Error loLang.C_INVALID_PARAMETER_LOC + ': cInputFile = "' + tc_InputFile + '"' + + Otherwise +*-- DEMÁS ARCHIVOS +*-- Filespec: "*.EXT" + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) + lnCodError = .convert( lcFile, @toModulo, @toEx, .T., tcOriginalFileName ) + .writeLog_Flush() + + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 + + Case lnCodError > 0 + .doWriteErrorLog( @toEx ) + Endcase + Endcase + Endfor && I = 1 TO lnFileCount + + If llError + .l_Error = .T. + Endif + + Exit + + + Case Atc('-BIN2PRG', ('-' + tcType)) > 0 + .writeLog( '> ' + loLang.C_OPTION_LOC + ': BIN2PRG' ) + + If .n_ShowProgressbar <> 0 And .l_ProcessFiles Then + .loadProgressbarForm() + .o_Frm_Avance.Caption = Strtran( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' ) + Endif + + Do Case + Case lcInputFile_Type == C_FILETYPE_DIRECTORY +*-- CONVERSION BIN2PRG DE UN DIRECTORIO Y SUBDIRECTORIOS + .writeLog( '> InputFile ' + loLang.C_IS_A_DIRECTORY_LOC ) + .writeLog() + + Do Case + Case .l_Recompile And Len(tcRecompile) > 3 And Directory(tcRecompile) + Cd (tcRecompile) + Case .l_Recompile + Cd (tc_InputFile) + Endcase + + .c_LogFile = Addbs(tc_InputFile) + tcType + '.LOG' + + If .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif + + .get_FilesFromDirectory( tc_InputFile, @laFiles, @lnFileCount ) + + For I = 1 To lnFileCount + toModulo = Null + lcFile = laFiles(m.I) + + If Not .hasSupport_Bin2Prg( lcFile ) Or Not Adir(laDirInfo, lcFile) > 0 Then + Loop + Endif + + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) + lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) +*!* Changed by: Lutz Scheffler 15.2.2021 +*!* change date="{^2021-02-15,06:57:00}" +* flushing the log after each file let us only see last file +* why ever, it should be appended, but we simply move +* .writeLog_Flush() after ENDFOR + +* .writeLog_Flush() + + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 + + Case lnCodError > 0 + .doWriteErrorLog( @toEx ) + Endcase + Endfor && I = 1 TO lnFileCount + .writeLog_Flush() +*!* /Changed by: Lutz Scheffler 15.2.2021 + + .updateProgressbar( loLang.C_END_OF_PROCESS_LOC, lnFileCount, lnFileCount, 0 ) + Exit + + Case Not .hasSupport_Bin2Prg( tc_InputFile ) Or Not Adir(laDirInfo, tc_InputFile) > 0 + .writeLog( '> InputFile ' + loLang.C_IS_UNSUPPORTED_LOC ) + .writeLog() + Exit + + Endcase + + + Case Atc('-PRG2BIN', ('-' + tcType)) > 0 + .writeLog( '> ' + loLang.C_OPTION_LOC + ': PRG2BIN' ) + + If .n_ShowProgressbar <> 0 And .l_ProcessFiles Then + .loadProgressbarForm() + .o_Frm_Avance.Caption = Strtran( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' ) + Endif + + Do Case + Case lcInputFile_Type == C_FILETYPE_DIRECTORY +*-- CONVERSION PRG2BIN DE UN DIRECTORIO Y SUBDIRECTORIOS + .writeLog( '> InputFile ' + loLang.C_IS_A_DIRECTORY_LOC ) + .writeLog() + + Do Case + Case .l_Recompile And Len(tcRecompile) > 3 And Directory(tcRecompile) + Cd (tcRecompile) + Case .l_Recompile + Cd (tc_InputFile) + Endcase + + .c_LogFile = Addbs(tc_InputFile) + tcType + '.LOG' + + If .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif + + .get_FilesFromDirectory( tc_InputFile, @laFiles, @lnFileCount ) + + + For I = 1 To lnFileCount + toModulo = Null + lcFile = laFiles(m.I) + + If Not .hasSupport_Prg2Bin( lcFile ) Or Not Adir(laDirInfo, lcFile) > 0 Then + Loop + Endif + + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) + lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) +*!* Changed by: Lutz Scheffler 15.2.2021 +*!* change date="{^2021-02-15,06:57:00}" +* flushing the log after each file let us only see last file +* why ever, it should be appended, but we simply move +* .writeLog_Flush() after ENDFOR + +* .writeLog_Flush() + + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 + + Case lnCodError > 0 + .doWriteErrorLog( @toEx ) + Endcase + Endfor && I = 1 TO lnFileCount + .writeLog_Flush() +*!* /Changed by: Lutz Scheffler 15.2.2021 + + .updateProgressbar( loLang.C_END_OF_PROCESS_LOC, lnFileCount, lnFileCount, 0 ) + Exit + + Case Not .hasSupport_Prg2Bin( tc_InputFile ) Or Not Adir(laDirInfo, tc_InputFile) > 0 + .writeLog( '> InputFile ' + loLang.C_IS_UNSUPPORTED_LOC ) + .writeLog() + Exit + + Endcase + + + Endcase + +*-- UN ARCHIVO INDIVIDUAL O CONSULTA DE SOPORTE DE ARCHIVO + If lcInputFile_Type = C_FILETYPE_QUERYSUPPORT +*-- Consulta de soporte de conversión (compatibilidad con SourceSafe) +*-- SourceSafe consulta el tipo de soporte de cada archivo antes del Checkin/Checkout +*-- para saber si se puede hacer Diff y Merge. +*-- Para los códigos de tipo de archivo ver ayuda de "Type Property" + Do Case + Case tc_InputFile == FILETYPE_DATABASE + lnCodError = .DBC_Conversion_Support + + Case tc_InputFile == FILETYPE_FREETABLE + lnCodError = .DBF_Conversion_Support + + Case tc_InputFile == FILETYPE_FORM + lnCodError = .SCX_Conversion_Support + + Case tc_InputFile == FILETYPE_LABEL + lnCodError = .LBX_Conversion_Support + + Case tc_InputFile == FILETYPE_MENU + lnCodError = .MNX_Conversion_Support + + Case tc_InputFile == FILETYPE_REPORT + lnCodError = .FRX_Conversion_Support + + Case tc_InputFile == FILETYPE_CLASSLIB + lnCodError = .VCX_Conversion_Support + + Case tc_InputFile $ FILETYPE_PROJECT && PJX (J no exite en FoxPro, es un valor inventado para evitar conflicto con los tipos existentes) + lnCodError = .PJX_Conversion_Support + + Otherwise + lnCodError = -1 && No support. + Endcase + + Else + + Do Case + Case Upper( Justext( Evl(tc_InputFile,'') ) ) == 'PJX' And Left(Evl(tcType,'0'),1) == '*' +*-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN PROYECTO PJX + .evaluate_Full_PJX(tc_InputFile, tcRecompile, @toModulo, @toEx, @tcOriginalFileName, '', tcType) + Exit + + Case Upper( Justext( Evl(tc_InputFile,'') ) ) == .c_PJ2 And Left(Evl(tcType,'0'),1) == '*' +*-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN PROYECTO PJ2 + .evaluate_Full_PJ2(tc_InputFile, tcRecompile, @toModulo, @toEx, @tcOriginalFileName, '', tcType) + Exit + + Case Inlist( Evl(tcType,'0') ; + , FILETYPE_DATABASE ; + , FILETYPE_FREETABLE ; + , FILETYPE_QUERY ; + , FILETYPE_FORM ; + , FILETYPE_REPORT ; + , FILETYPE_LABEL ; + , FILETYPE_CLASSLIB ; + , FILETYPE_PROGRAM ; + , FILETYPE_PROJECT ; + , FILETYPE_APILIB ; + , FILETYPE_APPLICATION ; + , FILETYPE_MENU ; + , FILETYPE_TEXT ; + , FILETYPE_OTHER ) ; + AND Evl(tcTextName,'0') <> '0' +*-- COMPATIBILIDAD CON SOURCESAFE. 30/01/2014 + If tlGenText + .writeLog( '> ' + loLang.C_SOURCESAFE_COMPATIBILITY_MODE_LOC + ': ' + loLang.C_BINARY_TO_TEXT_LOC ) + Else +*-- Create BINARIO desde versión TEXTO +*-- Como el archivo de entrada siempre es el binario cuando se usa SCCAPI, +*-- para regenerar el binario (tlGenText=.F.) se debe usar como +*-- archivo de entrada tcTextName en su lugar. Aquí los intercambio. + tc_InputFile = tcTextName + .l_Recompile = .T. + .writeLog( '> ' + loLang.C_SOURCESAFE_COMPATIBILITY_MODE_LOC + ': ' + loLang.C_TEXT_TO_BINARY_LOC ) + Endif + Endcase + + If Adir(laDirInfo, tc_InputFile) > 0 + If .n_ShowProgressbar <> 0 And .l_ProcessFiles Then + .loadProgressbarForm() + Endif + + .writeLog( '> InputFile ' + loLang.C_IS_A_FILE_LOC ) + .writeLog() + tc_InputFile = Locfile(tc_InputFile) + + Do Case + Case .l_Recompile And Len(tcRecompile) > 3 And Directory(tcRecompile) + Cd (tcRecompile) + Case tcRecompile == '1' + Cd (Justpath(tc_InputFile)) + Endcase + + .c_LogFile = tc_InputFile + '.LOG' + + If .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif + + lnCodError = .convert( tc_InputFile, @toModulo, @toEx, .T., tcOriginalFileName ) +*.updateProgressbar( loLang.C_END_OF_PROCESS_LOC, 1, 1, 0 ) + Endif + Endif + + Endcase + Endwith && THIS + + Catch To toEx + If Not llEscKeyRestored And This.l_CancelWithEscKey Then + If Empty(lcOldOnEscape) + On Escape + Else + On Escape &lcOldOnEscape. + Endif + + If Empty(lcOldSetEscape) + Set Escape Off + Else + Set Escape &lcOldSetEscape. + Endif + llEscKeyRestored = .T. + Endif + + lnCodError = toEx.ErrorNo + lnErrorIcon = 64 + + If Vartype(loLang) <> 'O' Then + loLang = Createobject("CL_LANG","EN") + Endif + + If lnCodError <> 1799 Then && Conversion Cancelled + toEx.UserValue = toEx.UserValue + 'FoxBin2Prg: [' + This.c_Foxbin2prg_FullPath + '] (EXE Version: ' + This.c_FB2PRG_EXE_Version + ')' + CR_LF + lnErrorIcon = 16 + Endif + + If Atc('-SHOWMSG', ('-' + tcType)) > 0 Then + If lnCodError <> 1799 Then && Conversion Cancelled + toEx.UserValue = toEx.UserValue + 'lcInputFile_Type = [' + Transform(lcInputFile_Type) + ']' + CR_LF + Endif + This.l_ShowErrors = .F. && La opción "SHOWMSG" muestra su propio mensaje + Endif + + If lnCodError <> 1799 Then && Conversion Cancelled + toEx.UserValue = toEx.UserValue + 'tc_InputFile = [' + Transform(tc_InputFile) + ']' + CR_LF + Endif + + This.doWriteErrorLog( @toEx, @lcErrorInfo ) + + If This.n_Debug > 0 Then + If _vfp.StartMode = 0 + Set Step On + Endif + Endif + + If tlRelanzarError + Throw + Endif + + Finally + If Not llEscKeyRestored And This.l_CancelWithEscKey Then + If Empty(lcOldOnEscape) + On Escape + Else + On Escape &lcOldOnEscape. + Endif + + If Empty(lcOldSetEscape) + Set Escape Off + Else + Set Escape &lcOldSetEscape. + Endif + llEscKeyRestored = .T. + Endif + + If Vartype(loLang) <> 'O' Then + loLang = Createobject("CL_LANG","EN") + Endif + + Use In (Select("TABLABIN")) + This.writeLog_Flush() + This.unloadProgressbarForm() + Cd (Justpath(This.c_CurDir)) + + Do Case + Case Evl( lcInputFile_Type, C_FILETYPE_QUERYSUPPORT ) <> C_FILETYPE_QUERYSUPPORT ; + AND Atc('-SHOWMSG', ('-' + tcType)) > 0 ; + OR This.l_ShowErrors And lnCodError > 0 And Not Isnull(toEx) + This.writeErrorLog_Flush() + + Do Case + Case lnCodError = 1098 && User Error + Messagebox( toEx.Message, 0+64+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version, 60000 ) +*loWSH.Run( THIS.c_ErrorLogFile, 3 ) + This.wscriptshell_run( This.c_ErrorLogFile, 3 ) + + Case lnCodError = 1799 && Conversion Cancelled + Messagebox( loLang.C_CONVERSION_CANCELLED_BY_USER_LOC + '!', 0+64+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version, 60000 ) + + Case This.l_Errors + If Adir(laDirInfo, This.c_ErrorLogFile) > 0 Then + Messagebox( loLang.C_END_OF_PROCESS_LOC + '! (' + loLang.C_WITH_ERRORS_LOC + ')', 0+48+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version, 60000 ) +*loWSH.Run( THIS.c_ErrorLogFile, 3 ) + This.wscriptshell_run( This.c_ErrorLogFile, 3 ) + Else + Messagebox( loLang.C_END_OF_PROCESS_LOC + '! (' + loLang.C_WITH_ERRORS_LOC + ')' + CR_LF + "[Warning: Can't show Error LOG file because does not exist!]", 0+48+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version, 60000 ) + Endif + + Otherwise + Messagebox( loLang.C_END_OF_PROCESS_LOC + '', 0+64+4096, 'FoxBin2Prg ' + This.c_FB2PRG_EXE_Version, 60000 ) + + Endcase + + Endcase + + If Empty(lnCodError) And This.l_Errors + lnCodError = 1098 + Endif + + Set Notify &lc_OldSetNotify. + Store Null To loFSO, loWSH, loDBF_CFG + Release I, lcPath, lcFileSpec, lcFile, laFiles, lnFileCount, lcErrorInfo, lcErrorFile, loEx, loFSO + Endtry + + Return lnCodError + Endproc + + + Procedure evaluate_Full_PJX +*-------------------------------------------------------------------------------------------------------------- +* SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN PROYECTO PJX +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tc_InputFile (v! IN ) Nombre del archivo de entrada +* tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] +* Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg +* se hace desde el directorio del archivo, con lo que las referencias relativas pueden +* generar errores de compilación, típicamente los #include. +* NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar +* toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) +* toEx (@? OUT) Objeto con información del error +* tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar +* el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) +* tcLogFile (v? IN ) Nombre del log a usar +* 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 +*-------------------------------------------------------------------------------------------------------------- + Lparameters tc_InputFile, tcRecompile, toModulo, toEx, tcOriginalFileName, tcLogFile, tcType + + Local lcFileSpec, lnFileCount, laFiles(1,1), lcFile, lnCodError, I, lnFileCount, llError, laDirInfo(1,5) ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loEx As Exception + + Try + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang + lcFileSpec = Fullpath( tc_InputFile ) + + If .n_ShowProgressbar <> 0 And .l_ProcessFiles Then + .loadProgressbarForm() + .o_Frm_Avance.Caption = Strtran( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' ) + Endif + + If Empty(tcLogFile) + .c_LogFile = Addbs( Justpath( lcFileSpec ) ) + Strtran( Justfname( lcFileSpec ), '*', '_ALL' ) + '.LOG' + + If .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif + Endif + + .writeLog( '> ' + loLang.C_CONVERT_ALL_FILES_IN_A_PROJECT_LOC + ': ' + loLang.C_BINARY_TO_TEXT_LOC ) + + Do Case + Case .l_Recompile And Len(tcRecompile) > 3 And Directory(tcRecompile) + Cd (tcRecompile) + Case tcRecompile == '1' + Cd (Justpath(lcFileSpec)) + Endcase + + Select 0 + Use (tc_InputFile) Shared Again Noupdate Alias TABLABIN + lnFileCount = 0 + + Scan For Not Deleted() And Type <> 'H' + lnFileCount = lnFileCount + 1 + Dimension laFiles(lnFileCount,1) + laFiles(lnFileCount,1) = .get_AbsolutePath( Alltrim( Name, 0, ' ', Chr(0) ), Addbs( Justpath( lcFileSpec ) ) ) + Endscan + + Use In (Select("TABLABIN")) + +*-- Convierto primero el proyecto + If tcType <> '*-' Then + lcFile = tc_InputFile + lnCodError = .convert( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) + .writeLog_Flush() + Endif + +*-- Luego convierto los archivos incluidos + For I = 1 To lnFileCount + lcFile = laFiles(m.I,1) + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) + + If .hasSupport_Bin2Prg( Upper(Justext(lcFile)) ) And Adir( laDirInfo, lcFile ) > 0 Then + lnCodError = .convert( lcFile, toModulo, @toEx, .F., tcOriginalFileName ) + .writeLog_Flush() + + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 + + Case lnCodError > 0 .doWriteErrorLog( @toEx ) - ENDCASE - ENDCASE - ENDFOR && I = 1 TO lnFileCount + llError = .T. + .l_Error = .F. + Endcase + Else +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If .addProcessedFile( lcFile, 'I', 'P0', 'E0', 'S0', 'X0' ) + .updateProcessedFile() + Endif + Endif - IF llError + .writeLog_Flush() + + If llError .l_Error = .T. - ENDIF + Endif + Endfor + Endwith - EXIT + Catch To loEx + Throw + + Finally + Store Null To loLang + Release loLang + Endtry + Endproc - CASE ATC('-BIN2PRG', ('-' + tcType)) > 0 - .writeLog( '> ' + loLang.C_OPTION_LOC + ': BIN2PRG' ) + Procedure evaluate_Full_PJ2 +*-------------------------------------------------------------------------------------------------------------- +* SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN PROYECTO PJ2 +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tc_InputFile (v! IN ) Nombre del archivo de entrada +* tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] +* Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg +* se hace desde el directorio del archivo, con lo que las referencias relativas pueden +* generar errores de compilación, típicamente los #include. +* NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar +* toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) +* toEx (@? OUT) Objeto con información del error +* tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar +* el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) +* tcLogFile (v? IN ) Nombre del log a usar +* 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 +*-------------------------------------------------------------------------------------------------------------- + Lparameters tc_InputFile, tcRecompile, toModulo, toEx, tcOriginalFileName, tcLogFile, tcType - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' ) - ENDIF + Local lcFileSpec, lnFileCount, laFiles(1,1), lcFile, lnCodError, I, lnFileCount, llError, laDirInfo(1,5) ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loEx As Exception - DO CASE - CASE lcInputFile_Type == C_FILETYPE_DIRECTORY - *-- CONVERSION BIN2PRG DE UN DIRECTORIO Y SUBDIRECTORIOS - .writeLog( '> InputFile ' + loLang.C_IS_A_DIRECTORY_LOC ) - .writeLog() + Try + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang + lcFileSpec = Fullpath( tc_InputFile ) - DO CASE - CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) - CD (tcRecompile) - CASE .l_Recompile - CD (tc_InputFile) - ENDCASE + If .n_ShowProgressbar <> 0 And .l_ProcessFiles Then + .loadProgressbarForm() + .o_Frm_Avance.Caption = Strtran( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' ) + Endif - .c_LogFile = ADDBS(tc_InputFile) + tcType + '.LOG' + If Empty(tcLogFile) + .c_LogFile = Addbs( Justpath( lcFileSpec ) ) + Strtran( Justfname( lcFileSpec ), '*', '_ALL' ) + '.LOG' - IF .n_Debug > 0 THEN - ERASE ( .c_LogFile ) - ENDIF + If .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif + Endif - .get_FilesFromDirectory( tc_InputFile, @laFiles, @lnFileCount ) + .writeLog( '> ' + loLang.C_CONVERT_ALL_FILES_IN_A_PROJECT_LOC + ': ' + loLang.C_TEXT_TO_BINARY_LOC ) - FOR I = 1 TO lnFileCount - toModulo = NULL - lcFile = laFiles(m.I) + Do Case + Case .l_Recompile And Len(tcRecompile) > 3 And Directory(tcRecompile) + Cd (tcRecompile) + Case tcRecompile == '1' + Cd (Justpath(lcFileSpec)) + Endcase - IF NOT .hasSupport_Bin2Prg( lcFile ) OR NOT ADIR(laDirInfo, lcFile) > 0 THEN - LOOP - ENDIF + lnFileCount = Alines( laFiles, Strextract( Filetostr(tc_InputFile), C_BUILDPROJ_I, C_BUILDPROJ_F ), 1+4 ) - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) -*!* Changed by: Lutz Scheffler 15.2.2021 -*!* change date="{^2021-02-15,06:57:00}" -* flushing the log after each file let us only see last file -* why ever, it should be appended, but we simply move -* .writeLog_Flush() after ENDFOR + For I = lnFileCount To 1 Step -1 + If '.ADD(' $ laFiles(m.I) + lcFile = .get_AbsolutePath( Strextract( laFiles(m.I), ".ADD('", "')" ), Addbs( Justpath( lcFileSpec ) ) ) + laFiles(m.I) = Forceext( lcFile, .get_Ext2FromExt( Upper(Justext(lcFile)) ) ) + Else + lnFileCount = lnFileCount - 1 + Adel( laFiles, m.I ) + Dimension laFiles(lnFileCount) + Endif + Endfor -* .writeLog_Flush() +*-- Convierto primero el proyecto + If tcType <> '*-' Then + lcFile = tc_InputFile + lnCodError = .convert( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) + .writeLog_Flush() + Endif - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 +*-- Luego convierto los archivos incluidos + For I = 1 To lnFileCount + lcFile = laFiles(m.I) + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - ENDCASE - ENDFOR && I = 1 TO lnFileCount + If .hasSupport_Prg2Bin( Upper(Justext(lcFile)) ) And Adir( laDirInfo, lcFile ) > 0 Then + lnCodError = .convert( lcFile, toModulo, @toEx, .F., tcOriginalFileName ) .writeLog_Flush() -*!* /Changed by: Lutz Scheffler 15.2.2021 - .updateProgressbar( loLang.C_END_OF_PROCESS_LOC, lnFileCount, lnFileCount, 0 ) - EXIT + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 - CASE NOT .hasSupport_Bin2Prg( tc_InputFile ) OR NOT ADIR(laDirInfo, tc_InputFile) > 0 - .writeLog( '> InputFile ' + loLang.C_IS_UNSUPPORTED_LOC ) - .writeLog() - EXIT - - ENDCASE - - - CASE ATC('-PRG2BIN', ('-' + tcType)) > 0 - .writeLog( '> ' + loLang.C_OPTION_LOC + ': PRG2BIN' ) - - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' ) - ENDIF - - DO CASE - CASE lcInputFile_Type == C_FILETYPE_DIRECTORY - *-- CONVERSION PRG2BIN DE UN DIRECTORIO Y SUBDIRECTORIOS - .writeLog( '> InputFile ' + loLang.C_IS_A_DIRECTORY_LOC ) - .writeLog() - - DO CASE - CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) - CD (tcRecompile) - CASE .l_Recompile - CD (tc_InputFile) - ENDCASE - - .c_LogFile = ADDBS(tc_InputFile) + tcType + '.LOG' - - IF .n_Debug > 0 THEN - ERASE ( .c_LogFile ) - ENDIF - - .get_FilesFromDirectory( tc_InputFile, @laFiles, @lnFileCount ) - - - FOR I = 1 TO lnFileCount - toModulo = NULL - lcFile = laFiles(m.I) - - IF NOT .hasSupport_Prg2Bin( lcFile ) OR NOT ADIR(laDirInfo, lcFile) > 0 THEN - LOOP - ENDIF - - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - lnCodError = .convert( lcFile, @toModulo, @toEx, .F., tcOriginalFileName ) -*!* Changed by: Lutz Scheffler 15.2.2021 -*!* change date="{^2021-02-15,06:57:00}" -* flushing the log after each file let us only see last file -* why ever, it should be appended, but we simply move -* .writeLog_Flush() after ENDFOR - -* .writeLog_Flush() - - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 - - CASE lnCodError > 0 + Case lnCodError > 0 .doWriteErrorLog( @toEx ) - ENDCASE - ENDFOR && I = 1 TO lnFileCount - .writeLog_Flush() -*!* /Changed by: Lutz Scheffler 15.2.2021 + llError = .T. + .l_Error = .F. + Endcase + Else +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If .addProcessedFile( lcFile, 'I', 'P0', 'E0', 'S0', 'X0' ) + .updateProcessedFile() + Endif + Endif - .updateProgressbar( loLang.C_END_OF_PROCESS_LOC, lnFileCount, lnFileCount, 0 ) - EXIT - - CASE NOT .hasSupport_Prg2Bin( tc_InputFile ) OR NOT ADIR(laDirInfo, tc_InputFile) > 0 - .writeLog( '> InputFile ' + loLang.C_IS_UNSUPPORTED_LOC ) - .writeLog() - EXIT - - ENDCASE - - - ENDCASE - - *-- UN ARCHIVO INDIVIDUAL O CONSULTA DE SOPORTE DE ARCHIVO - IF lcInputFile_Type = C_FILETYPE_QUERYSUPPORT - *-- Consulta de soporte de conversión (compatibilidad con SourceSafe) - *-- SourceSafe consulta el tipo de soporte de cada archivo antes del Checkin/Checkout - *-- para saber si se puede hacer Diff y Merge. - *-- Para los códigos de tipo de archivo ver ayuda de "Type Property" - DO CASE - CASE tc_InputFile == FILETYPE_DATABASE - lnCodError = .DBC_Conversion_Support - - CASE tc_InputFile == FILETYPE_FREETABLE - lnCodError = .DBF_Conversion_Support - - CASE tc_InputFile == FILETYPE_FORM - lnCodError = .SCX_Conversion_Support - - CASE tc_InputFile == FILETYPE_LABEL - lnCodError = .LBX_Conversion_Support - - CASE tc_InputFile == FILETYPE_MENU - lnCodError = .MNX_Conversion_Support - - CASE tc_InputFile == FILETYPE_REPORT - lnCodError = .FRX_Conversion_Support - - CASE tc_InputFile == FILETYPE_CLASSLIB - lnCodError = .VCX_Conversion_Support - - CASE tc_InputFile $ FILETYPE_PROJECT && PJX (J no exite en FoxPro, es un valor inventado para evitar conflicto con los tipos existentes) - lnCodError = .PJX_Conversion_Support - - OTHERWISE - lnCodError = -1 && No support. - ENDCASE - - ELSE - - DO CASE - CASE UPPER( JUSTEXT( EVL(tc_InputFile,'') ) ) == 'PJX' AND LEFT(EVL(tcType,'0'),1) == '*' - *-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN PROYECTO PJX - .evaluate_Full_PJX(tc_InputFile, tcRecompile, @toModulo, @toEx, @tcOriginalFileName, '', tcType) - EXIT - - CASE UPPER( JUSTEXT( EVL(tc_InputFile,'') ) ) == .c_PJ2 AND LEFT(EVL(tcType,'0'),1) == '*' - *-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN PROYECTO PJ2 - .evaluate_Full_PJ2(tc_InputFile, tcRecompile, @toModulo, @toEx, @tcOriginalFileName, '', tcType) - EXIT - - CASE INLIST( EVL(tcType,'0') ; - , FILETYPE_DATABASE ; - , FILETYPE_FREETABLE ; - , FILETYPE_QUERY ; - , FILETYPE_FORM ; - , FILETYPE_REPORT ; - , FILETYPE_LABEL ; - , FILETYPE_CLASSLIB ; - , FILETYPE_PROGRAM ; - , FILETYPE_PROJECT ; - , FILETYPE_APILIB ; - , FILETYPE_APPLICATION ; - , FILETYPE_MENU ; - , FILETYPE_TEXT ; - , FILETYPE_OTHER ) ; - AND EVL(tcTextName,'0') <> '0' - *-- COMPATIBILIDAD CON SOURCESAFE. 30/01/2014 - IF tlGenText - .writeLog( '> ' + loLang.C_SOURCESAFE_COMPATIBILITY_MODE_LOC + ': ' + loLang.C_BINARY_TO_TEXT_LOC ) - ELSE - *-- Create BINARIO desde versión TEXTO - *-- Como el archivo de entrada siempre es el binario cuando se usa SCCAPI, - *-- para regenerar el binario (tlGenText=.F.) se debe usar como - *-- archivo de entrada tcTextName en su lugar. Aquí los intercambio. - tc_InputFile = tcTextName - .l_Recompile = .T. - .writeLog( '> ' + loLang.C_SOURCESAFE_COMPATIBILITY_MODE_LOC + ': ' + loLang.C_TEXT_TO_BINARY_LOC ) - ENDIF - ENDCASE - - IF ADIR(laDirInfo, tc_InputFile) > 0 - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - ENDIF - - .writeLog( '> InputFile ' + loLang.C_IS_A_FILE_LOC ) - .writeLog() - tc_InputFile = LOCFILE(tc_InputFile) - - DO CASE - CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) - CD (tcRecompile) - CASE tcRecompile == '1' - CD (JUSTPATH(tc_InputFile)) - ENDCASE - - .c_LogFile = tc_InputFile + '.LOG' - - IF .n_Debug > 0 THEN - ERASE ( .c_LogFile ) - ENDIF - - lnCodError = .convert( tc_InputFile, @toModulo, @toEx, .T., tcOriginalFileName ) - *.updateProgressbar( loLang.C_END_OF_PROCESS_LOC, 1, 1, 0 ) - ENDIF - ENDIF - - ENDCASE - ENDWITH && THIS - - CATCH TO toEx - IF NOT llEscKeyRestored AND THIS.l_CancelWithEscKey THEN - IF EMPTY(lcOldOnEscape) - ON ESCAPE - ELSE - ON ESCAPE &lcOldOnEscape. - ENDIF - - IF EMPTY(lcOldSetEscape) - SET ESCAPE OFF - ELSE - SET ESCAPE &lcOldSetEscape. - ENDIF - llEscKeyRestored = .T. - ENDIF - - lnCodError = toEx.ERRORNO - lnErrorIcon = 64 - - IF VARTYPE(loLang) <> 'O' THEN - loLang = CREATEOBJECT("CL_LANG","EN") - ENDIF - - IF lnCodError <> 1799 THEN && Conversion Cancelled - toEx.UserValue = toEx.UserValue + 'FoxBin2Prg: [' + THIS.c_Foxbin2prg_FullPath + '] (EXE Version: ' + THIS.c_FB2PRG_EXE_Version + ')' + CR_LF - lnErrorIcon = 16 - ENDIF - - IF ATC('-SHOWMSG', ('-' + tcType)) > 0 THEN - IF lnCodError <> 1799 THEN && Conversion Cancelled - toEx.UserValue = toEx.UserValue + 'lcInputFile_Type = [' + TRANSFORM(lcInputFile_Type) + ']' + CR_LF - ENDIF - THIS.l_ShowErrors = .F. && La opción "SHOWMSG" muestra su propio mensaje - ENDIF - - IF lnCodError <> 1799 THEN && Conversion Cancelled - toEx.USERVALUE = toEx.USERVALUE + 'tc_InputFile = [' + TRANSFORM(tc_InputFile) + ']' + CR_LF - ENDIF - - THIS.doWriteErrorLog( @toEx, @lcErrorInfo ) - - IF THIS.n_Debug > 0 THEN - IF _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - ENDIF - - IF tlRelanzarError - THROW - ENDIF - - FINALLY - IF NOT llEscKeyRestored AND THIS.l_CancelWithEscKey THEN - IF EMPTY(lcOldOnEscape) - ON ESCAPE - ELSE - ON ESCAPE &lcOldOnEscape. - ENDIF - - IF EMPTY(lcOldSetEscape) - SET ESCAPE OFF - ELSE - SET ESCAPE &lcOldSetEscape. - ENDIF - llEscKeyRestored = .T. - ENDIF - - IF VARTYPE(loLang) <> 'O' THEN - loLang = CREATEOBJECT("CL_LANG","EN") - ENDIF - - USE IN (SELECT("TABLABIN")) - THIS.writeLog_Flush() - THIS.unloadProgressbarForm() - CD (JUSTPATH(THIS.c_CurDir)) - - DO CASE - CASE EVL( lcInputFile_Type, C_FILETYPE_QUERYSUPPORT ) <> C_FILETYPE_QUERYSUPPORT ; - AND ATC('-SHOWMSG', ('-' + tcType)) > 0 ; - OR THIS.l_ShowErrors AND lnCodError > 0 AND NOT ISNULL(toEx) - THIS.writeErrorLog_Flush() - - DO CASE - CASE lnCodError = 1098 && User Error - MESSAGEBOX( toEx.Message, 0+64+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version, 60000 ) - *loWSH.Run( THIS.c_ErrorLogFile, 3 ) - THIS.wscriptshell_run( THIS.c_ErrorLogFile, 3 ) - - CASE lnCodError = 1799 && Conversion Cancelled - MESSAGEBOX( loLang.C_CONVERSION_CANCELLED_BY_USER_LOC + '!', 0+64+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version, 60000 ) - - CASE THIS.l_Errors - IF ADIR(laDirInfo, THIS.c_ErrorLogFile) > 0 THEN - MESSAGEBOX( loLang.C_END_OF_PROCESS_LOC + '! (' + loLang.C_WITH_ERRORS_LOC + ')', 0+48+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version, 60000 ) - *loWSH.Run( THIS.c_ErrorLogFile, 3 ) - THIS.wscriptshell_run( THIS.c_ErrorLogFile, 3 ) - ELSE - MESSAGEBOX( loLang.C_END_OF_PROCESS_LOC + '! (' + loLang.C_WITH_ERRORS_LOC + ')' + CR_LF + "[Warning: Can't show Error LOG file because does not exist!]", 0+48+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version, 60000 ) - ENDIF - - OTHERWISE - MESSAGEBOX( loLang.C_END_OF_PROCESS_LOC + '', 0+64+4096, 'FoxBin2Prg ' + THIS.c_FB2PRG_EXE_Version, 60000 ) - - ENDCASE - - ENDCASE - - IF EMPTY(lnCodError) AND THIS.l_Errors - lnCodError = 1098 - ENDIF - - SET NOTIFY &lc_OldSetNotify. - STORE NULL TO loFSO, loWSH, loDBF_CFG - RELEASE I, lcPath, lcFileSpec, lcFile, laFiles, lnFileCount, lcErrorInfo, lcErrorFile, loEx, loFSO - ENDTRY - - RETURN lnCodError - ENDPROC - - - PROCEDURE evaluate_Full_PJX - *-------------------------------------------------------------------------------------------------------------- - * SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN PROYECTO PJX - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tc_InputFile (v! IN ) Nombre del archivo de entrada - * tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] - * Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg - * se hace desde el directorio del archivo, con lo que las referencias relativas pueden - * generar errores de compilación, típicamente los #include. - * NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar - * toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) - * toEx (@? OUT) Objeto con información del error - * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar - * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) - * tcLogFile (v? IN ) Nombre del log a usar - * 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 - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tc_InputFile, tcRecompile, toModulo, toEx, tcOriginalFileName, tcLogFile, tcType - - LOCAL lcFileSpec, lnFileCount, laFiles(1,1), lcFile, lnCodError, I, lnFileCount, llError, laDirInfo(1,5) ; - , loLang AS CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loEx as Exception - - TRY - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - lcFileSpec = FULLPATH( tc_InputFile ) - - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' ) - ENDIF - - IF EMPTY(tcLogFile) - .c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' - - IF .n_Debug > 0 THEN - ERASE ( .c_LogFile ) - ENDIF - ENDIF - - .writeLog( '> ' + loLang.C_CONVERT_ALL_FILES_IN_A_PROJECT_LOC + ': ' + loLang.C_BINARY_TO_TEXT_LOC ) - - DO CASE - CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) - CD (tcRecompile) - CASE tcRecompile == '1' - CD (JUSTPATH(lcFileSpec)) - ENDCASE - - SELECT 0 - USE (tc_InputFile) SHARED AGAIN NOUPDATE ALIAS TABLABIN - lnFileCount = 0 - - SCAN FOR NOT DELETED() AND Type <> 'H' - lnFileCount = lnFileCount + 1 - DIMENSION laFiles(lnFileCount,1) - laFiles(lnFileCount,1) = .get_AbsolutePath( ALLTRIM( NAME, 0, ' ', CHR(0) ), ADDBS( JUSTPATH( lcFileSpec ) ) ) - ENDSCAN - - USE IN (SELECT("TABLABIN")) - - *-- Convierto primero el proyecto - IF tcType <> '*-' THEN - lcFile = tc_InputFile - lnCodError = .convert( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) - .writeLog_Flush() - ENDIF - - *-- Luego convierto los archivos incluidos - FOR I = 1 TO lnFileCount - lcFile = laFiles(m.I,1) - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - - IF .hasSupport_Bin2Prg( UPPER(JUSTEXT(lcFile)) ) AND ADIR( laDirInfo, lcFile ) > 0 THEN - lnCodError = .convert( lcFile, toModulo, @toEx, .F., tcOriginalFileName ) .writeLog_Flush() - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 + If llError + .l_Error = .T. + Endif + Endfor + Endwith - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - llError = .T. - .l_Error = .F. - ENDCASE - ELSE - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF .addProcessedFile( lcFile, 'I', 'P0', 'E0', 'S0', 'X0' ) - .updateProcessedFile() - ENDIF - ENDIF + Catch To loEx + Throw - .writeLog_Flush() - - IF llError - .l_Error = .T. - ENDIF - ENDFOR - ENDWITH - - CATCH TO loEx - THROW - - FINALLY - STORE NULL TO loLang - RELEASE loLang - ENDTRY - ENDPROC + Finally + Store Null To loLang + Release loLang + Endtry + Endproc - PROCEDURE evaluate_Full_PJ2 - *-------------------------------------------------------------------------------------------------------------- - * SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN PROYECTO PJ2 - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tc_InputFile (v! IN ) Nombre del archivo de entrada - * tcRecompile (v? IN ) Indica recompilar ('1') el binario una vez regenerado. [Cambio de funcionamiento por defecto] - * Este cambio es para ganar tiempo, velocidad y seguridad. Además la recompilación que hace FoxBin2Prg - * se hace desde el directorio del archivo, con lo que las referencias relativas pueden - * generar errores de compilación, típicamente los #include. - * NOTA: Si en vez de '1' se indica un Path (p.ej, el del proyecto, se usará como base para recompilar - * toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) - * toEx (@? OUT) Objeto con información del error - * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar - * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) - * tcLogFile (v? IN ) Nombre del log a usar - * 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 - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tc_InputFile, tcRecompile, toModulo, toEx, tcOriginalFileName, tcLogFile, tcType + Hidden Procedure doWriteErrorLog + Lparameters toEx As Exception, tcErrorInfo - LOCAL lcFileSpec, lnFileCount, laFiles(1,1), lcFile, lnCodError, I, lnFileCount, llError, laDirInfo(1,5) ; - , loLang AS CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loEx as Exception + Local loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang - TRY - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - lcFileSpec = FULLPATH( tc_InputFile ) - - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' ) - ENDIF - - IF EMPTY(tcLogFile) - .c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' - - IF .n_Debug > 0 THEN - ERASE ( .c_LogFile ) - ENDIF - ENDIF - - .writeLog( '> ' + loLang.C_CONVERT_ALL_FILES_IN_A_PROJECT_LOC + ': ' + loLang.C_TEXT_TO_BINARY_LOC ) - - DO CASE - CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) - CD (tcRecompile) - CASE tcRecompile == '1' - CD (JUSTPATH(lcFileSpec)) - ENDCASE - - lnFileCount = ALINES( laFiles, STREXTRACT( FILETOSTR(tc_InputFile), C_BUILDPROJ_I, C_BUILDPROJ_F ), 1+4 ) - - FOR I = lnFileCount TO 1 STEP -1 - IF '.ADD(' $ laFiles(m.I) - lcFile = .get_AbsolutePath( STREXTRACT( laFiles(m.I), ".ADD('", "')" ), ADDBS( JUSTPATH( lcFileSpec ) ) ) - laFiles(m.I) = FORCEEXT( lcFile, .get_Ext2FromExt( UPPER(JUSTEXT(lcFile)) ) ) - ELSE - lnFileCount = lnFileCount - 1 - ADEL( laFiles, m.I ) - DIMENSION laFiles(lnFileCount) - ENDIF - ENDFOR - - *-- Convierto primero el proyecto - IF tcType <> '*-' THEN - lcFile = tc_InputFile - lnCodError = .convert( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) - .writeLog_Flush() - ENDIF - - *-- Luego convierto los archivos incluidos - FOR I = 1 TO lnFileCount - lcFile = laFiles(m.I) - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + lcFile + '...', m.I, lnFileCount, 0 ) - - IF .hasSupport_Prg2Bin( UPPER(JUSTEXT(lcFile)) ) AND ADIR( laDirInfo, lcFile ) > 0 THEN - lnCodError = .convert( lcFile, toModulo, @toEx, .F., tcOriginalFileName ) - .writeLog_Flush() - - DO CASE - CASE lnCodError = 1799 && Conversion Cancelled - ERROR 1799 - - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - llError = .T. - .l_Error = .F. - ENDCASE - ELSE - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF .addProcessedFile( lcFile, 'I', 'P0', 'E0', 'S0', 'X0' ) - .updateProcessedFile() - ENDIF - ENDIF - - .writeLog_Flush() - - IF llError - .l_Error = .T. - ENDIF - ENDFOR - ENDWITH - - CATCH TO loEx - THROW - - FINALLY - STORE NULL TO loLang - RELEASE loLang - ENDTRY - ENDPROC - - - HIDDEN PROCEDURE doWriteErrorLog - LPARAMETERS toEx as Exception, tcErrorInfo - - LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF toEx.ErrorNo = 1799 THEN && Conversion Cancelled + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If toEx.ErrorNo = 1799 Then && Conversion Cancelled tcErrorInfo = loLang.C_CONVERSION_CANCELLED_BY_USER_LOC - ELSE - tcErrorInfo = .exception2Str(@toEx) + CR_LF + loLang.C_SOURCEFILE_LOC + TRANSFORM(.c_InputFile) + CR_LF - ENDIF + Else + tcErrorInfo = .exception2Str(@toEx) + CR_LF + loLang.C_SOURCEFILE_LOC + Transform(.c_InputFile) + CR_LF + Endif - ADDPROPERTY(_SCREEN, 'ExitCode', toEx.ERRORNO) + AddProperty(_Screen, 'ExitCode', toEx.ErrorNo) - *-- Escribo la información de error en la variable log de errores - .writeErrorLog( REPLICATE('-', 100), 1 ) +*-- Escribo la información de error en la variable log de errores + .writeErrorLog( Replicate('-', 100), 1 ) .writeLog( tcErrorInfo ) .writeErrorLog( tcErrorInfo ) .writeErrorLog( ) - *-- Escribo la información de error en el archivo log de errores - TRY - STRTOFILE( tcErrorInfo, EVL( .c_InputFile, 'foxbin2prg_errorlog' ) + '.ERR' ) - CATCH - ENDTRY - ENDWITH - - RETURN - ENDPROC - - - PROTECTED PROCEDURE convert - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tc_InputFile (v! IN ) Nombre del archivo de entrada - * toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) - * toEx (@? OUT) Objeto con información del error - * tlRelanzarError (v? IN ) Indica si el error debe relanzarse o no - * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar - * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError, tcOriginalFileName - - TRY - LOCAL lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension, lnFileCount, laFiles(1,1), I ; - , ltFilestamp, lcExtA, lcExtB, laEvents(1,1), lcForceAttribs, lnIDInputFile ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loConversor as c_conversor_base OF 'FOXBIN2PRG.PRG' ; - , loFSO AS Scripting.FileSystemObject ; - , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' - lnCodError = 0 - - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loFSO = .o_FSO - loLang = _SCREEN.o_FoxBin2Prg_Lang - lcForceAttribs = '+N' - .c_InputFile = FULLPATH( tc_InputFile ) - .l_Error = .F. - lcExtension = UPPER( JUSTEXT(.c_InputFile) ) - - .writeLog( REPLICATE( '*', 100 ) ) - .writeLog( 'CONVERSION PROCESS', 2 ) - .writeLog( REPLICATE( '*', 100 ) ) - - IF ADIR( laDirFile, .c_InputFile, '', 1 ) = 0 - *ERROR 'No se encontró el archivo [' + .c_InputFile + ']' - ERROR loLang.C_FILE_NOT_FOUND_LOC + ' [' + .c_InputFile + ']' - ENDIF - - .c_InputFile = loFSO.GetAbsolutePathName( FORCEPATH( laDirFile(1,1), JUSTPATH(.c_InputFile) ) ) - - *-- VERIFICO SI HAY ARCHIVO DE CONFIGURACIÓN SECUNDARIO - .evaluateConfiguration() - - IF .n_ForceWriteIfReadOnly = 1 THEN - lcForceAttribs = lcForceAttribs + '-R' - ENDIF - - *-- OPTIMIZACIÓN VC2/SC2/DC2: VERIFICO SI EL ARCHIVO BASE FUE PROCESADO PARA DESCARTAR REPROCESOS - IF .n_UseClassPerFile > 0 AND .l_RedirectClassPerFileToMain ; - OR NOT EMPTY(.c_ClassToConvert) - - DO CASE - CASE .n_RedirectClassType = 1 OR NOT EMPTY(.c_ClassToConvert) && Redireccionar solo esta clase - IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN - lc_BaseFile = .c_InputFile - ELSE - lc_BaseFile = FORCEPATH( FORCEEXT( JUSTSTEM( JUSTSTEM(.c_InputFile) ), JUSTEXT(.c_InputFile)) , JUSTPATH(.c_InputFile) ) - ENDIF - - CASE .n_UseClassPerFile = 1 AND INLIST(lcExtension,.c_VC2,.c_SC2) - IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN - lc_BaseFile = .c_InputFile - ELSE - lc_BaseFile = FORCEPATH( FORCEEXT( JUSTSTEM( JUSTSTEM(.c_InputFile) ), JUSTEXT(.c_InputFile)) , JUSTPATH(.c_InputFile) ) - ENDIF - - *-- Verifico si se debe forzar la redirección al archivo principal - IF '.' $ JUSTSTEM(.c_InputFile) - .c_InputFile = lc_BaseFile - ENDIF - - CASE .n_UseClassPerFile = 2 AND INLIST(lcExtension,.c_VC2,.c_SC2) OR lcExtension = .c_DC2 - IF OCCURS('.', JUSTSTEM(.c_InputFile)) = 0 THEN - lc_BaseFile = .c_InputFile - ELSE - lc_BaseFile = FORCEPATH( FORCEEXT( JUSTSTEM( JUSTSTEM( JUSTSTEM(.c_InputFile) ) ), JUSTEXT(.c_InputFile)) , JUSTPATH(.c_InputFile) ) - ENDIF - - *-- Verifico si se debe forzar la redirección al archivo principal - IF '.' $ JUSTSTEM(.c_InputFile) - .c_InputFile = lc_BaseFile - ENDIF - - ENDCASE - ENDIF - - ERASE ( .c_InputFile + '.ERR' ) - - IF NOT EMPTY(tcOriginalFileName) - tcOriginalFileName = loFSO.GetAbsolutePathName( tcOriginalFileName ) - ENDIF - - .c_OriginalFileName = EVL( tcOriginalFileName, .c_InputFile ) - - IF UPPER( JUSTEXT(.c_OriginalFileName) ) = 'PJM' AND .c_PJ2 <> 'PJM' - .c_OriginalFileName = FORCEEXT(.c_OriginalFileName,'pjx') - ENDIF - - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF NOT .addProcessedFile( .c_InputFile, 'I', 'P1', 'E0', 'S1', 'X0' ) THEN - *.writeLog( 'OPTIMIZACIÓN: El archivo Base [' + JUSTFNAME(lc_BaseFile) + '] ya fue procesado, por lo que no se procesará [' + JUSTFNAME(.c_InputFile) + ']' ) - .writeLog( C_TAB + C_TAB + '* ' + TEXTMERGE( loLang.C_CLASSPERFILE_OPTIMIZATION_BASE_ALREADY_PROCESSED_LOC ) ) - EXIT - ENDIF - - *.updateProcessedFile() - lnIDInputFile = .n_ProcessedFiles - - .writeLog( C_TAB + 'c_OriginalFileName: ' + .c_OriginalFileName ) - .writeLog( ) - - IF NOT ADIR(laDirFile, .c_InputFile) > 0 THEN - ERROR loLang.C_FILE_DOESNT_EXIST_LOC + ' [' + .c_InputFile + ']' - ENDIF - - .normalizeFileCapitalization( .T. ) - - DO CASE - CASE lcExtension = 'VCX' - IF NOT INLIST(.VCX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_VC2 ) - loConversor = CREATEOBJECT( 'c_conversor_vcx_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_VC2 ), lcForceAttribs ) - - CASE lcExtension = 'SCX' - IF NOT INLIST(.SCX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_SC2 ) - loConversor = CREATEOBJECT( 'c_conversor_scx_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_SC2 ), lcForceAttribs ) - - CASE lcExtension = 'PJX' - IF NOT INLIST(.PJX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_PJ2 ) - loConversor = CREATEOBJECT( 'c_conversor_pjx_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_PJ2 ), lcForceAttribs ) - - CASE lcExtension = 'PJM' AND .c_PJ2 <> 'PJM' - IF NOT INLIST(.PJX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_PJ2 ) - loConversor = CREATEOBJECT( 'c_conversor_pjm_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_PJ2 ), lcForceAttribs ) - - CASE lcExtension = 'FRX' - IF NOT INLIST(.FRX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_FR2 ) - loConversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_FR2 ), lcForceAttribs ) - - CASE lcExtension = 'LBX' - IF NOT INLIST(.LBX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_LB2 ) - loConversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_LB2 ), lcForceAttribs ) - - CASE lcExtension = 'DBF' - lnFileCount = .get_DBF_Configuration( FORCEEXT(.c_InputFile, 'DBF'), @loDBF_CFG ) - IF NOT INLIST(.DBF_Conversion_Support, 1, 2, 4, 8) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_DB2 ) - loConversor = CREATEOBJECT( 'c_conversor_dbf_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_DB2 ), lcForceAttribs ) - - CASE lcExtension = 'DBC' - IF NOT INLIST(.DBC_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_DC2 ) - loConversor = CREATEOBJECT( 'c_conversor_dbc_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_DC2 ), lcForceAttribs ) - - CASE lcExtension = 'MNX' - IF NOT INLIST(.MNX_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_MN2 ) - loConversor = CREATEOBJECT( 'c_conversor_mnx_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_MN2 ), lcForceAttribs ) - - CASE lcExtension = 'FKY' - IF NOT INLIST(.FKY_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_FK2 ) - loConversor = CREATEOBJECT( 'c_conversor_fky_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_FK2 ), lcForceAttribs ) - - CASE lcExtension = 'MEM' - IF NOT INLIST(.MEM_Conversion_Support, 1, 2) - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, .c_ME2 ) - loConversor = CREATEOBJECT( 'c_conversor_mem_a_prg' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, .c_ME2 ), lcForceAttribs ) - - CASE lcExtension = .c_VC2 - IF .VCX_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - IF EMPTY(.c_ClassToConvert) - .c_OutputFile = FORCEEXT( .c_InputFile, 'VCX' ) - ELSE - * Si se usó la sintaxis "classlib.vcx::clase::import", se define el OutputFile - * con la Base "classlib.vcx" y no con el archivo entero. - .c_OutputFile = FORCEEXT( lc_BaseFile, 'VCX' ) - ENDIF - loConversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'VCX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'VCT' ), lcForceAttribs ) - - CASE lcExtension = .c_SC2 - IF .SCX_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'SCX' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_scx' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'SCX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'SCT' ), lcForceAttribs ) - - CASE lcExtension = .c_PJ2 - IF .PJX_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'PJX' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_pjx' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'PJX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'PJT' ), lcForceAttribs ) - - CASE lcExtension = .c_FR2 - IF .FRX_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'FRX' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_frx' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'FRX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'FRT' ), lcForceAttribs ) - - CASE lcExtension = .c_LB2 - IF .LBX_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'LBX' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_frx' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'LBX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'LBT' ), lcForceAttribs ) - - CASE lcExtension = .c_DB2 - IF INLIST(.DBF_Conversion_Support, 2, 8) OR ADIR(laDirFile, FORCEEXT(.c_InputFile, 'DBF') + '.CFG') = 1 THEN - *-- Soporte txt-2-bin habilitado - ELSE - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'DBF' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_dbf' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'DBF' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'FPT' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'CDX' ), lcForceAttribs ) - - CASE lcExtension = .c_DC2 - IF .DBC_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'DBC' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_dbc' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'DBC' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'DCX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'DCT' ), lcForceAttribs ) - - CASE lcExtension = .c_MN2 - IF .MNX_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'MNX' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_mnx' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'MNX' ), lcForceAttribs ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'MNT' ), lcForceAttribs ) - - CASE lcExtension = .c_FK2 - IF .FKY_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'FKY' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_fky' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'FKY' ), lcForceAttribs ) - - CASE lcExtension = .c_ME2 - IF .MEM_Conversion_Support <> 2 - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDIF - .c_OutputFile = FORCEEXT( .c_InputFile, 'MEM' ) - loConversor = CREATEOBJECT( 'c_conversor_prg_a_mem' ) - .changeFileAttribute( FORCEEXT( .c_InputFile, 'MEM' ), lcForceAttribs ) - - OTHERWISE - *ERROR 'El archivo [' + .c_InputFile + '] no está soportado' - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - - ENDCASE - - *-- Optimización: Comparación de los timestamps de InputFile y OutputFile para saber - *-- si el OutputFile se debe regenerar o no. - lnFileCount = ADIR( laFiles, FORCEEXT( .c_InputFile, '*' ), '', 1 ) - STORE {//::} TO .t_InputFile_TimeStamp, .t_OutputFile_TimeStamp, ltFilestamp - - IF lnFileCount > 0 THEN - *-- Busca el archivo de entrada original - I = ASCAN( laFiles, JUSTFNAME(.c_InputFile), 1, 0, 1, 1+2+4+8 ) - IF m.I > 0 THEN - .t_InputFile_TimeStamp = DATETIME( YEAR(laFiles(m.I,3)), MONTH(laFiles(m.I,3)), DAY(laFiles(m.I,3)) ; - , VAL(LEFT(laFiles(m.I,4),2)), VAL(SUBSTR(laFiles(m.I,4),4,2)), VAL(RIGHT(laFiles(m.I,4),2)) ) - ENDIF - - IF ADIR( laDirFile, .c_OutputFile ) > 0 THEN - I = ASCAN( laFiles, JUSTFNAME(.c_OutputFile), 1, 0, 1, 1+2+4+8 ) - IF m.I > 0 THEN - .t_OutputFile_TimeStamp = DATETIME( YEAR(laFiles(m.I,3)), MONTH(laFiles(m.I,3)), DAY(laFiles(m.I,3)) ; - , VAL(LEFT(laFiles(m.I,4),2)), VAL(SUBSTR(laFiles(m.I,4),4,2)), VAL(RIGHT(laFiles(m.I,4),2)) ) - ENDIF - - lcExtA = UPPER(JUSTEXT(.c_OutputFile)) - - DO CASE - CASE INLIST(lcExtA, 'SCX', 'VCX', 'MNX', 'FRX', 'LBX') - lcExtB = ICASE(lcExtA = 'SCX', 'SCT' ; - , lcExtA = 'VCX', 'VCT' ; - , lcExtA = 'MNX', 'MNT' ; - , lcExtA = 'FRX', 'FRT' ; - , lcExtA = 'LBX', 'LBT') - I = ASCAN( laFiles, JUSTFNAME( FORCEEXT(.c_OutputFile, lcExtB) ), 1, 0, 1, 1+2+4+8 ) - IF m.I > 0 THEN - ltFilestamp = DATETIME( YEAR(laFiles(m.I,3)), MONTH(laFiles(m.I,3)), DAY(laFiles(m.I,3)) ; - , VAL(LEFT(laFiles(m.I,4),2)), VAL(SUBSTR(laFiles(m.I,4),4,2)), VAL(RIGHT(laFiles(m.I,4),2)) ) - ENDIF - - 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_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_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) ) - - OTHERWISE - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) - loConversor.c_InputFile = .c_InputFile - loConversor.c_OutputFile = .c_OutputFile - loConversor.c_LogFile = .c_LogFile - loConversor.n_Debug = .n_Debug - loConversor.l_Test = .l_Test - loConversor.n_FB2PRG_Version = .n_FB2PRG_Version - loConversor.l_MethodSort_Enabled = .l_MethodSort_Enabled - loConversor.l_PropSort_Enabled = .l_PropSort_Enabled - loConversor.l_ReportSort_Enabled = .l_ReportSort_Enabled - loConversor.c_OriginalFileName = .c_OriginalFileName - loConversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath - *-- - .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + .c_InputFile + '...', 0, 0, 0 ) - - IF AEVENTS( laEvents, loConversor ) = 0 THEN - BINDEVENT( loConversor, 'updateProgressbar', THIS, 'updateProgressbar' ) - ENDIF - - loConversor.convert( @toModulo, .F., THIS ) - - IF loConversor.l_Error THEN - .l_Error = .T. - ENDIF - - .n_ProcessedFilesCount = .n_ProcessedFilesCount + 1 - .writeLog() - .writeLog(loConversor.c_TextLog) && Recojo el LOG que haya generado el conversor - - *-- Logueo los errores - IF NOT EMPTY(loConversor.c_TextErr) THEN - .writeErrorLog( REPLICATE( '-', 100 ), 1 ) - .writeErrorLog( loLang.C_ERRORS_FOUND_IN_FILE_LOC + ' [' + .c_InputFile + '] ' ) - .writeErrorLog( loConversor.c_TextErr ) - .writeErrorLog( ) - ENDIF - ENDCASE - - .normalizeFileCapitalization() - ENDWITH && THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - - CATCH TO toEx - lnCodError = toEx.ERRORNO - *lcErrorInfo = THIS.exception2Str(toEx) + CR_LF + CR_LF + loLang.C_SOURCEFILE_LOC + THIS.c_InputFile - - *-- updateProcessedFile( tcProcessed, tcHasErrors, tcSupported, tcReserved ) - THIS.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) - - IF THIS.n_Debug > 0 THEN - IF _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - ENDIF - IF tlRelanzarError && Usado en Unit Testing - THROW - ENDIF - - FINALLY - IF AEVENTS( laEvents, loConversor ) > 0 THEN - UNBINDEVENTS( loConversor ) - ENDIF - - STORE NULL TO loConversor, loFSO - - IF lnCodError = 0 AND THIS.l_Error THEN - THIS.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) - ELSE - *THIS.updateProcessedFile( lnIDInputFile ) - ENDIF - - RELEASE lcErrorInfo, laDirFile, lcExtension, lnFileCount, laFiles, I ; - , ltFilestamp, lcExtA, lcExtB ; - , loConversor, loFSO - ENDTRY - - RETURN lnCodError - 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 - - IF NOT EMPTY(tcDir) - THIS.evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' ) - ENDIF - - IF THIS.n_CFG_Actual = 0 THEN - loCFG = NULL - ELSE - loCFG = THIS.o_Configuration(THIS.n_CFG_Actual) - ENDIF - - IF ISNULL(loCFG) THEN - loCFG = CREATEOBJECT('CL_CFG') - loCFG.CopyFrom(THIS) - ENDIF - - RETURN loCFG - ENDPROC - - - PROCEDURE get_PROGRAM_HEADER - LOCAL lcText +*-- Escribo la información de error en el archivo log de errores + Try + Strtofile( tcErrorInfo, Evl( .c_InputFile, 'foxbin2prg_errorlog' ) + '.ERR' ) + Catch + Endtry + Endwith + + Return + Endproc + + + Protected Procedure convert +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tc_InputFile (v! IN ) Nombre del archivo de entrada +* toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) +* toEx (@? OUT) Objeto con información del error +* tlRelanzarError (v? IN ) Indica si el error debe relanzarse o no +* tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar +* el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) +*-------------------------------------------------------------------------------------------------------------- + Lparameters tc_InputFile, toModulo, toEx As Exception, tlRelanzarError, tcOriginalFileName + + Try + Local lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension, lnFileCount, laFiles(1,1), I ; + , ltFilestamp, lcExtA, lcExtB, laEvents(1,1), lcForceAttribs, lnIDInputFile ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loConversor As c_conversor_base Of 'FOXBIN2PRG.PRG' ; + , loFSO As Scripting.FileSystemObject ; + , loDBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' + lnCodError = 0 + + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loFSO = .o_FSO + loLang = _Screen.o_FoxBin2Prg_Lang + lcForceAttribs = '+N' + .c_InputFile = Fullpath( tc_InputFile ) + .l_Error = .F. + lcExtension = Upper( Justext(.c_InputFile) ) + + .writeLog( Replicate( '*', 100 ) ) + .writeLog( 'CONVERSION PROCESS', 2 ) + .writeLog( Replicate( '*', 100 ) ) + + If Adir( laDirFile, .c_InputFile, '', 1 ) = 0 +*ERROR 'No se encontró el archivo [' + .c_InputFile + ']' + Error loLang.C_FILE_NOT_FOUND_LOC + ' [' + .c_InputFile + ']' + Endif + + .c_InputFile = loFSO.GetAbsolutePathName( Forcepath( laDirFile(1,1), Justpath(.c_InputFile) ) ) + +*-- VERIFICO SI HAY ARCHIVO DE CONFIGURACIÓN SECUNDARIO + .evaluateConfiguration() + + If .n_ForceWriteIfReadOnly = 1 Then + lcForceAttribs = lcForceAttribs + '-R' + Endif + +*-- OPTIMIZACIÓN VC2/SC2/DC2: VERIFICO SI EL ARCHIVO BASE FUE PROCESADO PARA DESCARTAR REPROCESOS + If .n_UseClassPerFile > 0 And .l_RedirectClassPerFileToMain ; + OR Not Empty(.c_ClassToConvert) + + Do Case + Case .n_RedirectClassType = 1 Or Not Empty(.c_ClassToConvert) && Redireccionar solo esta clase + If Occurs('.', Juststem(.c_InputFile)) = 0 Then + lc_BaseFile = .c_InputFile + Else + lc_BaseFile = Forcepath( Forceext( Juststem( Juststem(.c_InputFile) ), Justext(.c_InputFile)) , Justpath(.c_InputFile) ) + Endif + + Case .n_UseClassPerFile = 1 And Inlist(lcExtension,.c_VC2,.c_SC2) + If Occurs('.', Juststem(.c_InputFile)) = 0 Then + lc_BaseFile = .c_InputFile + Else + lc_BaseFile = Forcepath( Forceext( Juststem( Juststem(.c_InputFile) ), Justext(.c_InputFile)) , Justpath(.c_InputFile) ) + Endif + +*-- Verifico si se debe forzar la redirección al archivo principal + If '.' $ Juststem(.c_InputFile) + .c_InputFile = lc_BaseFile + Endif + + Case .n_UseClassPerFile = 2 And Inlist(lcExtension,.c_VC2,.c_SC2) Or lcExtension = .c_DC2 + If Occurs('.', Juststem(.c_InputFile)) = 0 Then + lc_BaseFile = .c_InputFile + Else + lc_BaseFile = Forcepath( Forceext( Juststem( Juststem( Juststem(.c_InputFile) ) ), Justext(.c_InputFile)) , Justpath(.c_InputFile) ) + Endif + +*-- Verifico si se debe forzar la redirección al archivo principal + If '.' $ Juststem(.c_InputFile) + .c_InputFile = lc_BaseFile + Endif + + Endcase + Endif + + Erase ( .c_InputFile + '.ERR' ) + + If Not Empty(tcOriginalFileName) + tcOriginalFileName = loFSO.GetAbsolutePathName( tcOriginalFileName ) + Endif + + .c_OriginalFileName = Evl( tcOriginalFileName, .c_InputFile ) + + If Upper( Justext(.c_OriginalFileName) ) = 'PJM' And .c_PJ2 <> 'PJM' + .c_OriginalFileName = Forceext(.c_OriginalFileName,'pjx') + Endif + +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If Not .addProcessedFile( .c_InputFile, 'I', 'P1', 'E0', 'S1', 'X0' ) Then +*.writeLog( 'OPTIMIZACIÓN: El archivo Base [' + JUSTFNAME(lc_BaseFile) + '] ya fue procesado, por lo que no se procesará [' + JUSTFNAME(.c_InputFile) + ']' ) + .writeLog( C_TAB + C_TAB + '* ' + Textmerge( loLang.C_CLASSPERFILE_OPTIMIZATION_BASE_ALREADY_PROCESSED_LOC ) ) + Exit + Endif + +*.updateProcessedFile() + lnIDInputFile = .n_ProcessedFiles + + .writeLog( C_TAB + 'c_OriginalFileName: ' + .c_OriginalFileName ) + .writeLog( ) + + If Not Adir(laDirFile, .c_InputFile) > 0 Then + Error loLang.C_FILE_DOESNT_EXIST_LOC + ' [' + .c_InputFile + ']' + Endif + + .normalizeFileCapitalization( .T. ) + + Do Case + Case lcExtension = 'VCX' + If Not Inlist(.VCX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_VC2 ) + loConversor = Createobject( 'c_conversor_vcx_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_VC2 ), lcForceAttribs ) + + Case lcExtension = 'SCX' + If Not Inlist(.SCX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_SC2 ) + loConversor = Createobject( 'c_conversor_scx_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_SC2 ), lcForceAttribs ) + + Case lcExtension = 'PJX' + If Not Inlist(.PJX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_PJ2 ) + loConversor = Createobject( 'c_conversor_pjx_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_PJ2 ), lcForceAttribs ) + + Case lcExtension = 'PJM' And .c_PJ2 <> 'PJM' + If Not Inlist(.PJX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_PJ2 ) + loConversor = Createobject( 'c_conversor_pjm_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_PJ2 ), lcForceAttribs ) + + Case lcExtension = 'FRX' + If Not Inlist(.FRX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_FR2 ) + loConversor = Createobject( 'c_conversor_frx_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_FR2 ), lcForceAttribs ) + + Case lcExtension = 'LBX' + If Not Inlist(.LBX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_LB2 ) + loConversor = Createobject( 'c_conversor_frx_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_LB2 ), lcForceAttribs ) + + Case lcExtension = 'DBF' + lnFileCount = .get_DBF_Configuration( Forceext(.c_InputFile, 'DBF'), @loDBF_CFG ) + If Not Inlist(.DBF_Conversion_Support, 1, 2, 4, 8) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_DB2 ) + loConversor = Createobject( 'c_conversor_dbf_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_DB2 ), lcForceAttribs ) + + Case lcExtension = 'DBC' + If Not Inlist(.DBC_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_DC2 ) + loConversor = Createobject( 'c_conversor_dbc_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_DC2 ), lcForceAttribs ) + + Case lcExtension = 'MNX' + If Not Inlist(.MNX_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_MN2 ) + loConversor = Createobject( 'c_conversor_mnx_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_MN2 ), lcForceAttribs ) + + Case lcExtension = 'FKY' + If Not Inlist(.FKY_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_FK2 ) + loConversor = Createobject( 'c_conversor_fky_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_FK2 ), lcForceAttribs ) + + Case lcExtension = 'MEM' + If Not Inlist(.MEM_Conversion_Support, 1, 2) + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, .c_ME2 ) + loConversor = Createobject( 'c_conversor_mem_a_prg' ) + .changeFileAttribute( Forceext( .c_InputFile, .c_ME2 ), lcForceAttribs ) + + Case lcExtension = .c_VC2 + If .VCX_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + If Empty(.c_ClassToConvert) + .c_OutputFile = Forceext( .c_InputFile, 'VCX' ) + Else +* Si se usó la sintaxis "classlib.vcx::clase::import", se define el OutputFile +* con la Base "classlib.vcx" y no con el archivo entero. + .c_OutputFile = Forceext( lc_BaseFile, 'VCX' ) + Endif + loConversor = Createobject( 'c_conversor_prg_a_vcx' ) + .changeFileAttribute( Forceext( .c_InputFile, 'VCX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'VCT' ), lcForceAttribs ) + + Case lcExtension = .c_SC2 + If .SCX_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'SCX' ) + loConversor = Createobject( 'c_conversor_prg_a_scx' ) + .changeFileAttribute( Forceext( .c_InputFile, 'SCX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'SCT' ), lcForceAttribs ) + + Case lcExtension = .c_PJ2 + If .PJX_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'PJX' ) + loConversor = Createobject( 'c_conversor_prg_a_pjx' ) + .changeFileAttribute( Forceext( .c_InputFile, 'PJX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'PJT' ), lcForceAttribs ) + + Case lcExtension = .c_FR2 + If .FRX_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'FRX' ) + loConversor = Createobject( 'c_conversor_prg_a_frx' ) + .changeFileAttribute( Forceext( .c_InputFile, 'FRX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'FRT' ), lcForceAttribs ) + + Case lcExtension = .c_LB2 + If .LBX_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'LBX' ) + loConversor = Createobject( 'c_conversor_prg_a_frx' ) + .changeFileAttribute( Forceext( .c_InputFile, 'LBX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'LBT' ), lcForceAttribs ) + + Case lcExtension = .c_DB2 + If Inlist(.DBF_Conversion_Support, 2, 8) Or Adir(laDirFile, Forceext(.c_InputFile, 'DBF') + '.CFG') = 1 Then +*-- Soporte txt-2-bin habilitado + Else + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'DBF' ) + loConversor = Createobject( 'c_conversor_prg_a_dbf' ) + .changeFileAttribute( Forceext( .c_InputFile, 'DBF' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'FPT' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'CDX' ), lcForceAttribs ) + + Case lcExtension = .c_DC2 + If .DBC_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'DBC' ) + loConversor = Createobject( 'c_conversor_prg_a_dbc' ) + .changeFileAttribute( Forceext( .c_InputFile, 'DBC' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'DCX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'DCT' ), lcForceAttribs ) + + Case lcExtension = .c_MN2 + If .MNX_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'MNX' ) + loConversor = Createobject( 'c_conversor_prg_a_mnx' ) + .changeFileAttribute( Forceext( .c_InputFile, 'MNX' ), lcForceAttribs ) + .changeFileAttribute( Forceext( .c_InputFile, 'MNT' ), lcForceAttribs ) + + Case lcExtension = .c_FK2 + If .FKY_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'FKY' ) + loConversor = Createobject( 'c_conversor_prg_a_fky' ) + .changeFileAttribute( Forceext( .c_InputFile, 'FKY' ), lcForceAttribs ) + + Case lcExtension = .c_ME2 + If .MEM_Conversion_Support <> 2 + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endif + .c_OutputFile = Forceext( .c_InputFile, 'MEM' ) + loConversor = Createobject( 'c_conversor_prg_a_mem' ) + .changeFileAttribute( Forceext( .c_InputFile, 'MEM' ), lcForceAttribs ) + + Otherwise +*ERROR 'El archivo [' + .c_InputFile + '] no está soportado' + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + + Endcase + +*-- Optimización: Comparación de los timestamps de InputFile y OutputFile para saber +*-- si el OutputFile se debe regenerar o no. + lnFileCount = Adir( laFiles, Forceext( .c_InputFile, '*' ), '', 1 ) + Store {//::} To .t_InputFile_TimeStamp, .t_OutputFile_TimeStamp, ltFilestamp + + If lnFileCount > 0 Then +*-- Busca el archivo de entrada original + I = Ascan( laFiles, Justfname(.c_InputFile), 1, 0, 1, 1+2+4+8 ) + If m.I > 0 Then + .t_InputFile_TimeStamp = Datetime( Year(laFiles(m.I,3)), Month(laFiles(m.I,3)), Day(laFiles(m.I,3)) ; + , Val(Left(laFiles(m.I,4),2)), Val(Substr(laFiles(m.I,4),4,2)), Val(Right(laFiles(m.I,4),2)) ) + Endif + + If Adir( laDirFile, .c_OutputFile ) > 0 Then + I = Ascan( laFiles, Justfname(.c_OutputFile), 1, 0, 1, 1+2+4+8 ) + If m.I > 0 Then + .t_OutputFile_TimeStamp = Datetime( Year(laFiles(m.I,3)), Month(laFiles(m.I,3)), Day(laFiles(m.I,3)) ; + , Val(Left(laFiles(m.I,4),2)), Val(Substr(laFiles(m.I,4),4,2)), Val(Right(laFiles(m.I,4),2)) ) + Endif + + lcExtA = Upper(Justext(.c_OutputFile)) + + Do Case + Case Inlist(lcExtA, 'SCX', 'VCX', 'MNX', 'FRX', 'LBX') + lcExtB = Icase(lcExtA = 'SCX', 'SCT' ; + , lcExtA = 'VCX', 'VCT' ; + , lcExtA = 'MNX', 'MNT' ; + , lcExtA = 'FRX', 'FRT' ; + , lcExtA = 'LBX', 'LBT') + I = Ascan( laFiles, Justfname( Forceext(.c_OutputFile, lcExtB) ), 1, 0, 1, 1+2+4+8 ) + If m.I > 0 Then + ltFilestamp = Datetime( Year(laFiles(m.I,3)), Month(laFiles(m.I,3)), Day(laFiles(m.I,3)) ; + , Val(Left(laFiles(m.I,4),2)), Val(Substr(laFiles(m.I,4),4,2)), Val(Right(laFiles(m.I,4),2)) ) + Endif + + 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_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_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) ) + + Otherwise + .c_Type = Upper(Justext(.c_OutputFile)) + loConversor.c_InputFile = .c_InputFile + loConversor.c_OutputFile = .c_OutputFile + loConversor.c_LogFile = .c_LogFile + loConversor.n_Debug = .n_Debug + loConversor.l_Test = .l_Test + loConversor.n_FB2PRG_Version = .n_FB2PRG_Version + loConversor.l_MethodSort_Enabled = .l_MethodSort_Enabled + loConversor.l_PropSort_Enabled = .l_PropSort_Enabled + loConversor.l_ReportSort_Enabled = .l_ReportSort_Enabled + loConversor.c_OriginalFileName = .c_OriginalFileName + loConversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath +*-- + .updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + .c_InputFile + '...', 0, 0, 0 ) + + If Aevents( laEvents, loConversor ) = 0 Then + Bindevent( loConversor, 'updateProgressbar', This, 'updateProgressbar' ) + Endif + + loConversor.convert( @toModulo, .F., This ) + + If loConversor.l_Error Then + .l_Error = .T. + Endif + + .n_ProcessedFilesCount = .n_ProcessedFilesCount + 1 + .writeLog() + .writeLog(loConversor.c_TextLog) && Recojo el LOG que haya generado el conversor + +*-- Logueo los errores + If Not Empty(loConversor.c_TextErr) Then + .writeErrorLog( Replicate( '-', 100 ), 1 ) + .writeErrorLog( loLang.C_ERRORS_FOUND_IN_FILE_LOC + ' [' + .c_InputFile + '] ' ) + .writeErrorLog( loConversor.c_TextErr ) + .writeErrorLog( ) + Endif + Endcase + + .normalizeFileCapitalization() + Endwith && THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + + Catch To toEx + lnCodError = toEx.ErrorNo +*lcErrorInfo = THIS.exception2Str(toEx) + CR_LF + CR_LF + loLang.C_SOURCEFILE_LOC + THIS.c_InputFile + +*-- updateProcessedFile( tcProcessed, tcHasErrors, tcSupported, tcReserved ) + This.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) + + If This.n_Debug > 0 Then + If _vfp.StartMode = 0 + Set Step On + Endif + Endif + If tlRelanzarError && Usado en Unit Testing + Throw + Endif + + Finally + If Aevents( laEvents, loConversor ) > 0 Then + Unbindevents( loConversor ) + Endif + + Store Null To loConversor, loFSO + + If lnCodError = 0 And This.l_Error Then + This.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) + Else +*THIS.updateProcessedFile( lnIDInputFile ) + Endif + + Release lcErrorInfo, laDirFile, lcExtension, lnFileCount, laFiles, I ; + , ltFilestamp, lcExtA, lcExtB ; + , loConversor, loFSO + Endtry + + Return lnCodError + 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 + + If Not Empty(tcDir) + This.evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' ) + Endif + + If This.n_CFG_Actual = 0 Then + loCFG = Null + Else + loCFG = This.o_Configuration(This.n_CFG_Actual) + Endif + + If Isnull(loCFG) Then + loCFG = Createobject('CL_CFG') + loCFG.CopyFrom(This) + Endif + + Return loCFG + Endproc + + + Procedure get_PROGRAM_HEADER + Local lcText lcText = '' - *-- Cabecera del PRG e inicio de DEF_CLASS +*-- Cabecera del PRG e inicio de DEF_CLASS TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 *-------------------------------------------------------------------------------------------------------------------------------------------------------- * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! @@ -4351,52 +4351,52 @@ DEFINE CLASS c_foxbin2prg AS Session * ENDTEXT - RETURN lcText - ENDPROC + Return lcText + Endproc - PROCEDURE getNext_BAK - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tc_OutputFilename (v! IN ) Nombre del archivo de salida a crear el backup - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcOutputFileName - LOCAL lcNext_Bak, I, laDirInfo(1,5) + Procedure getNext_BAK +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tc_OutputFilename (v! IN ) Nombre del archivo de salida a crear el backup +*-------------------------------------------------------------------------------------------------------------- + Lparameters tcOutputFileName + Local lcNext_Bak, I, laDirInfo(1,5) lcNext_Bak = '.BAK' - FOR I = 1 TO THIS.n_ExtraBackupLevels - IF m.I = 1 - IF NOT ADIR( laDirInfo, tcOutputFileName + '.BAK' ) > 0 THEN + For I = 1 To This.n_ExtraBackupLevels + If m.I = 1 + If Not Adir( laDirInfo, tcOutputFileName + '.BAK' ) > 0 Then lcNext_Bak = '.BAK' - EXIT - ENDIF - ELSE - IF NOT ADIR( laDirInfo, tcOutputFileName + '.' + PADL(m.I-1,1,'0') + '.BAK' ) > 0 THEN - lcNext_Bak = '.' + PADL(m.I-1,1,'0') + '.BAK' - EXIT - ENDIF - ENDIF - ENDFOR + Exit + Endif + Else + If Not Adir( laDirInfo, tcOutputFileName + '.' + Padl(m.I-1,1,'0') + '.BAK' ) > 0 Then + lcNext_Bak = '.' + Padl(m.I-1,1,'0') + '.BAK' + Exit + Endif + Endif + Endfor - RETURN lcNext_Bak - ENDPROC + Return lcNext_Bak + Endproc - PROCEDURE get_SeparatedLineAndComment - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLine (!@ IN/OUT) Línea a separar del comentario - * tcComment (@? OUT) Comentario - * tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcLine as String, tcComment as String, tlDeepCommentAnalysis as Boolean - LOCAL ln_AT_Cmt + Procedure get_SeparatedLineAndComment +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcLine (!@ IN/OUT) Línea a separar del comentario +* tcComment (@? OUT) Comentario +* tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) +*--------------------------------------------------------------------------------------------------- + Lparameters tcLine As String, tcComment As String, tlDeepCommentAnalysis As Boolean + Local ln_AT_Cmt tcComment = '' - ln_AT_Cmt = AT( '&'+'&', tcLine) + ln_AT_Cmt = At( '&'+'&', tcLine) - IF ln_AT_Cmt > 0 - IF tlDeepCommentAnalysis THEN - LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X + If ln_AT_Cmt > 0 + If tlDeepCommentAnalysis Then + Local laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A&]+[&2" &]+[& Comentario Opción A-2]) laSeparador(1,1) = '"' @@ -4410,1026 +4410,1026 @@ DEFINE CLASS c_foxbin2prg AS Session laSeparador(3,3) = 1 lcSeparadoresIzq = laSeparador(1,1) + laSeparador(2,1) + laSeparador(3,1) lcSeparadoresDer = laSeparador(1,2) + laSeparador(2,2) + laSeparador(3,2) - lnLen = LEN(lcStr) + lnLen = Len(lcStr) - *-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&') +*-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&') X = 1 - lnAT1 = AT(laSeparador(m.X,1), lcStr) + lnAT1 = At(laSeparador(m.X,1), lcStr) - *-- Funcionamiento: - *-- La anulación de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va - *-- cancelando hasta la siguiente. A partir de ahi, se busca carácter a carácter el siguiente separador - *-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. - *-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, - *-- por ejemplo, esto: - *-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 - *-- se convierte temporalmente en esto: - *-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 - *-- lo que facilita encontrar el comentario '&&' real. - *-- Si se encuentra algún separador de cadena que no cierre, se genera un error 10 (Syntax Error). - IF lnAT1 > 0 THEN - FOR I = lnAT1+1 TO lnLen - IF m.X > 0 THEN - lnAT2 = AT(laSeparador(m.X,2), lcStr, laSeparador(m.X,3)) +*-- Funcionamiento: +*-- La anulación de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va +*-- cancelando hasta la siguiente. A partir de ahi, se busca carácter a carácter el siguiente separador +*-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. +*-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, +*-- por ejemplo, esto: +*-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 +*-- se convierte temporalmente en esto: +*-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 +*-- lo que facilita encontrar el comentario '&&' real. +*-- Si se encuentra algún separador de cadena que no cierre, se genera un error 10 (Syntax Error). + If lnAT1 > 0 Then + For I = lnAT1+1 To lnLen + If m.X > 0 Then + lnAT2 = At(laSeparador(m.X,2), lcStr, laSeparador(m.X,3)) - IF lnAT2 > 0 THEN - lcStr = STUFF(lcStr, lnAT1, lnAT2-lnAT1+1, REPLICATE('X',lnAT2-lnAT1+1)) - ELSE - ln_AT_Cmt = AT( '&'+'&', lcStr) + If lnAT2 > 0 Then + lcStr = Stuff(lcStr, lnAT1, lnAT2-lnAT1+1, Replicate('X',lnAT2-lnAT1+1)) + Else + ln_AT_Cmt = At( '&'+'&', lcStr) - IF ln_AT_Cmt = 0 OR ln_AT_Cmt < lnAT1 - *-- No tiene comentario '&&' real, o sí lo tiene y además contiene un delimitador de cadena como parte del comentario - EXIT - ELSE - ERROR 'Closing string delimiter <' + laSeparador(m.X,2) + '> not found: ' + tcLine - ENDIF - ENDIF - ENDIF + If ln_AT_Cmt = 0 Or ln_AT_Cmt < lnAT1 +*-- No tiene comentario '&&' real, o sí lo tiene y además contiene un delimitador de cadena como parte del comentario + Exit + Else + Error 'Closing string delimiter <' + laSeparador(m.X,2) + '> not found: ' + tcLine + Endif + Endif + Endif - *-- Verifico si el carácter es un separador de cadenas: '"[ - X = AT( SUBSTR(lcStr, m.I, 1), lcSeparadoresIzq) +*-- Verifico si el carácter es un separador de cadenas: '"[ + X = At( Substr(lcStr, m.I, 1), lcSeparadoresIzq) - IF m.X > 0 THEN - lnAT1 = AT(laSeparador(m.X,1), lcStr) - ENDIF - ENDFOR - ENDIF + If m.X > 0 Then + lnAT1 = At(laSeparador(m.X,1), lcStr) + Endif + Endfor + Endif - ln_AT_Cmt = AT( '&'+'&', lcStr) - ENDIF && tlDeepCommentAnalysis + ln_AT_Cmt = At( '&'+'&', lcStr) + Endif && tlDeepCommentAnalysis - IF ln_AT_Cmt > 0 - tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) ) - tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios - ENDIF + If ln_AT_Cmt > 0 + tcComment = Ltrim( Substr( tcLine, ln_AT_Cmt + 2 ) ) + tcLine = Rtrim( Left( tcLine, ln_AT_Cmt - 1 ), 0, Chr(9), ' ' ) && Quito TABS y espacios + Endif - ENDIF + Endif - RETURN (ln_AT_Cmt > 0) - ENDPROC + Return (ln_AT_Cmt > 0) + Endproc - PROCEDURE normalizeFileCapitalization - LPARAMETERS tl_NormalizeInputFile, tcFileName + Procedure normalizeFileCapitalization + Lparameters tl_NormalizeInputFile, tcFileName - TRY - LOCAL lcPath, lcEXE_CAPS, lcOutputFile, llRelanzarError, lcType, laDirInfo(1,5) ; - , loEx AS EXCEPTION ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loFSO AS Scripting.FileSystemObject + Try + Local lcPath, lcEXE_CAPS, lcOutputFile, llRelanzarError, lcType, laDirInfo(1,5) ; + , loEx As Exception ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loFSO As Scripting.FileSystemObject - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF NOT .l_ProcessFiles - EXIT - ENDIF + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If Not .l_ProcessFiles + Exit + Endif - loLang = _SCREEN.o_FoxBin2Prg_Lang - lcPath = JUSTPATH(.c_Foxbin2prg_FullPath) - lcEXE_CAPS = FORCEPATH( 'filename_caps.exe', lcPath ) - loFSO = .o_FSO - llRelanzarError = NOT tl_NormalizeInputFile + loLang = _Screen.o_FoxBin2Prg_Lang + lcPath = Justpath(.c_Foxbin2prg_FullPath) + lcEXE_CAPS = Forcepath( 'filename_caps.exe', lcPath ) + loFSO = .o_FSO + llRelanzarError = Not tl_NormalizeInputFile - IF tl_NormalizeInputFile - tcFileName = EVL( tcFileName, .c_InputFile ) - lcType = UPPER( JUSTEXT( tcFileName ) ) - ELSE - tcFileName = EVL( tcFileName, .c_OutputFile ) - lcType = .c_Type - ENDIF + If tl_NormalizeInputFile + tcFileName = Evl( tcFileName, .c_InputFile ) + lcType = Upper( Justext( tcFileName ) ) + Else + tcFileName = Evl( tcFileName, .c_OutputFile ) + lcType = .c_Type + Endif - DO CASE - CASE .n_ExisteCapitalizacion = -1 - *-- La primera vez vale -1, hace la verificación por única vez y cachea la respuesta - IF FILE(lcEXE_CAPS) - *.writeLog( '* Se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) - .writeLog( C_TAB + TEXTMERGE(loLang.C_NAMES_CAPITALIZATION_PROGRAM_FOUND_LOC) ) - SET PROCEDURE TO (lcEXE_CAPS) ADDITIVE - .o_FNC = CREATEOBJECT( 'cl_FileName_Caps' ) - RELEASE PROCEDURE (lcEXE_CAPS) + Do Case + Case .n_ExisteCapitalizacion = -1 +*-- La primera vez vale -1, hace la verificación por única vez y cachea la respuesta + If File(lcEXE_CAPS) +*.writeLog( '* Se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) + .writeLog( C_TAB + Textmerge(loLang.C_NAMES_CAPITALIZATION_PROGRAM_FOUND_LOC) ) + Set Procedure To (lcEXE_CAPS) Additive + .o_FNC = Createobject( 'cl_FileName_Caps' ) + Release Procedure (lcEXE_CAPS) - .n_ExisteCapitalizacion = 1 - ELSE - *-- No existe el programa de capitalización, así que no se capitalizan los nombres. - *.writeLog( '* No se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) - .writeLog( C_TAB + TEXTMERGE(loLang.C_NAMES_CAPITALIZATION_PROGRAM_NOT_FOUND_LOC) ) - .n_ExisteCapitalizacion = 0 - EXIT - ENDIF + .n_ExisteCapitalizacion = 1 + Else +*-- No existe el programa de capitalización, así que no se capitalizan los nombres. +*.writeLog( '* No se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) + .writeLog( C_TAB + Textmerge(loLang.C_NAMES_CAPITALIZATION_PROGRAM_NOT_FOUND_LOC) ) + .n_ExisteCapitalizacion = 0 + Exit + Endif - CASE .n_ExisteCapitalizacion = 0 - *-- Segunda pasada en adelante: No hay programa de capitalización - EXIT + Case .n_ExisteCapitalizacion = 0 +*-- Segunda pasada en adelante: No hay programa de capitalización + Exit - OTHERWISE - *-- Segunda pasada en adelante: Hay programa de capitalización + Otherwise +*-- Segunda pasada en adelante: Hay programa de capitalización - ENDCASE + Endcase - *-- Normalizar archivo(s) de entrada. El primero siempre se normaliza (??2, ??X, DBF, DBC) - .renameFile( tcFileName, lcEXE_CAPS, loFSO, llRelanzarError ) +*-- Normalizar archivo(s) de entrada. El primero siempre se normaliza (??2, ??X, DBF, DBC) + .renameFile( tcFileName, lcEXE_CAPS, loFSO, llRelanzarError ) - DO CASE - CASE lcType = 'PJX' - .renameFile( FORCEEXT(tcFileName,'PJT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Do Case + Case lcType = 'PJX' + .renameFile( Forceext(tcFileName,'PJT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'VCX' - .renameFile( FORCEEXT(tcFileName,'VCT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Case lcType = 'VCX' + .renameFile( Forceext(tcFileName,'VCT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'SCX' - .renameFile( FORCEEXT(tcFileName,'SCT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Case lcType = 'SCX' + .renameFile( Forceext(tcFileName,'SCT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'FRX' - .renameFile( FORCEEXT(tcFileName,'FRT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Case lcType = 'FRX' + .renameFile( Forceext(tcFileName,'FRT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'LBX' - .renameFile( FORCEEXT(tcFileName,'LBT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Case lcType = 'LBX' + .renameFile( Forceext(tcFileName,'LBT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'DBF' - IF ADIR( laDirInfo, FORCEEXT(tcFileName,'FPT') ) > 0 THEN - .renameFile( FORCEEXT(tcFileName,'FPT'), lcEXE_CAPS, loFSO, llRelanzarError ) - ENDIF - IF ADIR( laDirInfo, FORCEEXT(tcFileName,'CDX') ) > 0 THEN - .renameFile( FORCEEXT(tcFileName,'CDX'), lcEXE_CAPS, loFSO, llRelanzarError ) - ENDIF + Case lcType = 'DBF' + If Adir( laDirInfo, Forceext(tcFileName,'FPT') ) > 0 Then + .renameFile( Forceext(tcFileName,'FPT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Endif + If Adir( laDirInfo, Forceext(tcFileName,'CDX') ) > 0 Then + .renameFile( Forceext(tcFileName,'CDX'), lcEXE_CAPS, loFSO, llRelanzarError ) + Endif - CASE lcType = 'DBC' - .renameFile( FORCEEXT(tcFileName,'DCX'), lcEXE_CAPS, loFSO, llRelanzarError ) - .renameFile( FORCEEXT(tcFileName,'DCT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Case lcType = 'DBC' + .renameFile( Forceext(tcFileName,'DCX'), lcEXE_CAPS, loFSO, llRelanzarError ) + .renameFile( Forceext(tcFileName,'DCT'), lcEXE_CAPS, loFSO, llRelanzarError ) - CASE lcType = 'MNX' - .renameFile( FORCEEXT(tcFileName,'MNT'), lcEXE_CAPS, loFSO, llRelanzarError ) + Case lcType = 'MNX' + .renameFile( Forceext(tcFileName,'MNT'), lcEXE_CAPS, loFSO, llRelanzarError ) - ENDCASE + Endcase - ENDWITH && THIS + Endwith && THIS - CATCH TO loEx - THROW + Catch To loEx + Throw - FINALLY - loFSO = NULL - RELEASE lcPath, lcEXE_CAPS, lcOutputFile, llRelanzarError, lcType, loFSO + Finally + loFSO = Null + Release lcPath, lcEXE_CAPS, lcOutputFile, llRelanzarError, lcType, loFSO - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE get_FilesFromDirectory - LPARAMETERS tcDir, taFiles, tnFileCount - EXTERNAL ARRAY taFiles + Procedure get_FilesFromDirectory + Lparameters tcDir, taFiles, tnFileCount + External Array taFiles - LOCAL laFiles(1), I, lnFiles ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Local laFiles(1), I, lnFiles ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' - IF TYPE("ALEN(laFiles)") # "N" OR EMPTY(tnFileCount) + If Type("ALEN(laFiles)") # "N" Or Empty(tnFileCount) tnFileCount = 0 - DIMENSION taFiles(1) - ENDIF + Dimension taFiles(1) + Endif - tcDir = ADDBS(tcDir) + tcDir = Addbs(tcDir) - IF DIRECTORY(tcDir) - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang + If Directory(tcDir) + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang .updateProgressbar( loLang.C_SCANNING_FILE_AND_DIR_INFO_LOC + ' ' + tcDir + '...', 0, 0, 0 ) - lnFiles = ADIR( laFiles, tcDir + '*.*', 'D', 1) + lnFiles = Adir( laFiles, tcDir + '*.*', 'D', 1) - *-- Busco los archivos - FOR I = 1 TO lnFiles - IF SUBSTR( laFiles(m.I,5), 5, 1 ) == 'D' - LOOP - ENDIF +*-- Busco los archivos + For I = 1 To lnFiles + If Substr( laFiles(m.I,5), 5, 1 ) == 'D' + Loop + Endif tnFileCount = tnFileCount + 1 - DIMENSION taFiles(tnFileCount) + Dimension taFiles(tnFileCount) taFiles(tnFileCount) = tcDir + laFiles(m.I,1) - ENDFOR + Endfor - *-- Busco los subdirectorios - FOR I = 1 TO lnFiles - IF NOT SUBSTR( laFiles(m.I,5), 5, 1 ) == 'D' OR LEFT(laFiles(m.I,1), 1) == '.' - LOOP - ENDIF +*-- Busco los subdirectorios + For I = 1 To lnFiles + If Not Substr( laFiles(m.I,5), 5, 1 ) == 'D' Or Left(laFiles(m.I,1), 1) == '.' + Loop + Endif .get_FilesFromDirectory( tcDir + laFiles(m.I,1), @taFiles, @lnFileCount ) - ENDFOR - ENDWITH - ENDIF - ENDPROC + Endfor + Endwith + Endif + Endproc - PROCEDURE loadModule - *-------------------------------------------------------------------------------------------------------------- - * CARGA EL MÓDULO INDICADO EN tc_InputFile Y DEVUELVE SU REFERENCIA DE OBJETO EN toModulo - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tc_InputFile (v! IN ) Nombre del archivo de entrada - * toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) - * toEx (@? OUT) Objeto con información del error - * tlRelanzarError (v? IN ) Indica si el error debe relanzarse o no - * tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar - * el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError, tcOriginalFileName + Procedure loadModule +*-------------------------------------------------------------------------------------------------------------- +* CARGA EL MÓDULO INDICADO EN tc_InputFile Y DEVUELVE SU REFERENCIA DE OBJETO EN toModulo +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tc_InputFile (v! IN ) Nombre del archivo de entrada +* toModulo (@? OUT) Referencia de objeto del módulo generado (para Unit Testing) +* toEx (@? OUT) Objeto con información del error +* tlRelanzarError (v? IN ) Indica si el error debe relanzarse o no +* tcOriginalFileName (v? IN ) Sirve para los casos en los que inputFile es un nombre temporal y se quiere generar +* el nombre correcto dentro de la versión texto (por ej: en los PJ2 y las cabeceras) +*-------------------------------------------------------------------------------------------------------------- + Lparameters tc_InputFile, toModulo, toEx As Exception, tlRelanzarError, tcOriginalFileName - TRY - LOCAL lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension, lnFileCount, laFiles(1,1), I ; - , ltFilestamp, lcExtA, lcExtB, laEvents(1,1), lnIDInputFile ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loConversor as c_conversor_base OF 'FOXBIN2PRG.PRG' ; - , loFSO AS Scripting.FileSystemObject - lnCodError = 0 + Try + Local lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension, lnFileCount, laFiles(1,1), I ; + , ltFilestamp, lcExtA, lcExtB, laEvents(1,1), lnIDInputFile ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loConversor As c_conversor_base Of 'FOXBIN2PRG.PRG' ; + , loFSO As Scripting.FileSystemObject + lnCodError = 0 - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - STORE NULL TO toModulo - lc_OldSetNotify = SET("Notify") - SET NOTIFY OFF - loFSO = .o_FSO - loLang = _SCREEN.o_FoxBin2Prg_Lang - .c_InputFile = FULLPATH( tc_InputFile ) - .l_Error = .F. - lcExtension = UPPER( JUSTEXT(.c_InputFile) ) + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + Store Null To toModulo + lc_OldSetNotify = Set("Notify") + Set Notify Off + loFSO = .o_FSO + loLang = _Screen.o_FoxBin2Prg_Lang + .c_InputFile = Fullpath( tc_InputFile ) + .l_Error = .F. + lcExtension = Upper( Justext(.c_InputFile) ) - .writeLog( REPLICATE( '*', 100 ) ) - .writeLog( 'LOAD MODULE', 2 ) - .writeLog( REPLICATE( '*', 100 ) ) + .writeLog( Replicate( '*', 100 ) ) + .writeLog( 'LOAD MODULE', 2 ) + .writeLog( Replicate( '*', 100 ) ) - IF ADIR( laDirFile, .c_InputFile, '', 1 ) = 0 - *ERROR 'No se encontró el archivo [' + .c_InputFile + ']' - ERROR loLang.C_FILE_NOT_FOUND_LOC + ' [' + .c_InputFile + ']' - ENDIF + If Adir( laDirFile, .c_InputFile, '', 1 ) = 0 +*ERROR 'No se encontró el archivo [' + .c_InputFile + ']' + Error loLang.C_FILE_NOT_FOUND_LOC + ' [' + .c_InputFile + ']' + Endif - .c_InputFile = loFSO.GetAbsolutePathName( FORCEPATH( laDirFile(1,1), JUSTPATH(.c_InputFile) ) ) + .c_InputFile = loFSO.GetAbsolutePathName( Forcepath( laDirFile(1,1), Justpath(.c_InputFile) ) ) - *-- VERIFICO SI HAY ARCHIVO DE CONFIGURACIÓN SECUNDARIO - .evaluateConfiguration() +*-- VERIFICO SI HAY ARCHIVO DE CONFIGURACIÓN SECUNDARIO + .evaluateConfiguration() - IF NOT EMPTY(tcOriginalFileName) - tcOriginalFileName = loFSO.GetAbsolutePathName( tcOriginalFileName ) - ENDIF + If Not Empty(tcOriginalFileName) + tcOriginalFileName = loFSO.GetAbsolutePathName( tcOriginalFileName ) + Endif - .c_OriginalFileName = EVL( tcOriginalFileName, .c_InputFile ) + .c_OriginalFileName = Evl( tcOriginalFileName, .c_InputFile ) - IF UPPER( JUSTEXT(.c_OriginalFileName) ) = 'PJM' AND .c_PJ2 <> 'PJM' - .c_OriginalFileName = FORCEEXT(.c_OriginalFileName,'pjx') - ENDIF + If Upper( Justext(.c_OriginalFileName) ) = 'PJM' And .c_PJ2 <> 'PJM' + .c_OriginalFileName = Forceext(.c_OriginalFileName,'pjx') + Endif - lnIDInputFile = .n_ProcessedFiles + lnIDInputFile = .n_ProcessedFiles - .writeLog( C_TAB + 'c_OriginalFileName: ' + .c_OriginalFileName ) - .writeLog( ) + .writeLog( C_TAB + 'c_OriginalFileName: ' + .c_OriginalFileName ) + .writeLog( ) - IF NOT ADIR(laDirFile, .c_InputFile) > 0 THEN - ERROR loLang.C_FILE_DOESNT_EXIST_LOC + ' [' + .c_InputFile + ']' - ENDIF + If Not Adir(laDirFile, .c_InputFile) > 0 Then + Error loLang.C_FILE_DOESNT_EXIST_LOC + ' [' + .c_InputFile + ']' + Endif - DO CASE - CASE lcExtension = 'VCX' - loConversor = CREATEOBJECT( 'c_conversor_vcx_a_prg' ) + Do Case + Case lcExtension = 'VCX' + loConversor = Createobject( 'c_conversor_vcx_a_prg' ) - CASE lcExtension = 'SCX' - loConversor = CREATEOBJECT( 'c_conversor_scx_a_prg' ) + Case lcExtension = 'SCX' + loConversor = Createobject( 'c_conversor_scx_a_prg' ) - CASE lcExtension = 'PJX' - loConversor = CREATEOBJECT( 'c_conversor_pjx_a_prg' ) + Case lcExtension = 'PJX' + loConversor = Createobject( 'c_conversor_pjx_a_prg' ) - CASE lcExtension = 'PJM' AND .c_PJ2 <> 'PJM' - loConversor = CREATEOBJECT( 'c_conversor_pjm_a_prg' ) + Case lcExtension = 'PJM' And .c_PJ2 <> 'PJM' + loConversor = Createobject( 'c_conversor_pjm_a_prg' ) - CASE lcExtension = 'FRX' - loConversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) + Case lcExtension = 'FRX' + loConversor = Createobject( 'c_conversor_frx_a_prg' ) - CASE lcExtension = 'LBX' - loConversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) + Case lcExtension = 'LBX' + loConversor = Createobject( 'c_conversor_frx_a_prg' ) - CASE lcExtension = 'DBF' - loConversor = CREATEOBJECT( 'c_conversor_dbf_a_prg' ) + Case lcExtension = 'DBF' + loConversor = Createobject( 'c_conversor_dbf_a_prg' ) - CASE lcExtension = 'DBC' - loConversor = CREATEOBJECT( 'c_conversor_dbc_a_prg' ) + Case lcExtension = 'DBC' + loConversor = Createobject( 'c_conversor_dbc_a_prg' ) - CASE lcExtension = 'MNX' - loConversor = CREATEOBJECT( 'c_conversor_mnx_a_prg' ) + Case lcExtension = 'MNX' + loConversor = Createobject( 'c_conversor_mnx_a_prg' ) - CASE lcExtension = .c_VC2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' ) + Case lcExtension = .c_VC2 + loConversor = Createobject( 'c_conversor_prg_a_vcx' ) - CASE lcExtension = .c_SC2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_scx' ) + Case lcExtension = .c_SC2 + loConversor = Createobject( 'c_conversor_prg_a_scx' ) - CASE lcExtension = .c_PJ2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_pjx' ) + Case lcExtension = .c_PJ2 + loConversor = Createobject( 'c_conversor_prg_a_pjx' ) - CASE lcExtension = .c_FR2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_frx' ) + Case lcExtension = .c_FR2 + loConversor = Createobject( 'c_conversor_prg_a_frx' ) - CASE lcExtension = .c_LB2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_frx' ) + Case lcExtension = .c_LB2 + loConversor = Createobject( 'c_conversor_prg_a_frx' ) - CASE lcExtension = .c_DB2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_dbf' ) + Case lcExtension = .c_DB2 + loConversor = Createobject( 'c_conversor_prg_a_dbf' ) - CASE lcExtension = .c_DC2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_dbc' ) + Case lcExtension = .c_DC2 + loConversor = Createobject( 'c_conversor_prg_a_dbc' ) - CASE lcExtension = .c_MN2 - loConversor = CREATEOBJECT( 'c_conversor_prg_a_mnx' ) + Case lcExtension = .c_MN2 + loConversor = Createobject( 'c_conversor_prg_a_mnx' ) - OTHERWISE - *ERROR 'El archivo [' + .c_InputFile + '] no está soportado' - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Otherwise +*ERROR 'El archivo [' + .c_InputFile + '] no está soportado' + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDCASE + Endcase - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) - loConversor.c_InputFile = .c_InputFile - loConversor.c_OutputFile = .c_OutputFile - loConversor.c_LogFile = .c_LogFile - loConversor.n_Debug = .n_Debug - loConversor.l_Test = .l_Test - loConversor.n_FB2PRG_Version = .n_FB2PRG_Version - loConversor.l_MethodSort_Enabled = .l_MethodSort_Enabled - loConversor.l_PropSort_Enabled = .l_PropSort_Enabled - loConversor.l_ReportSort_Enabled = .l_ReportSort_Enabled - loConversor.c_OriginalFileName = .c_OriginalFileName - loConversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath - *-- - *.updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + .c_InputFile + '...', 0, 0, 0 ) + .c_Type = Upper(Justext(.c_OutputFile)) + loConversor.c_InputFile = .c_InputFile + loConversor.c_OutputFile = .c_OutputFile + loConversor.c_LogFile = .c_LogFile + loConversor.n_Debug = .n_Debug + loConversor.l_Test = .l_Test + loConversor.n_FB2PRG_Version = .n_FB2PRG_Version + loConversor.l_MethodSort_Enabled = .l_MethodSort_Enabled + loConversor.l_PropSort_Enabled = .l_PropSort_Enabled + loConversor.l_ReportSort_Enabled = .l_ReportSort_Enabled + loConversor.c_OriginalFileName = .c_OriginalFileName + loConversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath +*-- +*.updateProgressbar( loLang.C_PROCESSING_LOC + ' ' + .c_InputFile + '...', 0, 0, 0 ) - *IF AEVENTS( laEvents, loConversor ) = 0 THEN - * BINDEVENT( loConversor, 'updateProgressbar', THIS, 'updateProgressbar' ) - *ENDIF +*IF AEVENTS( laEvents, loConversor ) = 0 THEN +* BINDEVENT( loConversor, 'updateProgressbar', THIS, 'updateProgressbar' ) +*ENDIF - loConversor.loadModule( @toModulo, .F., THIS ) + loConversor.loadModule( @toModulo, .F., This ) - IF loConversor.l_Error THEN - .l_Error = .T. - ENDIF + If loConversor.l_Error Then + .l_Error = .T. + Endif - *.n_ProcessedFilesCount = .n_ProcessedFilesCount + 1 - .writeLog() - .writeLog(loConversor.c_TextLog) && Recojo el LOG que haya generado el conversor +*.n_ProcessedFilesCount = .n_ProcessedFilesCount + 1 + .writeLog() + .writeLog(loConversor.c_TextLog) && Recojo el LOG que haya generado el conversor - *-- Logueo los errores - IF NOT EMPTY(loConversor.c_TextErr) THEN - .writeErrorLog( REPLICATE( '-', 100 ), 1 ) - .writeErrorLog( loLang.C_ERRORS_FOUND_IN_FILE_LOC + ' [' + .c_InputFile + '] ' ) - .writeErrorLog( loConversor.c_TextErr ) - .writeErrorLog( ) - ENDIF +*-- Logueo los errores + If Not Empty(loConversor.c_TextErr) Then + .writeErrorLog( Replicate( '-', 100 ), 1 ) + .writeErrorLog( loLang.C_ERRORS_FOUND_IN_FILE_LOC + ' [' + .c_InputFile + '] ' ) + .writeErrorLog( loConversor.c_TextErr ) + .writeErrorLog( ) + Endif - ENDWITH && THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + Endwith && THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - CATCH TO toEx - lnCodError = toEx.ERRORNO - *lcErrorInfo = THIS.exception2Str(toEx) + CR_LF + CR_LF + loLang.C_SOURCEFILE_LOC + THIS.c_InputFile + Catch To toEx + lnCodError = toEx.ErrorNo +*lcErrorInfo = THIS.exception2Str(toEx) + CR_LF + CR_LF + loLang.C_SOURCEFILE_LOC + THIS.c_InputFile - *-- updateProcessedFile( tcProcessed, tcHasErrors, tcSupported, tcReserved ) - *THIS.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) +*-- updateProcessedFile( tcProcessed, tcHasErrors, tcSupported, tcReserved ) +*THIS.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) - IF THIS.n_Debug > 0 THEN - IF _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - ENDIF - IF tlRelanzarError && Usado en Unit Testing - THROW - ENDIF + If This.n_Debug > 0 Then + If _vfp.StartMode = 0 + Set Step On + Endif + Endif + If tlRelanzarError && Usado en Unit Testing + Throw + Endif - FINALLY - SET NOTIFY &lc_OldSetNotify. + Finally + Set Notify &lc_OldSetNotify. - *IF AEVENTS( laEvents, loConversor ) > 0 THEN - * UNBINDEVENTS( loConversor ) - *ENDIF +*IF AEVENTS( laEvents, loConversor ) > 0 THEN +* UNBINDEVENTS( loConversor ) +*ENDIF - STORE NULL TO loConversor, loFSO + Store Null To loConversor, loFSO - *IF lnCodError = 0 AND THIS.l_Error THEN - * THIS.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) - *ELSE - * *THIS.updateProcessedFile( lnIDInputFile ) - *ENDIF +*IF lnCodError = 0 AND THIS.l_Error THEN +* THIS.updateProcessedFile( lnIDInputFile, '', '', 'E1' ) +*ELSE +* *THIS.updateProcessedFile( lnIDInputFile ) +*ENDIF - RELEASE lcErrorInfo, laDirFile, lcExtension, lnFileCount, laFiles, I ; - , ltFilestamp, lcExtA, lcExtB ; - , loConversor, loFSO - ENDTRY + Release lcErrorInfo, laDirFile, lcExtension, lnFileCount, laFiles, I ; + , ltFilestamp, lcExtA, lcExtB ; + , loConversor, loFSO + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc - PROCEDURE readInputVFPParams - LPARAMETERS taParams, tnPCount - EXTERNAL ARRAY taParams - *----------------------------------------------------------------------------- - * Obtengo la linea completa de comandos - * Adaptado de http://www.news2news.com/vfp/?example=51&function=78 - * Facilitado por Mario Lopez en el foro FoxPro de Google Español - 23/12/2013 - * https://groups.google.com/d/msg/publicesvfoxpro/llS-kTNrG9M/LA4D3fd152IJ - *----------------------------------------------------------------------------- - DECLARE INTEGER GetCommandLine IN kernel32 - DECLARE INTEGER GlobalSize IN kernel32 INTEGER HMEM - DECLARE RtlMoveMemory IN kernel32 AS CopyMemory STRING @Destination, INTEGER SOURCE, INTEGER nLength + Procedure readInputVFPParams + Lparameters taParams, tnPCount + External Array taParams +*----------------------------------------------------------------------------- +* Obtengo la linea completa de comandos +* Adaptado de http://www.news2news.com/vfp/?example=51&function=78 +* Facilitado por Mario Lopez en el foro FoxPro de Google Español - 23/12/2013 +* https://groups.google.com/d/msg/publicesvfoxpro/llS-kTNrG9M/LA4D3fd152IJ +*----------------------------------------------------------------------------- + Declare Integer GetCommandLine In kernel32 + Declare Integer GlobalSize In kernel32 Integer Hmem + Declare RtlMoveMemory In kernel32 As CopyMemory String @Destination, Integer Source, Integer nLength - LOCAL lnAddress, lnBufsize, lsBuffer + Local lnAddress, lnBufsize, lsBuffer lnAddress = GetCommandLine() && returns an address in memory lnBufsize = GlobalSize(lnAddress) - * allocating and filling a buffer - IF lnBufsize <> 0 - lsBuffer = REPLICATE(CHR(0), lnBufsize) +* allocating and filling a buffer + If lnBufsize <> 0 + lsBuffer = Replicate(Chr(0), lnBufsize) = CopyMemory(@lsBuffer, lnAddress, lnBufsize) - ENDIF + Endif - lsBuffer = STRTRAN(lsBuffer, '"'+CHR(0), '"'+CHR(13)+CHR(10)) - lsBuffer = STRTRAN(lsBuffer, '" ', '"'+CHR(13)+CHR(10), 1, 1) - lsBuffer = STRTRAN(lsBuffer, CHR(0), ' ') - tnPCount = ALINES( taParams, lsBuffer, 4 ) + lsBuffer = Strtran(lsBuffer, '"'+Chr(0), '"'+Chr(13)+Chr(10)) + lsBuffer = Strtran(lsBuffer, '" ', '"'+Chr(13)+Chr(10), 1, 1) + lsBuffer = Strtran(lsBuffer, Chr(0), ' ') + tnPCount = Alines( taParams, lsBuffer, 4 ) - IF tnPCount > 1 THEN - ADEL( taParams, 1 ) + If tnPCount > 1 Then + Adel( taParams, 1 ) tnPCount = tnPCount - 1 - DIMENSION taParams(tnPCount) - ENDIF + Dimension taParams(tnPCount) + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE renameFile - LPARAMETERS tcFileName, tcEXE_CAPS, toFSO AS Scripting.FileSystemObject, tlRelanzarError + Procedure renameFile + Lparameters tcFileName, tcEXE_CAPS, toFSO As Scripting.FileSystemObject, tlRelanzarError - LOCAL lcLog, laFile(1,5) ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang + Local lcLog, laFile(1,5) ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' lcLog = '' .o_FNC.Capitalize( tcFileName, '', 'F', @lcLog, tlRelanzarError, '1' ) - IF .n_Debug >= 2 THEN - lcLog = SUBSTR(lcLog,3) + If .n_Debug >= 2 Then + lcLog = Substr(lcLog,3) .writeLog() - .writeLog( C_TAB + TEXTMERGE(loLang.C_REQUESTING_CAPITALIZATION_OF_FILE_LOC) ) + .writeLog( C_TAB + Textmerge(loLang.C_REQUESTING_CAPITALIZATION_OF_FILE_LOC) ) .writeLog( lcLog ) - ENDIF - ENDWITH - ENDPROC + Endif + Endwith + Endproc - PROCEDURE renameTmpFile2Tx2File - LPARAMETERS tcFileName + Procedure renameTmpFile2Tx2File + Lparameters tcFileName - LOCAL lcTmpFile, loFSO AS Scripting.FileSystemObject, loEx as Exception + Local lcTmpFile, loFSO As Scripting.FileSystemObject, loEx As Exception - TRY - *loFSO = THIS.o_FSO - lcTmpFile = tcFileName + '.TMP' - THIS.changeFileAttribute( tcFileName, '+N' ) - ERASE (tcFileName) - RENAME (lcTmpFile) TO (tcFileName) + Try +*loFSO = THIS.o_FSO + lcTmpFile = tcFileName + '.TMP' + This.changeFileAttribute( tcFileName, '+N' ) + Erase (tcFileName) + Rename (lcTmpFile) To (tcFileName) - CATCH TO loEx - THROW + Catch To loEx + Throw - FINALLY - *loFSO = NULL - ENDTRY + Finally +*loFSO = NULL + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE set_Line - LPARAMETERS tcLine, taCodeLines, I - tcLine = LTRIM( taCodeLines(m.I), 0, CHR(9), ' ' ) - ENDPROC + Procedure set_Line + Lparameters tcLine, taCodeLines, I + tcLine = Ltrim( taCodeLines(m.I), 0, Chr(9), ' ' ) + Endproc - PROCEDURE errOut - *-- DEVOLUCIÓN DE SALIDA A ERROUT (-12) - LPARAMETERS tcTexto + Procedure errOut +*-- DEVOLUCIÓN DE SALIDA A ERROUT (-12) + Lparameters tcTexto - TRY - IF THIS.l_StdOutHabilitado - LOCAL loException as Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO - lcOutput = EVL(tcTexto,'') + CR_LF - lnOutHandle = fb2p_GetStdHandle(-12) && CAPTURAR ERROR DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS 2>&1 | FIND /V "" - lnBytesWritten = 0 - lnOverlappedIO = 0 - fb2p_WriteFile(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO) - ENDIF + Try + If This.l_StdOutHabilitado + Local loException As Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO + lcOutput = Evl(tcTexto,'') + CR_LF + lnOutHandle = fb2p_GetStdHandle(-12) && CAPTURAR ERROR DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS 2>&1 | FIND /V "" + lnBytesWritten = 0 + lnOverlappedIO = 0 + fb2p_WriteFile(lnOutHandle, @lcOutput, Len(lcOutput), @lnBytesWritten, @lnOverlappedIO) + Endif - CATCH TO loException - THIS.l_StdOutHabilitado = .F. + Catch To loException + This.l_StdOutHabilitado = .F. - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE stdOut - *-- DEVOLUCIÓN DE SALIDA A STDOUT (-11) - LPARAMETERS tcTexto + Procedure stdOut +*-- DEVOLUCIÓN DE SALIDA A STDOUT (-11) + Lparameters tcTexto - TRY - IF THIS.l_StdOutHabilitado - LOCAL loException as Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO - lcOutput = EVL(tcTexto,'') + CR_LF - lnOutHandle = fb2p_GetStdHandle(-11) && CAPTURAR STDOUT DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS | FIND /V "" - lnBytesWritten = 0 - lnOverlappedIO = 0 - fb2p_WriteFile(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO) - ENDIF + Try + If This.l_StdOutHabilitado + Local loException As Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO + lcOutput = Evl(tcTexto,'') + CR_LF + lnOutHandle = fb2p_GetStdHandle(-11) && CAPTURAR STDOUT DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS | FIND /V "" + lnBytesWritten = 0 + lnOverlappedIO = 0 + fb2p_WriteFile(lnOutHandle, @lcOutput, Len(lcOutput), @lnBytesWritten, @lnOverlappedIO) + Endif - CATCH TO loException - THIS.l_StdOutHabilitado = .F. + Catch To loException + This.l_StdOutHabilitado = .F. - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE updateProcessedFile - *--------------------------------------------------------------------------------------------------- - * ACTUALIZA ALGUNOS DATOS DEL ARCHIVO PROCESADO ACTUAL - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tnID (v? IN ) ID del archivo a actualizar. Si no se indica se asume el actual. - * tcInOutType (v? IN ) Archivo de entrada o de salida ("I"=Input file, "O"=Output file) - * tcProcessed (v? IN ) Procesado ("P0"=Not Processed, "P1"=Processed) - * tcHasErrors (v? IN ) Tuvo Errores ("E0"=No Errors, "E1"=Has Errors) - * tcSupported (v? IN ) Archivo soportado ("S0"=Unsupported, "S1"=Supported) - * tcExpanded (v? IN ) Tipo de archivo ("X0"=Normal file, "X1"=Expanded multipart file) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tnID, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded + Procedure updateProcessedFile +*--------------------------------------------------------------------------------------------------- +* ACTUALIZA ALGUNOS DATOS DEL ARCHIVO PROCESADO ACTUAL +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tnID (v? IN ) ID del archivo a actualizar. Si no se indica se asume el actual. +* tcInOutType (v? IN ) Archivo de entrada o de salida ("I"=Input file, "O"=Output file) +* tcProcessed (v? IN ) Procesado ("P0"=Not Processed, "P1"=Processed) +* tcHasErrors (v? IN ) Tuvo Errores ("E0"=No Errors, "E1"=Has Errors) +* tcSupported (v? IN ) Archivo soportado ("S0"=Unsupported, "S1"=Supported) +* tcExpanded (v? IN ) Tipo de archivo ("X0"=Normal file, "X1"=Expanded multipart file) +*--------------------------------------------------------------------------------------------------- + Lparameters tnID, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded - TRY - LOCAL loEx as Exception + Try + Local loEx As Exception - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF .n_ProcessedFiles = 0 THEN - EXIT - ENDIF - tnID = EVL(tnID, .n_ProcessedFiles) - IF NOT EMPTY(tcInOutType) - .a_ProcessedFiles(tnID, 2) = EVL(tcProcessed, '') - ENDIF - IF NOT EMPTY(tcProcessed) - .a_ProcessedFiles(tnID, 3) = EVL(tcProcessed, '') - ENDIF - IF NOT EMPTY(tcHasErrors) - .a_ProcessedFiles(tnID, 4) = EVL(tcHasErrors, '') - ENDIF - IF NOT EMPTY(tcSupported) - .a_ProcessedFiles(tnID, 5) = EVL(tcSupported, '') - ENDIF - .stdOut( .a_ProcessedFiles(tnID,2) ; - + ',' + .a_ProcessedFiles(tnID,3) ; - + ',' + .a_ProcessedFiles(tnID,4) ; - + ',' + .a_ProcessedFiles(tnID,5) ; - + ',' + .a_ProcessedFiles(tnID,6) ; - + ',' + LOWER(.a_ProcessedFiles(tnID,1)) ) - ENDWITH + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If .n_ProcessedFiles = 0 Then + Exit + Endif + tnID = Evl(tnID, .n_ProcessedFiles) + If Not Empty(tcInOutType) + .a_ProcessedFiles(tnID, 2) = Evl(tcProcessed, '') + Endif + If Not Empty(tcProcessed) + .a_ProcessedFiles(tnID, 3) = Evl(tcProcessed, '') + Endif + If Not Empty(tcHasErrors) + .a_ProcessedFiles(tnID, 4) = Evl(tcHasErrors, '') + Endif + If Not Empty(tcSupported) + .a_ProcessedFiles(tnID, 5) = Evl(tcSupported, '') + Endif + .stdOut( .a_ProcessedFiles(tnID,2) ; + + ',' + .a_ProcessedFiles(tnID,3) ; + + ',' + .a_ProcessedFiles(tnID,4) ; + + ',' + .a_ProcessedFiles(tnID,5) ; + + ',' + .a_ProcessedFiles(tnID,6) ; + + ',' + Lower(.a_ProcessedFiles(tnID,1)) ) + Endwith - CATCH TO loEx - IF THIS.n_Debug > 0 THEN - IF _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - ENDIF - THROW + Catch To loEx + If This.n_Debug > 0 Then + If _vfp.StartMode = 0 + Set Step On + Endif + Endif + Throw - ENDTRY - ENDPROC + Endtry + Endproc - PROCEDURE writeErrorLog - LPARAMETERS tcText, tnTimeStamp + Procedure writeErrorLog + Lparameters tcText, tnTimeStamp - TRY - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - *-- Según el valor de nTimestamp: - *-- 0 = Sin timestamp - *-- 1 = Timestamp por delante - *-- 2 = Timestamp por detrás - .c_TextErr = .c_TextErr ; - + IIF( EVL(tnTimeStamp,0) = 1, TTOC(DATETIME(),3) + ' ', '' ) ; - + EVL(tcText,'') ; - + IIF( EVL(tnTimeStamp,0) = 2, ' ' + TTOC(DATETIME(),3), '' ) ; - + CR_LF + Try + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' +*-- Según el valor de nTimestamp: +*-- 0 = Sin timestamp +*-- 1 = Timestamp por delante +*-- 2 = Timestamp por detrás + .c_TextErr = .c_TextErr ; + + Iif( Evl(tnTimeStamp,0) = 1, Ttoc(Datetime(),3) + ' ', '' ) ; + + Evl(tcText,'') ; + + Iif( Evl(tnTimeStamp,0) = 2, ' ' + Ttoc(Datetime(),3), '' ) ; + + CR_LF - .errOut(tcText) - .l_Error = .T. - .l_Errors = .T. - ENDWITH - CATCH - ENDTRY - ENDPROC + .errOut(tcText) + .l_Error = .T. + .l_Errors = .T. + Endwith + Catch + Endtry + Endproc - PROCEDURE writeErrorLog_Flush - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF NOT EMPTY(.c_TextErr) - STRTOFILE( .c_TextErr + CR_LF, .c_ErrorLogFile, 1 ) - ENDIF + Procedure writeErrorLog_Flush + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If Not Empty(.c_TextErr) + Strtofile( .c_TextErr + CR_LF, .c_ErrorLogFile, 1 ) + Endif .c_TextErr = '' - ENDWITH - ENDPROC + Endwith + Endproc - PROCEDURE writeLog - LPARAMETERS tcText, tnTimeStamp + Procedure writeLog + Lparameters tcText, tnTimeStamp - TRY - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - *-- Según el valor de nTimestamp: - *-- 0 = Sin timestamp - *-- 1 = Timestamp por delante - *-- 2 = Timestamp por detrás - .c_TextLog = .c_TextLog ; - + IIF( EVL(tnTimeStamp,0) = 1, TTOC(DATETIME(),3) + ' ', '' ) ; - + EVL(tcText,'') ; - + IIF( EVL(tnTimeStamp,0) = 2, ' ' + TTOC(DATETIME(),3), '' ) ; - + CR_LF - ENDWITH - CATCH - ENDTRY - ENDPROC + Try + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' +*-- Según el valor de nTimestamp: +*-- 0 = Sin timestamp +*-- 1 = Timestamp por delante +*-- 2 = Timestamp por detrás + .c_TextLog = .c_TextLog ; + + Iif( Evl(tnTimeStamp,0) = 1, Ttoc(Datetime(),3) + ' ', '' ) ; + + Evl(tcText,'') ; + + Iif( Evl(tnTimeStamp,0) = 2, ' ' + Ttoc(Datetime(),3), '' ) ; + + CR_LF + Endwith + Catch + Endtry + Endproc - PROCEDURE writeLog_Flush - WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF .n_Debug > 0 AND NOT EMPTY(.c_TextLog) - STRTOFILE( .c_TextLog + CR_LF, .c_LogFile, 1 ) - ENDIF + Procedure writeLog_Flush + With This As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + If .n_Debug > 0 And Not Empty(.c_TextLog) + Strtofile( .c_TextLog + CR_LF, .c_LogFile, 1 ) + Endif .c_TextLog = '' - ENDWITH - ENDPROC + Endwith + Endproc - HIDDEN PROCEDURE exception2Str - LPARAMETERS toEx AS EXCEPTION - LOCAL lcError - lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CR_LF ; - + toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CR_LF + Hidden Procedure exception2Str + Lparameters toEx As Exception + Local lcError + lcError = 'Error ' + Transform(toEx.ErrorNo) + ', ' + toEx.Message + CR_LF ; + + toEx.Procedure + ', ' + Transform(toEx.Lineno) + CR_LF - IF NOT EMPTY(toEx.LINECONTENTS) AND toEx.ErrorNo <> 1098 - lcError = lcError + toEx.LINECONTENTS + CR_LF - ENDIF + If Not Empty(toEx.LineContents) And toEx.ErrorNo <> 1098 + lcError = lcError + toEx.LineContents + CR_LF + Endif - IF NOT EMPTY(toEx.USERVALUE) - lcError = lcError + EVL(toEx.USERVALUE,'') - ENDIF + If Not Empty(toEx.UserValue) + lcError = lcError + Evl(toEx.UserValue,'') + Endif - RETURN lcError - ENDPROC + Return lcError + Endproc - PROCEDURE unique_ID - LPARAMETERS tcValType + Procedure unique_ID + Lparameters tcValType - tcValType = EVL(tcValType,'C') - THIS.n_ID = INT( THIS.n_ID + 1 ) + tcValType = Evl(tcValType,'C') + This.n_ID = Int( This.n_ID + 1 ) - IF tcValType = 'N' - RETURN THIS.n_ID - ELSE - RETURN '_' + TRANSFORM( THIS.n_ID, '@L #########' ) - ENDIF - ENDPROC + If tcValType = 'N' + Return This.n_ID + Else + Return '_' + Transform( This.n_ID, '@L #########' ) + Endif + Endproc - FUNCTION wscriptshell_run - * Modificación basada en la rutina RunExitCode.prg de William GC Steinford (nov 2002) - * pero compatible con el método Run de WScript.Shell para su reemplazo cuando no es posible usarlo. - * http://fox.wikis.com/wc.dll?Wiki~ProcessExitCode - *----------------------------------------------------------------------------------------------- - * 'Run' Parameter Documentation at: https://msdn.microsoft.com/en-us/library/d5fk67ky%28v=vs.84%29.aspx - *----------------------------------------------------------------------------------------------- - LPARAMETERS tcCmdLine, tnWindowStyle, tbWaitOnReturn, tlDebug - * ? WScriptShell_Run("c:\windows\system32\cmd.exe /c dir c:\*.* > \temp\dir.txt") + Function wscriptshell_run +* Modificación basada en la rutina RunExitCode.prg de William GC Steinford (nov 2002) +* pero compatible con el método Run de WScript.Shell para su reemplazo cuando no es posible usarlo. +* http://fox.wikis.com/wc.dll?Wiki~ProcessExitCode +*----------------------------------------------------------------------------------------------- +* 'Run' Parameter Documentation at: https://msdn.microsoft.com/en-us/library/d5fk67ky%28v=vs.84%29.aspx +*----------------------------------------------------------------------------------------------- + Lparameters tcCmdLine, tnWindowStyle, tbWaitOnReturn, tlDebug +* ? WScriptShell_Run("c:\windows\system32\cmd.exe /c dir c:\*.* > \temp\dir.txt") - LOCAL lnWfSO, ln_dwFlags, ln_wShowWindow, lcStartInfo, lcProcessInfo, ln_hProcess, ln_hThread ; + Local lnWfSO, ln_dwFlags, ln_wShowWindow, lcStartInfo, lcProcessInfo, ln_hProcess, ln_hThread ; , lnExitCode, ln_dwProcessId, ln_dwThreadId, tcProgFile, laDirFile(1,5) - TRY - DECLARE SHORT CreateProcess IN WIN32API ; - STRING lpszModuleName, ; - STRING @lpszCommandLine, ; - STRING lpSecurityAttributesProcess, ; - STRING lpSecurityAttributesThread, ; - SHORT bInheritHandles, ; - INTEGER dwCreateFlags, ; - STRING lpvEnvironment, ; - STRING lpszStartupDir, ; - STRING @lpStartInfo, ; - STRING @lpProcessInfo + Try + Declare SHORT CreateProcess In WIN32API ; + STRING lpszModuleName, ; + STRING @lpszCommandLine, ; + STRING lpSecurityAttributesProcess, ; + STRING lpSecurityAttributesThread, ; + SHORT bInheritHandles, ; + INTEGER dwCreateFlags, ; + STRING lpvEnvironment, ; + STRING lpszStartupDir, ; + STRING @lpStartInfo, ; + STRING @lpProcessInfo - DECLARE LONG WaitForSingleObject IN WIN32API INTEGER hHandle, LONG dwMilliseconds - DECLARE INTEGER GetExitCodeProcess IN WIN32API INTEGER ln_hProcess, INTEGER @ lnExitCode - DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject - *DECLARE INTEGER ShellExecuteEx IN Shell32 STRING @lpExecInfo - DECLARE LONG ShellExecuteEx IN shell32.DLL STRING @ - DECLARE LONG HeapAlloc IN WIN32API LONG, LONG, LONG - DECLARE LONG HeapFree IN WIN32API LONG, LONG, LONG - DECLARE LONG GetProcessHeap IN WIN32API - *DECLARE LONG WaitForSingleObject IN WIN32API LONG, LONG - DECLARE LONG TerminateProcess IN WIN32API LONG, LONG + Declare Long WaitForSingleObject In WIN32API Integer hHandle, Long dwMilliseconds + Declare Integer GetExitCodeProcess In WIN32API Integer ln_hProcess, Integer @ lnExitCode + Declare Integer CloseHandle In kernel32.Dll Integer hObject +*DECLARE INTEGER ShellExecuteEx IN Shell32 STRING @lpExecInfo + Declare Long ShellExecuteEx In shell32.Dll String @ + Declare Long HeapAlloc In WIN32API Long, Long, Long + Declare Long HeapFree In WIN32API Long, Long, Long + Declare Long GetProcessHeap In WIN32API +*DECLARE LONG WaitForSingleObject IN WIN32API LONG, LONG + Declare Long TerminateProcess In WIN32API Long, Long - * NOTA: Las constantes para VFP se pueden consultar en http://www.news2news.com/vfp/w32constants.php +* NOTA: Las constantes para VFP se pueden consultar en http://www.news2news.com/vfp/w32constants.php - #DEFINE SEE_MASK_NOCLOSEPROCESS 0x00000040 - #DEFINE WAIT_MILLISECOND 3000 + #Define SEE_MASK_NOCLOSEPROCESS 0x00000040 + #Define WAIT_MILLISECOND 3000 - #DEFINE SW_SHOW 5 - #DEFINE STILL_ACTIVE 0x103 - #DEFINE cnINFINITE 0xFFFFFFFF - #DEFINE cnHalfASecond 500 && milliseconds - #DEFINE cnTimedOut 0x0102 + #Define SW_SHOW 5 + #Define STILL_ACTIVE 0x103 + #Define cnINFINITE 0xFFFFFFFF + #Define cnHalfASecond 500 && milliseconds + #Define cnTimedOut 0x0102 - *-- Constantes para WaitForSingleObject - #DEFINE WAIT_ABANDONED 0x00000080 - #DEFINE WAIT_OBJECT_0 0x00000000 - #DEFINE WAIT_TIMEOUT 0x00000102 - #DEFINE WAIT_FAILED 0xFFFFFFFF +*-- Constantes para WaitForSingleObject + #Define WAIT_ABANDONED 0x00000080 + #Define WAIT_OBJECT_0 0x00000000 + #Define WAIT_TIMEOUT 0x00000102 + #Define WAIT_FAILED 0xFFFFFFFF - tcProgFile = EVL(tcProgFile, NULL) - tcCmdLine = EVL(tcCmdLine, NULL) + tcProgFile = Evl(tcProgFile, Null) + tcCmdLine = Evl(tcCmdLine, Null) - DO CASE - CASE VARTYPE(tbWaitOnReturn) = "L" - CASE VARTYPE(tbWaitOnReturn) = "N" - tbWaitOnReturn = (tbWaitOnReturn=1) - OTHERWISE - ERROR 'Invalid value for tbWaitOnReturn parameter' - ENDCASE + Do Case + Case Vartype(tbWaitOnReturn) = "L" + Case Vartype(tbWaitOnReturn) = "N" + tbWaitOnReturn = (tbWaitOnReturn=1) + Otherwise + Error 'Invalid value for tbWaitOnReturn parameter' + Endcase - IF VARTYPE(tnWindowStyle) # "N" OR NOT BETWEEN(tnWindowStyle, 0, 10) THEN - tnWindowStyle = 10 - ENDIF + If Vartype(tnWindowStyle) # "N" Or Not Between(tnWindowStyle, 0, 10) Then + tnWindowStyle = 10 + Endif - ln_dwFlags = 1 - ln_wShowWindow = tnWindowStyle + ln_dwFlags = 1 + ln_wShowWindow = tnWindowStyle - * DOCUMENTACIÓN estructura _STARTUPINFO: - * creates the STARTUP structure to specify main window - * properties if a new window is created for a new process +* DOCUMENTACIÓN estructura _STARTUPINFO: +* creates the STARTUP structure to specify main window +* properties if a new window is created for a new process - *| typedef struct _STARTUPINFO { - *| DWORD cb; 4 - *| LPTSTR lpReserved; 4 - *| LPTSTR lpDesktop; 4 - *| LPTSTR lpTitle; 4 - *| DWORD dwX; 4 - *| DWORD dwY; 4 - *| DWORD dwXSize; 4 - *| DWORD dwYSize; 4 - *| DWORD dwXCountChars; 4 - *| DWORD dwYCountChars; 4 - *| DWORD dwFillAttribute; 4 - *| DWORD dwFlags; 4 - *| WORD wShowWindow; 2 - *| WORD cbReserved2; 2 - *| LPBYTE lpReserved2; 4 - *| HANDLE hStdInput; 4 - *| HANDLE hStdOutput; 4 - *| HANDLE hStdError; 4 - *| } STARTUPINFO, *LPSTARTUPINFO; total: 68 bytes - lcStartInfo = BINTOC(68,'4RS') ; - + BINTOC(0,'4RS') + BINTOC(0,'4RS') + BINTOC(0,'4RS') ; - + BINTOC(0,'4RS') + BINTOC(0,'4RS') + BINTOC(0,'4RS') + BINTOC(0,'4RS') ; - + BINTOC(0,'4RS') + BINTOC(0,'4RS') + BINTOC(0,'4RS') ; - + BINTOC(ln_dwFlags,'4RS') ; - + BINTOC(ln_wShowWindow,'2RS') ; - + BINTOC(0,'2RS') + BINTOC(0,'4RS') ; - + BINTOC(0,'4RS') + BINTOC(0,'4RS') + BINTOC(0,'4RS') +*| typedef struct _STARTUPINFO { +*| DWORD cb; 4 +*| LPTSTR lpReserved; 4 +*| LPTSTR lpDesktop; 4 +*| LPTSTR lpTitle; 4 +*| DWORD dwX; 4 +*| DWORD dwY; 4 +*| DWORD dwXSize; 4 +*| DWORD dwYSize; 4 +*| DWORD dwXCountChars; 4 +*| DWORD dwYCountChars; 4 +*| DWORD dwFillAttribute; 4 +*| DWORD dwFlags; 4 +*| WORD wShowWindow; 2 +*| WORD cbReserved2; 2 +*| LPBYTE lpReserved2; 4 +*| HANDLE hStdInput; 4 +*| HANDLE hStdOutput; 4 +*| HANDLE hStdError; 4 +*| } STARTUPINFO, *LPSTARTUPINFO; total: 68 bytes + lcStartInfo = BinToC(68,'4RS') ; + + BinToC(0,'4RS') + BinToC(0,'4RS') + BinToC(0,'4RS') ; + + BinToC(0,'4RS') + BinToC(0,'4RS') + BinToC(0,'4RS') + BinToC(0,'4RS') ; + + BinToC(0,'4RS') + BinToC(0,'4RS') + BinToC(0,'4RS') ; + + BinToC(ln_dwFlags,'4RS') ; + + BinToC(ln_wShowWindow,'2RS') ; + + BinToC(0,'2RS') + BinToC(0,'4RS') ; + + BinToC(0,'4RS') + BinToC(0,'4RS') + BinToC(0,'4RS') - lcProcessInfo = REPLICATE( CHR(0), 16 ) + lcProcessInfo = Replicate( Chr(0), 16 ) - * DOCUMENTACIÓN estructura _PROCESS_INFORMATION: - * https://msdn.microsoft.com/en-us/library/windows/desktop/ms684873%28v=vs.85%29.aspx - * typedef struct _PROCESS_INFORMATION { - * HANDLE hProcess; - * HANDLE hThread; - * DWORD dwProcessId; - * DWORD dwThreadId; - * } PROCESS_INFORMATION; - * +* DOCUMENTACIÓN estructura _PROCESS_INFORMATION: +* https://msdn.microsoft.com/en-us/library/windows/desktop/ms684873%28v=vs.85%29.aspx +* typedef struct _PROCESS_INFORMATION { +* HANDLE hProcess; +* HANDLE hThread; +* DWORD dwProcessId; +* DWORD dwThreadId; +* } PROCESS_INFORMATION; +* - IF CreateProcess( tcProgFile, tcCmdLine,0,0,0,0,0,0, lcStartInfo, @lcProcessInfo ) = 0 + If CreateProcess( tcProgFile, tcCmdLine,0,0,0,0,0,0, lcStartInfo, @lcProcessInfo ) = 0 - *-- Segundo intento: Si se definió un archivo (ej: un TXT,LOG,etc) intento lanzarlo - *-- con la aplicación predeterminada - IF ADIR(laDirFile, tcCmdLine) = 1 THEN - LOCAL lcInfo, lnHeap, lnLen, lnPtr +*-- Segundo intento: Si se definió un archivo (ej: un TXT,LOG,etc) intento lanzarlo +*-- con la aplicación predeterminada + If Adir(laDirFile, tcCmdLine) = 1 Then + Local lcInfo, lnHeap, lnLen, lnPtr - *-- Ejemplo adaptado de: http://www.foxite.com/archives/0000316611.htm - lnLen = LEN(tcCmdLine) + 1 - lnHeap = GetProcessHeap() - lnPtr = HeapAlloc(lnHeap, 0x8, 5 + lnLen) - SYS(2600, lnPtr, 5, [open] + CHR(0)) - SYS(2600, lnPtr+5, lnLen, tcCmdLine + CHR(0)) +*-- Ejemplo adaptado de: http://www.foxite.com/archives/0000316611.htm + lnLen = Len(tcCmdLine) + 1 + lnHeap = GetProcessHeap() + lnPtr = HeapAlloc(lnHeap, 0x8, 5 + lnLen) + Sys(2600, lnPtr, 5, [open] + Chr(0)) + Sys(2600, lnPtr+5, lnLen, tcCmdLine + Chr(0)) - * DOCUMENTACIÓN estructura _SHELLEXECUTEINFO: - * https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784%28v=vs.85%29.aspx - *typedef struct _SHELLEXECUTEINFO { - * DWORD cbSize; 4 - * ULONG fMask; 4 - * HWND hwnd; 4 - * LPCTSTR lpVerb; 4 - * LPCTSTR lpFile; 4 - * LPCTSTR lpParameters; 4 - * LPCTSTR lpDirectory; 4 - * int nShow; 4 - * HINSTANCE hInstApp; 4 - * LPVOID lpIDList; 4 - * LPCTSTR lpClass; 4 - * HKEY hkeyClass; 4 - * DWORD dwHotKey; 4 - * union { - * HANDLE hIcon; - * HANDLE hMonitor; - * } DUMMYUNIONNAME; 4 - * HANDLE hProcess; 4 - *} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; - * +* DOCUMENTACIÓN estructura _SHELLEXECUTEINFO: +* https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784%28v=vs.85%29.aspx +*typedef struct _SHELLEXECUTEINFO { +* DWORD cbSize; 4 +* ULONG fMask; 4 +* HWND hwnd; 4 +* LPCTSTR lpVerb; 4 +* LPCTSTR lpFile; 4 +* LPCTSTR lpParameters; 4 +* LPCTSTR lpDirectory; 4 +* int nShow; 4 +* HINSTANCE hInstApp; 4 +* LPVOID lpIDList; 4 +* LPCTSTR lpClass; 4 +* HKEY hkeyClass; 4 +* DWORD dwHotKey; 4 +* union { +* HANDLE hIcon; +* HANDLE hMonitor; +* } DUMMYUNIONNAME; 4 +* HANDLE hProcess; 4 +*} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; +* - lcInfo = ; - BINTOC(60, [4RS]) + ; - BINTOC(SEE_MASK_NOCLOSEPROCESS, [4RS]) + ; - BINTOC(0, [4RS]) + ; - BINTOC(lnPtr, [4RS]) + ; - BINTOC(lnPtr+5, [4RS]) + ; - BINTOC(0, [4RS]) + ; - BINTOC(0, [4RS]) + ; - BINTOC(1, [4RS]) + ; - REPLICATE(CHR(0), 28) + lcInfo = ; + BINTOC(60, [4RS]) + ; + BINTOC(SEE_MASK_NOCLOSEPROCESS, [4RS]) + ; + BINTOC(0, [4RS]) + ; + BINTOC(lnPtr, [4RS]) + ; + BINTOC(lnPtr+5, [4RS]) + ; + BINTOC(0, [4RS]) + ; + BINTOC(0, [4RS]) + ; + BINTOC(1, [4RS]) + ; + REPLICATE(Chr(0), 28) - IF ShellExecuteEx(@lcInfo) = 0 - IF tlDebug - ? "Could not call process" - ENDIF + If ShellExecuteEx(@lcInfo) = 0 + If tlDebug + ? "Could not call process" + Endif + lnExitCode = -1 + Exit + Else + HeapFree(lnHeap, 0, lnPtr) + ln_hProcess = CToBin(Right(lcInfo, 4), [4RS]) + ln_hThread = 0 + + If tlDebug + ? "Process handle = "+Transform(ln_hProcess) + ? "Thread handle = "+Transform(ln_hThread) + Endif + +*IF lnProcess != 0 +* WaitForSingleObject(ln_hProcess, WAIT_MILLISECOND) +* IF tlDebug +* ? "Terminating process!" +* ENDIF +* TerminateProcess(ln_hProcess, 0) +*ENDIF + Endif + + Else + If tlDebug + ? "Could not create process" + Endif lnExitCode = -1 - EXIT - ELSE - HeapFree(lnHeap, 0, lnPtr) - ln_hProcess = CTOBIN(RIGHT(lcInfo, 4), [4RS]) - ln_hThread = 0 + Exit + Endif + Else - IF tlDebug - ? "Process handle = "+TRANSFORM(ln_hProcess) - ? "Thread handle = "+TRANSFORM(ln_hThread) - ENDIF +* Process and thread handles returned in ProcInfo structure + ln_hProcess = CToBin( Left( lcProcessInfo, 4 ), '4RS' ) + ln_hThread = CToBin( Substr( lcProcessInfo, 5, 4 ), '4RS' ) + ln_dwProcessId = CToBin( Substr( lcProcessInfo, 9, 4 ), '4RS' ) + ln_dwThreadId = CToBin( Substr( lcProcessInfo, 13, 4 ), '4RS' ) - *IF lnProcess != 0 - * WaitForSingleObject(ln_hProcess, WAIT_MILLISECOND) - * IF tlDebug - * ? "Terminating process!" - * ENDIF - * TerminateProcess(ln_hProcess, 0) - *ENDIF - ENDIF + If tlDebug + ? "Process handle = "+Transform(ln_hProcess) + ? "Thread handle = "+Transform(ln_hThread) + ? "Process handle id = "+Transform(ln_dwProcessId) + ? "Thread handle id = "+Transform(ln_dwThreadId) + Endif + Endif - ELSE - IF tlDebug - ? "Could not create process" - ENDIF - lnExitCode = -1 - EXIT - ENDIF - ELSE + If tbWaitOnReturn Then +* // Give the process time to execute and finish + lnExitCode = STILL_ACTIVE - * Process and thread handles returned in ProcInfo structure - ln_hProcess = CTOBIN( LEFT( lcProcessInfo, 4 ), '4RS' ) - ln_hThread = CTOBIN( SUBSTR( lcProcessInfo, 5, 4 ), '4RS' ) - ln_dwProcessId = CTOBIN( SUBSTR( lcProcessInfo, 9, 4 ), '4RS' ) - ln_dwThreadId = CTOBIN( SUBSTR( lcProcessInfo, 13, 4 ), '4RS' ) + Do While lnExitCode = STILL_ACTIVE +*lnWfSO = WaitForSingleObject(ln_hProcess, cnHalfASecond) + lnWfSO = WaitForSingleObject(ln_hProcess, cnINFINITE) - IF tlDebug - ? "Process handle = "+TRANSFORM(ln_hProcess) - ? "Thread handle = "+TRANSFORM(ln_hThread) - ? "Process handle id = "+TRANSFORM(ln_dwProcessId) - ? "Thread handle id = "+TRANSFORM(ln_dwThreadId) - ENDIF - ENDIF + If tlDebug + ? 'lnWfSO = ' + Transform(lnWfSO) + Endif - IF tbWaitOnReturn THEN - * // Give the process time to execute and finish - lnExitCode = STILL_ACTIVE + If GetExitCodeProcess(ln_hProcess, @lnExitCode) <> 0 + Do Case + Case lnExitCode = STILL_ACTIVE + If tlDebug + ? "Process is still active" + Endif + Otherwise + If tlDebug + ? "Exit code = "+ Transform( lnExitCode ) + Endif + Endcase + Else + If tlDebug + ? "GetExitCodeProcess() failed" + Endif + lnExitCode = -2 + Endif - DO WHILE lnExitCode = STILL_ACTIVE - *lnWfSO = WaitForSingleObject(ln_hProcess, cnHalfASecond) - lnWfSO = WaitForSingleObject(ln_hProcess, cnINFINITE) + DoEvents + Enddo + Else + lnExitCode = 0 + Endif - IF tlDebug - ? 'lnWfSO = ' + TRANSFORM(lnWfSO) - ENDIF +*-- DOCUMENTACIÓN sobre cierre procesos/threads: +*-- https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx + =CloseHandle(ln_hProcess) + =CloseHandle(ln_hThread) - IF GetExitCodeProcess(ln_hProcess, @lnExitCode) <> 0 - DO CASE - CASE lnExitCode = STILL_ACTIVE - IF tlDebug - ? "Process is still active" - ENDIF - OTHERWISE - IF tlDebug - ? "Exit code = "+ TRANSFORM( lnExitCode ) - ENDIF - ENDCASE - ELSE - IF tlDebug - ? "GetExitCodeProcess() failed" - ENDIF - lnExitCode = -2 - ENDIF + If tlDebug + ? '> FUNCTION RETURN VALUE = ' + Endif + Endtry - DOEVENTS - ENDDO - ELSE - lnExitCode = 0 - ENDIF - - *-- DOCUMENTACIÓN sobre cierre procesos/threads: - *-- https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx - =CloseHandle(ln_hProcess) - =CloseHandle(ln_hThread) - - IF tlDebug - ? '> FUNCTION RETURN VALUE = ' - ENDIF - ENDTRY - - RETURN lnExitCode - ENDFUNC + Return lnExitCode + Endfunc - FUNCTION FERROR_Message(tcFileName as String) - LOCAL lcMsg, lnError - tcFileName = EVL(tcFileName,'') - lnError = FERROR() + Function FERROR_Message(tcFileName As String) + Local lcMsg, lnError + tcFileName = Evl(tcFileName,'') + lnError = Ferror() - DO CASE - CASE lnError = 2 - lcMsg = 'File not found' - CASE lnError = 4 - lcMsg = 'Too many files open (out of file handles)' - CASE lnError = 5 - lcMsg = 'Access denied' - CASE lnError = 6 - lcMsg = 'Invalid file handle given' - CASE lnError = 8 - lcMsg = 'Out of memory' - CASE lnError = 25 - lcMsg = [Seek error (can't seek before the start of a file)] - CASE lnError = 29 - lcMsg = 'Disk full' - CASE lnError = 31 - lcMsg = 'Error opening file' - OTHERWISE - lcMsg = 'Unrecognized error trying to open the file ' + tcFileName - ENDCASE + Do Case + Case lnError = 2 + lcMsg = 'File not found' + Case lnError = 4 + lcMsg = 'Too many files open (out of file handles)' + Case lnError = 5 + lcMsg = 'Access denied' + Case lnError = 6 + lcMsg = 'Invalid file handle given' + Case lnError = 8 + lcMsg = 'Out of memory' + Case lnError = 25 + lcMsg = [Seek error (can't seek before the start of a file)] + Case lnError = 29 + lcMsg = 'Disk full' + Case lnError = 31 + lcMsg = 'Error opening file' + Otherwise + lcMsg = 'Unrecognized error trying to open the file ' + tcFileName + Endcase - RETURN lcMsg - ENDFUNC + Return lcMsg + Endfunc - FUNCTION getLocaleInfo - LPARAMETERS tnSetting, tcLocale - #DEFINE C_NULL CHR(0) - LOCAL lcLocale, lnLen, lcBuffer, lnReturn, lcReturn + Function getLocaleInfo + Lparameters tnSetting, tcLocale + #Define C_NULL Chr(0) + Local lcLocale, lnLen, lcBuffer, lnReturn, lcReturn - IF VARTYPE(tcLocale) = 'C' AND NOT EMPTY(tcLocale) - lcLocale = STRCONV(tcLocale, 5) + C_NULL - ELSE - lcLocale = .NULL. - ENDIF + If Vartype(tcLocale) = 'C' And Not Empty(tcLocale) + lcLocale = Strconv(tcLocale, 5) + C_NULL + Else + lcLocale = .Null. + Endif - DECLARE INTEGER GetLocaleInfoEx in Win32API ; - string locale, long type, string @buffer, integer len + Declare Integer GetLocaleInfoEx In Win32API ; + string locale, Long Type, String @Buffer, Integer Len lnLen = 255 - lcBuffer = SPACE(lnLen) + lcBuffer = Space(lnLen) lnReturn = GetLocaleInfoEx(lcLocale, tnSetting, @lcBuffer, lnLen) - lcReturn = STRCONV(LEFT(lcBuffer, 2 * (lnReturn - 1)), 6) - RETURN lcReturn - ENDFUNC + lcReturn = Strconv(Left(lcBuffer, 2 * (lnReturn - 1)), 6) + Return lcReturn + Endfunc -ENDDEFINE +Enddefine -DEFINE CLASS frm_avance AS Form +Define Class frm_avance As Form Height = 110 Width = 628 ShowWindow = 2 @@ -5438,16 +5438,16 @@ DEFINE CLASS frm_avance AS Form AutoCenter = .T. BorderStyle = 2 ControlBox = .F. - BackColor = RGB(255,255,255) + BackColor = Rgb(255,255,255) nMax_value = 100 nMax_value2 = 100 - nSecsAtStart = (SECONDS()) + nSecsAtStart = (Seconds()) nLastSecCount = 0 nValue = 0 nValue2 = 0 l_Cancelled = .F. Name = "frm_avance" - _memberdata = [] ; + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -5462,7 +5462,7 @@ DEFINE CLASS frm_avance AS Form + [] ; + [] - ADD OBJECT shp_base AS shape WITH ; + Add Object shp_base As Shape With ; Top = 28, ; Left = 12, ; Height = 13, ; @@ -5473,7 +5473,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 14215910, ; Name = "shp_base" - ADD OBJECT shp_avance AS shape WITH ; + Add Object shp_avance As Shape With ; Top = 28, ; Left = 12, ; Height = 13, ; @@ -5484,7 +5484,7 @@ DEFINE CLASS frm_avance AS Form BorderWidth = 1, ; Name = "shp_Avance" - ADD OBJECT shp_base2 AS shape WITH ; + Add Object shp_base2 As Shape With ; Top = 64, ; Left = 12, ; Height = 13, ; @@ -5495,7 +5495,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 14215910, ; Name = "shp_base2" - ADD OBJECT shp_avance2 AS shape WITH ; + Add Object shp_avance2 As Shape With ; Top = 64, ; Left = 12, ; Height = 13, ; @@ -5506,7 +5506,7 @@ DEFINE CLASS frm_avance AS Form BorderWidth = 1, ; Name = "shp_Avance2" - ADD OBJECT cmdCancel AS commandbutton WITH ; + Add Object cmdCancel As CommandButton With ; Top = 84, ; Left = 252, ; Height = 21, ; @@ -5515,7 +5515,7 @@ DEFINE CLASS frm_avance AS Form Enabled = .F., ; Name = "cmdCancel" - ADD OBJECT lin_1 AS shape WITH ; + Add Object lin_1 As Shape With ; Top = 28, ; Left = 32, ; Height = 53, ; @@ -5523,7 +5523,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_1" - ADD OBJECT lin_2 AS shape WITH ; + Add Object lin_2 As Shape With ; Top = 28, ; Left = 52, ; Height = 53, ; @@ -5531,7 +5531,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_2" - ADD OBJECT lin_3 AS shape WITH ; + Add Object lin_3 As Shape With ; Top = 28, ; Left = 72, ; Height = 53, ; @@ -5539,7 +5539,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_3" - ADD OBJECT lin_4 AS shape WITH ; + Add Object lin_4 As Shape With ; Top = 28, ; Left = 92, ; Height = 53, ; @@ -5547,7 +5547,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_4" - ADD OBJECT lin_5 AS shape WITH ; + Add Object lin_5 As Shape With ; Top = 28, ; Left = 112, ; Height = 53, ; @@ -5555,7 +5555,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_5" - ADD OBJECT lin_6 AS shape WITH ; + Add Object lin_6 As Shape With ; Top = 28, ; Left = 132, ; Height = 53, ; @@ -5563,7 +5563,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_6" - ADD OBJECT lin_7 AS shape WITH ; + Add Object lin_7 As Shape With ; Top = 28, ; Left = 152, ; Height = 53, ; @@ -5571,7 +5571,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_7" - ADD OBJECT lin_8 AS shape WITH ; + Add Object lin_8 As Shape With ; Top = 28, ; Left = 172, ; Height = 53, ; @@ -5579,7 +5579,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_8" - ADD OBJECT lin_9 AS shape WITH ; + Add Object lin_9 As Shape With ; Top = 28, ; Left = 192, ; Height = 53, ; @@ -5587,7 +5587,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_9" - ADD OBJECT lin_10 AS shape WITH ; + Add Object lin_10 As Shape With ; Top = 28, ; Left = 212, ; Height = 53, ; @@ -5595,7 +5595,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_10" - ADD OBJECT lin_11 AS shape WITH ; + Add Object lin_11 As Shape With ; Top = 28, ; Left = 232, ; Height = 53, ; @@ -5603,7 +5603,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_11" - ADD OBJECT lin_12 AS shape WITH ; + Add Object lin_12 As Shape With ; Top = 28, ; Left = 252, ; Height = 53, ; @@ -5611,7 +5611,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_12" - ADD OBJECT lin_13 AS shape WITH ; + Add Object lin_13 As Shape With ; Top = 28, ; Left = 272, ; Height = 53, ; @@ -5619,7 +5619,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_13" - ADD OBJECT lin_14 AS shape WITH ; + Add Object lin_14 As Shape With ; Top = 28, ; Left = 292, ; Height = 53, ; @@ -5627,7 +5627,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_14" - ADD OBJECT lin_15 AS shape WITH ; + Add Object lin_15 As Shape With ; Top = 28, ; Left = 312, ; Height = 53, ; @@ -5635,7 +5635,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_15" - ADD OBJECT lin_16 AS shape WITH ; + Add Object lin_16 As Shape With ; Top = 28, ; Left = 332, ; Height = 53, ; @@ -5643,7 +5643,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_16" - ADD OBJECT lin_17 AS shape WITH ; + Add Object lin_17 As Shape With ; Top = 28, ; Left = 352, ; Height = 53, ; @@ -5651,7 +5651,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_17" - ADD OBJECT lin_18 AS shape WITH ; + Add Object lin_18 As Shape With ; Top = 28, ; Left = 372, ; Height = 53, ; @@ -5659,7 +5659,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_18" - ADD OBJECT lin_19 AS shape WITH ; + Add Object lin_19 As Shape With ; Top = 28, ; Left = 392, ; Height = 53, ; @@ -5667,7 +5667,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_19" - ADD OBJECT lin_20 AS shape WITH ; + Add Object lin_20 As Shape With ; Top = 28, ; Left = 412, ; Height = 53, ; @@ -5675,7 +5675,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_20" - ADD OBJECT lin_21 AS shape WITH ; + Add Object lin_21 As Shape With ; Top = 28, ; Left = 432, ; Height = 53, ; @@ -5683,7 +5683,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_21" - ADD OBJECT lin_22 AS shape WITH ; + Add Object lin_22 As Shape With ; Top = 28, ; Left = 452, ; Height = 53, ; @@ -5691,7 +5691,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_22" - ADD OBJECT lin_23 AS shape WITH ; + Add Object lin_23 As Shape With ; Top = 28, ; Left = 472, ; Height = 53, ; @@ -5699,7 +5699,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_23" - ADD OBJECT lin_24 AS shape WITH ; + Add Object lin_24 As Shape With ; Top = 28, ; Left = 492, ; Height = 53, ; @@ -5707,7 +5707,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_24" - ADD OBJECT lin_25 AS shape WITH ; + Add Object lin_25 As Shape With ; Top = 28, ; Left = 512, ; Height = 53, ; @@ -5715,7 +5715,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_25" - ADD OBJECT lin_26 AS shape WITH ; + Add Object lin_26 As Shape With ; Top = 28, ; Left = 532, ; Height = 53, ; @@ -5723,7 +5723,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_26" - ADD OBJECT lin_27 AS shape WITH ; + Add Object lin_27 As Shape With ; Top = 28, ; Left = 552, ; Height = 53, ; @@ -5731,7 +5731,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_27" - ADD OBJECT lin_28 AS shape WITH ; + Add Object lin_28 As Shape With ; Top = 28, ; Left = 572, ; Height = 53, ; @@ -5739,7 +5739,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_28" - ADD OBJECT lin_29 AS shape WITH ; + Add Object lin_29 As Shape With ; Top = 28, ; Left = 592, ; Height = 53, ; @@ -5747,7 +5747,7 @@ DEFINE CLASS frm_avance AS Form BorderColor = 16777215, ; Name = "lin_29" - ADD OBJECT lbl_tarea AS label WITH ; + Add Object lbl_tarea As Label With ; BackStyle = 0, ; Caption = ".", ; Height = 17, ; @@ -5756,7 +5756,7 @@ DEFINE CLASS frm_avance AS Form Width = 604, ; Name = "lbl_Tarea" - ADD OBJECT lbl_tarea2 AS label WITH ; + Add Object lbl_tarea2 As Label With ; BackStyle = 0, ; Caption = ".", ; Height = 17, ; @@ -5765,7 +5765,7 @@ DEFINE CLASS frm_avance AS Form Width = 604, ; Name = "lbl_Tarea2" - ADD OBJECT 'lblStartTime' AS label WITH ; + Add Object 'lblStartTime' As Label With ; BackStyle = 0, ; Caption = "Start time: __/__/____ __:__:__", ; Height = 17, ; @@ -5774,7 +5774,7 @@ DEFINE CLASS frm_avance AS Form Top = 88, ; Width = 176 - ADD OBJECT 'lblElapsedTime' AS label WITH ; + Add Object 'lblElapsedTime' As Label With ; BackStyle = 0, ; Caption = "Elapsed Time: __:__:__", ; Height = 17, ; @@ -5783,135 +5783,135 @@ DEFINE CLASS frm_avance AS Form Top = 88, ; Width = 136 - PROCEDURE updateProgressbar - LPARAMETERS tcTexto, tnValor, tnTotal, tnTipo + Procedure updateProgressbar + Lparameters tcTexto, tnValor, tnTotal, tnTipo - WITH THISFORM AS frm_avance OF foxbin2prg.prg - LOCAL lnSecs + With Thisform As frm_avance Of foxbin2prg.prg + Local lnSecs - lnSecs = SECONDS() + lnSecs = Seconds() - IF lnSecs - .nLastSecCount > 0 THEN - .lblElapsedTime.Caption = 'Elapsed Time: ' + TTOC( {^2000-1-1,00:00:00} + lnSecs - .nSecsAtStart, 2 ) + If lnSecs - .nLastSecCount > 0 Then + .lblElapsedTime.Caption = 'Elapsed Time: ' + Ttoc( {^2000-1-1,00:00:00} + lnSecs - .nSecsAtStart, 2 ) .nLastSecCount = lnSecs - ENDIF + Endif - *-- Habilita el botón de cancelar una vez que se comienzan a pasar valores - IF NOT EMPTY(tnValor) THEN - IF NOT .cmdCancel.Enabled THEN +*-- Habilita el botón de cancelar una vez que se comienzan a pasar valores + If Not Empty(tnValor) Then + If Not .cmdCancel.Enabled Then .cmdCancel.Enabled = .T. - ENDIF - DOEVENTS - ENDIF + Endif + DoEvents + Endif - DO CASE - CASE tnTipo = 0 - IF NOT EMPTY(tcTexto) THEN - .lbl_tarea.Caption = tcTexto - ENDIF + Do Case + Case tnTipo = 0 + If Not Empty(tcTexto) Then + .lbl_tarea.Caption = tcTexto + Endif - .nValue2 = 0 + .nValue2 = 0 - IF tnTotal > 0 THEN - .nMax_value = tnTotal - .nValue = tnValor - ENDIF + If tnTotal > 0 Then + .nMax_value = tnTotal + .nValue = tnValor + Endif - CASE tnTipo = 1 - IF NOT EMPTY(tcTexto) THEN - .lbl_tarea2.Caption = tcTexto - ENDIF + Case tnTipo = 1 + If Not Empty(tcTexto) Then + .lbl_tarea2.Caption = tcTexto + Endif - IF tnTotal > 0 THEN - .nMax_value2 = tnTotal - .nValue2 = tnValor - ENDIF + If tnTotal > 0 Then + .nMax_value2 = tnTotal + .nValue2 = tnValor + Endif - CASE tnTipo = 2 - IF NOT EMPTY(tcTexto) THEN - .lbl_tarea2.Caption = tcTexto - ENDIF + Case tnTipo = 2 + If Not Empty(tcTexto) Then + .lbl_tarea2.Caption = tcTexto + Endif - IF tnTotal > 0 THEN - .nMax_value2 = tnTotal - .nValue2 = tnValor - ENDIF + If tnTotal > 0 Then + .nMax_value2 = tnTotal + .nValue2 = tnValor + Endif - ENDCASE - ENDWITH && THIS + Endcase + Endwith && THIS - RETURN - ENDPROC + Return + Endproc - PROCEDURE nValue_assign - LPARAMETERS vNewVal + Procedure nValue_assign + Lparameters vNewVal - WITH THIS + With This .nValue = m.vNewVal - .shp_avance.WIDTH = m.vNewVal * .shp_base.WIDTH / .nMax_value - ENDWITH - ENDPROC + .shp_avance.Width = m.vNewVal * .shp_base.Width / .nMax_value + Endwith + Endproc - PROCEDURE INIT - LPARAMETERS toFoxBin2Prg + Procedure Init + Lparameters toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - LOCAL THISFORM AS frm_avance OF foxbin2prg.prg - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + Local Thisform As frm_avance Of foxbin2prg.prg + #Endif - LOCAL laDirInfo(1,5), loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Local laDirInfo(1,5), loLang As CL_LANG Of 'FOXBIN2PRG.PRG' - 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 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 ADIR( laDirInfo, FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) > 0 THEN - IF FILE( FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) THEN - THISFORM.Icon = FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) - ENDIF +*IF ADIR( laDirInfo, FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) > 0 THEN + If File( Forceext( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) Then + Thisform.Icon = Forceext( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) + Endif - *IF ADIR( laDirInfo, toFoxBin2Prg.c_BackgroundImage ) > 0 THEN - IF FILE( toFoxBin2Prg.c_BackgroundImage ) THEN - CLEAR RESOURCES - THISFORM.Picture = toFoxBin2Prg.c_BackgroundImage - ENDIF - ENDIF +*IF ADIR( laDirInfo, toFoxBin2Prg.c_BackgroundImage ) > 0 THEN + If File( toFoxBin2Prg.c_BackgroundImage ) Then + Clear Resources + Thisform.Picture = toFoxBin2Prg.c_BackgroundImage + Endif + Endif - THISFORM.nValue = 0 - THISFORM.nValue2 = 0 - THISFORM.nLastSecCount = SECONDS() - ENDPROC + Thisform.nValue = 0 + Thisform.nValue2 = 0 + Thisform.nLastSecCount = Seconds() + Endproc - PROCEDURE nValue2_assign - LPARAMETERS vNewVal + Procedure nValue2_assign + Lparameters vNewVal - WITH THIS + With This .nValue2 = m.vNewVal - .shp_avance2.WIDTH = m.vNewVal * .shp_base2.WIDTH / .nMax_value2 - ENDWITH - ENDPROC + .shp_avance2.Width = m.vNewVal * .shp_base2.Width / .nMax_value2 + Endwith + Endproc - PROCEDURE cmdCancel.Click - THISFORM.l_Cancelled = .T. - ENDPROC + Procedure cmdCancel.Click + Thisform.l_Cancelled = .T. + Endproc - PROCEDURE lblStartTime.Init - THIS.Caption = "Start Time: " + TTOC(DATETIME()) - ENDPROC + Procedure lblStartTime.Init + This.Caption = "Start Time: " + Ttoc(Datetime()) + Endproc -ENDDEFINE +Enddefine -DEFINE CLASS frm_interactive AS Form +Define Class frm_interactive As Form Height = 114 Width = 380 ShowWindow = 2 @@ -5925,17 +5925,17 @@ DEFINE CLASS frm_interactive AS Form AlwaysOnTop = .T. MaxButton = .F. MinButton = .F. - BackColor = RGB(255,255,255) + BackColor = Rgb(255,255,255) n_ConversionType = 3 l_FileTimeStampOptimization = .F. Name = "frm_interactive" - _memberdata = [] ; + _MemberData = [] ; + [] ; + [] ; + [] - ADD OBJECT chk_FileTimeStampOptimization AS checkbox WITH ; + Add Object chk_FileTimeStampOptimization As Checkbox With ; Alignment = 0, ; BackStyle = 0, ; Caption = "chk_FileTimeStampOptimization", ; @@ -5949,7 +5949,7 @@ DEFINE CLASS frm_interactive AS Form Visible = .F. - ADD OBJECT lbl_title AS label WITH ; + Add Object lbl_title As Label With ; WordWrap = .T., ; Alignment = 2, ; BackStyle = 0, ; @@ -5962,7 +5962,7 @@ DEFINE CLASS frm_interactive AS Form Name = "lbl_Title" - ADD OBJECT cmd_Bin2Prg AS commandbutton WITH ; + Add Object cmd_Bin2Prg As CommandButton With ; Top = 58, ; Left = 40, ; Height = 27, ; @@ -5971,7 +5971,7 @@ DEFINE CLASS frm_interactive AS Form Name = "cmd_Bin2Prg" - ADD OBJECT cmd_Prg2Bin AS commandbutton WITH ; + Add Object cmd_Prg2Bin As CommandButton With ; Top = 58, ; Left = 144, ; Height = 27, ; @@ -5980,7 +5980,7 @@ DEFINE CLASS frm_interactive AS Form Name = "cmd_Prg2Bin" - ADD OBJECT cmd_None AS commandbutton WITH ; + Add Object cmd_None As CommandButton With ; Top = 58, ; Left = 248, ; Height = 27, ; @@ -5990,82 +5990,82 @@ DEFINE CLASS frm_interactive AS Form Name = "cmd_None" - PROCEDURE INIT - LPARAMETERS toFoxBin2Prg + Procedure Init + Lparameters toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL laDirInfo(1,5), loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Local laDirInfo(1,5), 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 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 + 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.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) + Thisform.l_FileTimeStampOptimization = (toFoxBin2Prg.n_OptimizeByFilestamp <> 0) - IF ADIR( laDirInfo, FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) > 0 THEN - THISFORM.Icon = FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) - ENDIF - ENDIF - ENDPROC + If Adir( laDirInfo, Forceext( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) > 0 Then + Thisform.Icon = Forceext( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) + Endif + Endif + Endproc - PROCEDURE QueryUnload - THISFORM.n_ConversionType = 3 - NODEFAULT - THISFORM.do_selection() + Procedure QueryUnload + Thisform.n_ConversionType = 3 + Nodefault + Thisform.do_selection() - ENDPROC + Endproc - PROCEDURE do_selection - THISFORM.Hide() - CLEAR EVENTS - ENDPROC + Procedure do_selection + Thisform.Hide() + Clear Events + Endproc - PROCEDURE cmd_Bin2Prg.Click - *-- Selección - THISFORM.n_ConversionType = 1 - THISFORM.do_selection() - ENDPROC + Procedure cmd_Bin2Prg.Click +*-- Selección + Thisform.n_ConversionType = 1 + Thisform.do_selection() + Endproc - PROCEDURE cmd_Prg2Bin.Click - *-- Selección - THISFORM.n_ConversionType = 2 - THISFORM.do_selection() - ENDPROC + Procedure cmd_Prg2Bin.Click +*-- Selección + Thisform.n_ConversionType = 2 + Thisform.do_selection() + Endproc - PROCEDURE cmd_None.Click - *-- Selección - THISFORM.n_ConversionType = 3 - THISFORM.do_selection() - ENDPROC + Procedure cmd_None.Click +*-- Selección + Thisform.n_ConversionType = 3 + Thisform.do_selection() + Endproc -ENDDEFINE +Enddefine -DEFINE CLASS frm_main AS form +Define Class frm_main As Form AllowOutput = .F. AlwaysOnTop = .T. AutoCenter = .T. - BackColor = (RGB(255,255,255)) + BackColor = (Rgb(255,255,255)) BorderStyle = 3 Caption = "FoxBin2Prg " Closable = .T. @@ -6081,11 +6081,11 @@ DEFINE CLASS frm_main AS form ShowWindow = 2 Width = 756 - ADD OBJECT 'edt_Help' AS editbox WITH ; + Add Object 'edt_Help' As EditBox With ; Anchor = 1+2+4+8, ; BackStyle = 0, ; BorderStyle = 0, ; - DisabledForeColor = (RGB(0,0,0)), ; + DisabledForeColor = (Rgb(0,0,0)), ; Enabled = .T., ; FontName = "Courier New", ; FontSize = 9, ; @@ -6097,7 +6097,7 @@ DEFINE CLASS frm_main AS form Top = 12, ; Width = 728 - ADD OBJECT 'cmd_Close' AS commandbutton WITH ; + Add Object 'cmd_Close' As CommandButton With ; Anchor = 4+8, ; Cancel = .T., ; Caption = "Close", ; @@ -6107,54 +6107,57 @@ DEFINE CLASS frm_main AS form Top = 344, ; Width = 84 - PROCEDURE Init - LPARAMETERS toFoxBin2Prg + Procedure Init + Lparameters toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL laDirInfo(1,5), loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Local laDirInfo(1,5), 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 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_FOXBIN2PRG_SYNTAX_INFO_LOC - ENDIF + If Pemstatus(_Screen, 'c_FB2PRG_EXE_Version', 5) Then + Thisform.Caption = 'FoxBin2Prg ' + _Screen.c_FB2PRG_EXE_Version + ' - ' + loLang.C_FOXBIN2PRG_SYNTAX_INFO_LOC + Endif - THISFORM.edt_help.Value = loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC - ENDIF + Thisform.edt_help.Value = loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC+; + STRTRAN(loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC_cfg,'&'+'&','')+; + loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC_tab_cfg - IF ADIR( laDirInfo, FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) > 0 THEN - THISFORM.Icon = FORCEEXT( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) - ENDIF - ENDIF + Endif - ENDPROC + If Adir( laDirInfo, Forceext( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) ) > 0 Then + Thisform.Icon = Forceext( toFoxBin2Prg.c_Foxbin2prg_FullPath, 'ICO' ) + Endif + Endif - PROCEDURE QueryUnload - CLEAR EVENTS - NODEFAULT + Endproc - ENDPROC + Procedure QueryUnload + Clear Events + Nodefault - PROCEDURE cmd_Close.Click - THISFORM.Hide() - CLEAR EVENTS + Endproc - ENDPROC + Procedure cmd_Close.Click + Thisform.Hide() + Clear Events -ENDDEFINE + Endproc + +Enddefine -DEFINE CLASS c_conversor_base AS Custom - #IF .F. - LOCAL THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' - #ENDIF - _MEMBERDATA = [] ; +Define Class c_conversor_base As Custom + #If .F. + Local This As c_conversor_base Of 'FOXBIN2PRG.PRG' + #Endif + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -6211,7 +6214,7 @@ DEFINE CLASS c_conversor_base AS Custom + [] - DIMENSION a_SpecialProps(1), a_SpecialProps_Chk(1), a_SpecialProps_Coll(1) ; + Dimension a_SpecialProps(1), a_SpecialProps_Chk(1), a_SpecialProps_Coll(1) ; , a_SpecialProps_Cbo(1), a_SpecialProps_Cmg(1), a_SpecialProps_Cmd(1), a_SpecialProps_Cur(1) ; , a_SpecialProps_CA(1), a_SpecialProps_DE(1), a_SpecialProps_Edt(1), a_SpecialProps_Frs(1) ; , a_SpecialProps_Grd(1), a_SpecialProps_Grc(1), a_SpecialProps_Grh(1), a_SpecialProps_Hlk(1) ; @@ -6240,517 +6243,526 @@ DEFINE CLASS c_conversor_base AS Custom l_ReportSort_Enabled = .T. c_OriginalFileName = '' c_ClaseActual = '' - oFSO = NULL + oFSO = Null n_Methods_LineNo = 0 && Número de línea del error dentro de "Methods" - PROCEDURE INIT - LOCAL lcSys16, lnPosProg - SET DELETED ON - SET DATE YMD - SET HOURS TO 24 - SET CENTURY ON - SET SAFETY OFF - SET MULTILOCKS ON - SET TABLEPROMPT OFF - SET BLOCKSIZE TO 0 - SET EXACT ON - IF NOT EMPTY( ON("ESCAPE") ) THEN - SET ESCAPE ON - ENDIF + Procedure Init + Local lcSys16, lnPosProg + Set Deleted On + Set Date YMD + Set Hours To 24 + Set Century On + Set Safety Off + Set Multilocks On + Set TablePrompt Off +*!* Changed by: Lutz Scheffler 21.02.2021 +*!* change date="{^2021-02-21,10:57:00}" +* Operation set to standard value +* anywhere else it will respect this to, +* so it's in the general settings or not - PUBLIC C_FB2PRG_CODE +* SET BLOCKSIZE TO 0 + +*!* /Changed by: Lutz Scheffler 21.02.2021 + + Set Exact On + If Not Empty( On("ESCAPE") ) Then + Set Escape On + Endif + + Public C_FB2PRG_CODE C_FB2PRG_CODE = '' && Contendrá todo el código generado - THIS.c_CurDir = SYS(5) + CURDIR() - THIS.oFSO = CREATEOBJECT( "Scripting.FileSystemObject") - lcSys16 = SYS(16) + This.c_CurDir = Sys(5) + Curdir() + This.oFSO = Createobject( "Scripting.FileSystemObject") + lcSys16 = Sys(16) - IF LEFT(lcSys16,10) == 'PROCEDURE ' - lnPosProg = AT(" ", lcSys16, 2) + 1 - ELSE + If Left(lcSys16,10) == 'PROCEDURE ' + lnPosProg = At(" ", lcSys16, 2) + 1 + Else lnPosProg = 1 - ENDIF + Endif - THIS.c_Foxbin2prg_FullPath = SUBSTR( lcSys16, lnPosProg ) - THIS.sortSpecialProps() - RELEASE lcSys16, lnPosProg - RETURN - ENDPROC + This.c_Foxbin2prg_FullPath = Substr( lcSys16, lnPosProg ) + This.sortSpecialProps() + Release lcSys16, lnPosProg + Return + Endproc - PROCEDURE DESTROY - LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Procedure Destroy + Local loLang As CL_LANG Of 'FOXBIN2PRG.PRG' C_FB2PRG_CODE = '' - USE IN (SELECT("TABLABIN")) - USE IN (SELECT("foxbin2prg_keywords")) + Use In (Select("TABLABIN")) + Use In (Select("foxbin2prg_keywords")) - *-- Esta comprobación es por los TESTS, que a veces no cargan o_FoxBin2Prg_Lang - IF VARTYPE(_SCREEN.o_FoxBin2Prg_Lang) = "O" THEN - loLang = _SCREEN.o_FoxBin2Prg_Lang - THIS.writeLog( loLang.C_CONVERTER_UNLOAD_LOC ) - ENDIF +*-- Esta comprobación es por los TESTS, que a veces no cargan o_FoxBin2Prg_Lang + If Vartype(_Screen.o_FoxBin2Prg_Lang) = "O" Then + loLang = _Screen.o_FoxBin2Prg_Lang + This.writeLog( loLang.C_CONVERTER_UNLOAD_LOC ) + Endif - THIS.oFSO = NULL - ENDPROC + This.oFSO = Null + Endproc - PROCEDURE analyzeAssignmentOf_TAG - *-- DETALLES: Este método está pensado para leer los tags FB2P_VALUE y MEMBERDATA, que tienen esta sintaxis: - * - * _memberdata = - * - * && XML Metadata for customizable properties - * - * Este es un valor especial - * - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcPropName (v! IN ) Nombre de la propiedad - * tcValue (v! IN ) Valor (o inicio del valor) de la propiedad - * taProps (!@ IN ) El array con las líneas del código donde buscar - * tnProp_Count (!@ IN ) Cantidad de líneas de código - * I (!@ IN ) Línea actualmente evaluada - * tcTAG_I (v! IN ) TAG de inicio - * tcTAG_F (v! IN ) TAG de fin - * tnLEN_TAG_I (v! IN ) Longitud del tag de inicio - * tnLEN_TAG_F (v! IN ) Longitud del tag de fin - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F + Procedure analyzeAssignmentOf_TAG +*-- DETALLES: Este método está pensado para leer los tags FB2P_VALUE y MEMBERDATA, que tienen esta sintaxis: +* +* _memberdata = +* +* && XML Metadata for customizable properties +* +* Este es un valor especial +* +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcPropName (v! IN ) Nombre de la propiedad +* tcValue (v! IN ) Valor (o inicio del valor) de la propiedad +* taProps (!@ IN ) El array con las líneas del código donde buscar +* tnProp_Count (!@ IN ) Cantidad de líneas de código +* I (!@ IN ) Línea actualmente evaluada +* tcTAG_I (v! IN ) TAG de inicio +* tcTAG_F (v! IN ) TAG de fin +* tnLEN_TAG_I (v! IN ) Longitud del tag de inicio +* tnLEN_TAG_F (v! IN ) Longitud del tag de fin +*-------------------------------------------------------------------------------------------------------------- + Lparameters tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F - EXTERNAL ARRAY taProps + External Array taProps - LOCAL llBloqueEncontrado, loEx AS EXCEPTION + Local llBloqueEncontrado, loEx As Exception - TRY - IF LEFT( tcValue, tnLEN_TAG_I) == tcTAG_I - llBloqueEncontrado = .T. - LOCAL lcLine, lnArrayCols + Try + If Left( tcValue, tnLEN_TAG_I) == tcTAG_I + 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" - .denormalizePropertyValue( @tcPropName, @tcValue, '' ) - EXIT - ENDIF - - tcValue = '' - lnArrayCols = ALEN(taProps,2) - - FOR I = m.I + 1 TO tnProp_Count - IF lnArrayCols = 0 - lcLine = LTRIM( taProps(m.I), 0, ' ', CHR(9) ) && Quito espacios y TABS de la izquierda - ELSE - lcLine = LTRIM( taProps(m.I,1), 0, ' ', CHR(9) ) && Quito espacios y TABS de la izquierda - ENDIF - - DO CASE - CASE LEFT( lcLine, tnLEN_TAG_F ) == tcTAG_F - *-- - tcValue = tcTAG_I + SUBSTR( tcValue, 3 ) + tcTAG_F +*-- Propiedad especial + If tcTAG_F $ tcValue && El fin de tag está "inline" .denormalizePropertyValue( @tcPropName, @tcValue, '' ) - I = m.I + 1 - EXIT + Exit + Endif - CASE tcTAG_F $ lcLine - *-- Data-Data-Data- - tcValue = tcTAG_I + SUBSTR( tcValue, 3 ) + LEFT( lcLine, AT( tcTAG_F, lcLine )-1 ) + tcTAG_F - .denormalizePropertyValue( @tcPropName, @tcValue, '' ) - I = m.I + 1 - EXIT + tcValue = '' + lnArrayCols = Alen(taProps,2) - OTHERWISE - *-- Data - tcValue = tcValue + CR_LF + lcLine - ENDCASE - ENDFOR + For I = m.I + 1 To tnProp_Count + If lnArrayCols = 0 + lcLine = Ltrim( taProps(m.I), 0, ' ', Chr(9) ) && Quito espacios y TABS de la izquierda + Else + lcLine = Ltrim( taProps(m.I,1), 0, ' ', Chr(9) ) && Quito espacios y TABS de la izquierda + Endif - ENDWITH && THIS + Do Case + Case Left( lcLine, tnLEN_TAG_F ) == tcTAG_F +*-- + tcValue = tcTAG_I + Substr( tcValue, 3 ) + tcTAG_F + .denormalizePropertyValue( @tcPropName, @tcValue, '' ) + I = m.I + 1 + Exit - I = m.I - 1 + Case tcTAG_F $ lcLine +*-- Data-Data-Data- + tcValue = tcTAG_I + Substr( tcValue, 3 ) + Left( lcLine, At( tcTAG_F, lcLine )-1 ) + tcTAG_F + .denormalizePropertyValue( @tcPropName, @tcValue, '' ) + I = m.I + 1 + Exit - ENDIF + Otherwise +*-- Data + tcValue = tcValue + CR_LF + lcLine + Endcase + Endfor - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Endwith && THIS - THROW + I = m.I - 1 - FINALLY - RELEASE tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F, loEx - ENDTRY + Endif - RETURN llBloqueEncontrado - ENDPROC + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F, loEx + Endtry + + Return llBloqueEncontrado + Endproc - PROCEDURE updateProgressbar - LPARAMETERS tcTexto, tnValor, tnTotal, tnTipo - ENDPROC + Procedure updateProgressbar + Lparameters tcTexto, tnValor, tnTotal, tnTipo + Endproc - PROCEDURE findMethodsObjectByName - LPARAMETERS tcNombreObjeto, toClase - *-- Caso 1: Un método de un objeto de la clase - *-- findMethodsObjectByName( 'command1', loClase ) - *-- Caso 2: Un método de un objeto heredado que no está definido en esta librería - *-- findMethodsObjectByName( 'cnt_descripcion.Cntlista.cmgAceptarCancelar.cmdCancelar', loClase ) - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + Procedure findMethodsObjectByName + Lparameters tcNombreObjeto, toClase +*-- Caso 1: Un método de un objeto de la clase +*-- findMethodsObjectByName( 'command1', loClase ) +*-- Caso 2: Un método de un objeto heredado que no está definido en esta librería +*-- findMethodsObjectByName( 'cnt_descripcion.Cntlista.cmgAceptarCancelar.cmdCancelar', loClase ) + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lnObjeto, I, X, N, lcRutaDelNombre ; - , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - STORE 0 TO N, lnObjeto + Try + Local lnObjeto, I, X, N, lcRutaDelNombre ; + , loObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + Store 0 To N, lnObjeto - *-- El método puede pertenecer a esta clase, a un objeto de esta clase, - *-- o a un objeto heredado que no está definido en esta clase, sino en otra, - *-- y para la cual la ruta a buscar es parcial. - *-- Por ejemplo, el caso 2 puede que el objeto que hay sea 'cnt_descripcion.Cntlista' - *-- y el botón sea heredado, pero se le haya redefinido su método Click aquí. - FOR X = OCCURS( '.', tcNombreObjeto + '.' ) TO 1 STEP -1 - N = N + 1 - lcRutaDelNombre = LEFT( tcNombreObjeto, RAT( '.', tcNombreObjeto + '.', N ) - 1 ) - FOR I = 1 TO toClase._AddObject_Count - loObjeto = toClase._AddObjects(m.I) +*-- El método puede pertenecer a esta clase, a un objeto de esta clase, +*-- o a un objeto heredado que no está definido en esta clase, sino en otra, +*-- y para la cual la ruta a buscar es parcial. +*-- Por ejemplo, el caso 2 puede que el objeto que hay sea 'cnt_descripcion.Cntlista' +*-- y el botón sea heredado, pero se le haya redefinido su método Click aquí. + For X = Occurs( '.', tcNombreObjeto + '.' ) To 1 Step -1 + N = N + 1 + lcRutaDelNombre = Left( tcNombreObjeto, Rat( '.', tcNombreObjeto + '.', N ) - 1 ) + For I = 1 To toClase._AddObject_Count + loObjeto = toClase._AddObjects(m.I) - *-- Busco tanto el [nombre] del método como [class.nombre]+[nombre] del método - IF LOWER(loObjeto._Nombre) == LOWER(toClase._ObjName) + '.' + lcRutaDelNombre ; - OR LOWER(loObjeto._Nombre) == lcRutaDelNombre - lnObjeto = m.I - EXIT - ENDIF +*-- Busco tanto el [nombre] del método como [class.nombre]+[nombre] del método + If Lower(loObjeto._Nombre) == Lower(toClase._ObjName) + '.' + lcRutaDelNombre ; + OR Lower(loObjeto._Nombre) == lcRutaDelNombre + lnObjeto = m.I + Exit + Endif - loObjeto = NULL - ENDFOR - IF lnObjeto > 0 - EXIT - ENDIF - ENDFOR + loObjeto = Null + Endfor + If lnObjeto > 0 + Exit + Endif + Endfor - CATCH TO loEx - lnCodError = loEx.ERRORNO + Catch To loEx + lnCodError = loEx.ErrorNo - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcNombreObjeto, toClase, I, X, N, lcRutaDelNombre, loObjeto - ENDTRY + Finally + Release tcNombreObjeto, toClase, I, X, N, lcRutaDelNombre, loObjeto + Endtry - RETURN lnObjeto - ENDPROC + Return lnObjeto + Endproc - FUNCTION verifyValidExpression - LPARAMETERS tcAsignacion, tnCodError, tcExpNormalizada - LOCAL llError, loEx AS EXCEPTION + Function verifyValidExpression + Lparameters tcAsignacion, tnCodError, tcExpNormalizada + Local llError, loEx As Exception - TRY - tcExpNormalizada = NORMALIZE( tcAsignacion ) + Try + tcExpNormalizada = Normalize( tcAsignacion ) - CATCH TO loEx - llError = .T. - tnCodError = loEx.ERRORNO + Catch To loEx + llError = .T. + tnCodError = loEx.ErrorNo - FINALLY - RELEASE tcAsignacion, tnCodError, tcExpNormalizada, loEx - ENDTRY + Finally + Release tcAsignacion, tnCodError, tcExpNormalizada, loEx + Endtry - RETURN NOT llError - ENDFUNC + Return Not llError + Endfunc - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (!@ IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - *THIS.writeLog( '' ) - THIS.writeLog( C_TAB + loLang.C_CONVERTING_FILE_LOC + ' ' + THIS.c_OutputFile + '...' ) - RELEASE toModulo, toEx, toFoxBin2Prg, loLang - RETURN - ENDPROC + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (!@ IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toModulo, toEx As Exception, toFoxBin2Prg + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + Local loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang +*THIS.writeLog( '' ) + This.writeLog( C_TAB + loLang.C_CONVERTING_FILE_LOC + ' ' + This.c_OutputFile + '...' ) + Release toModulo, toEx, toFoxBin2Prg, loLang + Return + Endproc - PROCEDURE currentLineIsPreviousLineContinuation - LPARAMETERS taCodeLines, I + Procedure currentLineIsPreviousLineContinuation + Lparameters taCodeLines, I - LOCAL lcPrevLine, llIsContinuation + Local lcPrevLine, llIsContinuation - *-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación - IF m.I > 1 +*-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación + If m.I > 1 lcPrevLine = taCodeLines(m.I-1) - ELSE + Else lcPrevLine = '' - ENDIF + Endif - THIS.get_SeparatedLineAndComment( @lcPrevLine ) + This.get_SeparatedLineAndComment( @lcPrevLine ) - IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior + If Inlist( Right( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior llIsContinuation = .T. - ENDIF + Endif - RELEASE taCodeLines, I, lcPrevLine + Release taCodeLines, I, lcPrevLine - RETURN llIsContinuation - ENDPROC + Return llIsContinuation + Endproc - PROCEDURE isIndicatedToken - LPARAMETERS tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin - LOCAL llEncontrado, lcWord, lcWord2, lcLine, lnWordCount + Procedure isIndicatedToken + Lparameters tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin + Local llEncontrado, lcWord, lcWord2, lcLine, lnWordCount - TRY - *-- Pre-normalización - lcLine = tcLine + Try +*-- Pre-normalización + lcLine = tcLine - IF tnIniFin = 1 - *-- TOKENS DE INICIO - IF UPPER( LEFT( lcLine, ta_ID_Bloques(m.X,3) ) ) == ta_ID_Bloques(m.X,1) - *-- Evaluar casos especiales - lcWord = UPPER( ALLTRIM(GETWORDNUM(lcLine,1) ) ) + If tnIniFin = 1 +*-- TOKENS DE INICIO + If Upper( Left( lcLine, ta_ID_Bloques(m.X,3) ) ) == ta_ID_Bloques(m.X,1) +*-- Evaluar casos especiales + lcWord = Upper( Alltrim(Getwordnum(lcLine,1) ) ) - IF ta_ID_Bloques(m.X,1) == 'TEXT' THEN - lcLine = UPPER( lcLine ) + ' ' - lnWordCount = GETWORDCOUNT(lcLine) + If ta_ID_Bloques(m.X,1) == 'TEXT' Then + lcLine = Upper( lcLine ) + ' ' + lnWordCount = Getwordcount(lcLine) - IF lnWordCount >= 2 - lcWord2 = ALLTRIM(GETWORDNUM(lcLine,2) ) - ENDIF + If lnWordCount >= 2 + lcWord2 = Alltrim(Getwordnum(lcLine,2) ) + Endif - DO CASE - CASE NOT lcWord == 'TEXT' - EXIT + Do Case + Case Not lcWord == 'TEXT' + Exit - *CASE UPPER( LEFT( CHRTRAN( lcLine, ' ', '' ), 5 ) ) == 'TEXT=' - * EXIT - CASE lnWordCount >= 2 - IF lcWord2 == "TO" - * OK, es TEXT TO... - ELSE - * Luego de TEXT sigue cualquier otra cosa, así que puede ser - * un campo, variable, etc, que lo han llamado TEXT. - EXIT - ENDIF +*CASE UPPER( LEFT( CHRTRAN( lcLine, ' ', '' ), 5 ) ) == 'TEXT=' +* EXIT + Case lnWordCount >= 2 + If lcWord2 == "TO" +* OK, es TEXT TO... + Else +* Luego de TEXT sigue cualquier otra cosa, así que puede ser +* un campo, variable, etc, que lo han llamado TEXT. + Exit + Endif - OTHERWISE - * OK, es TEXT sin más. - ENDCASE - ENDIF + Otherwise +* OK, es TEXT sin más. + Endcase + Endif - llEncontrado = .T. - ENDIF - ELSE - *-- TOKENS DE FIN - IF UPPER( LEFT( lcLine, ta_ID_Bloques(m.X,4) ) ) == ta_ID_Bloques(m.X,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc) - *-- Evaluar casos especiales - lcWord = UPPER( ALLTRIM(GETWORDNUM(lcLine,1) ) ) + llEncontrado = .T. + Endif + Else +*-- TOKENS DE FIN + If Upper( Left( lcLine, ta_ID_Bloques(m.X,4) ) ) == ta_ID_Bloques(m.X,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc) +*-- Evaluar casos especiales + lcWord = Upper( Alltrim(Getwordnum(lcLine,1) ) ) - IF ta_ID_Bloques(m.X,2) == 'ENDT' AND NOT lcWord == LEFT( 'ENDTEXT', LEN(lcWord) ) - EXIT - ENDIF + If ta_ID_Bloques(m.X,2) == 'ENDT' And Not lcWord == Left( 'ENDTEXT', Len(lcWord) ) + Exit + Endif - llEncontrado = .T. - ENDIF - ENDIF + llEncontrado = .T. + Endif + Endif - FINALLY - RELEASE tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin, lcLine - ENDTRY + Finally + Release tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin, lcLine + Endtry - RETURN llEncontrado - ENDPROC + Return llEncontrado + Endproc - PROCEDURE decode_SpecialCodes_1_31 - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcText (!@ IN ) Decodifica los primeros 31 caracteres ASCII de {nCode} a CHR(nCode) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcText - LOCAL I - FOR I = 0 TO 31 - tcText = STRTRAN( tcText, '{' + TRANSFORM(m.I) + '}', CHR(m.I) ) - ENDFOR - RELEASE I - RETURN tcText - ENDPROC + Procedure decode_SpecialCodes_1_31 +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcText (!@ IN ) Decodifica los primeros 31 caracteres ASCII de {nCode} a CHR(nCode) +*--------------------------------------------------------------------------------------------------- + Lparameters tcText + Local I + For I = 0 To 31 + tcText = Strtran( tcText, '{' + Transform(m.I) + '}', Chr(m.I) ) + Endfor + Release I + Return tcText + Endproc - PROCEDURE decode_SpecialCodes_CR_LF - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcText (!@ IN ) Decodifica los caracteres ASCII 10 y 13 de {nCode} a CHR(nCode) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcText - tcText = STRTRAN( STRTRAN( tcText, '{10}', CHR(10) ), '{13}', CHR(13) ) - RETURN tcText - ENDPROC + Procedure decode_SpecialCodes_CR_LF +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcText (!@ IN ) Decodifica los caracteres ASCII 10 y 13 de {nCode} a CHR(nCode) +*--------------------------------------------------------------------------------------------------- + Lparameters tcText + tcText = Strtran( Strtran( tcText, '{10}', Chr(10) ), '{13}', Chr(13) ) + Return tcText + Endproc - PROCEDURE denormalizeAssignment - LPARAMETERS tcAsignacion - LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario + Procedure denormalizeAssignment + 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 = '' .denormalizePropertyValue( @lcPropName, @lcValor, @lcComentario ) tcAsignacion = lcPropName + ' = ' + lcValor - ENDWITH + Endwith - RELEASE lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario - RETURN tcAsignacion - ENDPROC + Release lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario + Return tcAsignacion + Endproc - PROCEDURE denormalizePropertyValue - *-- Este método se ejecuta cuando se regenera el binario desde el tx2 - LPARAMETERS tcProp, tcValue, tcComentario - LOCAL lnCodError, lnPos, lcValue + Procedure denormalizePropertyValue +*-- Este método se ejecuta cuando se regenera el binario desde el tx2 + Lparameters tcProp, tcValue, tcComentario + Local lnCodError, lnPos, lcValue tcComentario = '' - *-- Ajustes de algunos casos especiales - DO CASE - CASE tcProp == '_memberdata' - *-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio - lcValue = '' +*-- Ajustes de algunos casos especiales + Do Case + Case tcProp == '_memberdata' +*-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio + lcValue = '' - FOR I = 1 TO OCCURS( '/>', tcValue ) - * issue#16: memberdata property should be saved in compressed format - lcValue = lcValue + CHRTRAN( STREXTRACT( tcValue, '', m.I, 1+4 ), CR_LF, ' ' ) - ENDFOR + For I = 1 To Occurs( '/>', tcValue ) +* issue#16: memberdata property should be saved in compressed format + lcValue = lcValue + Chrtran( Strextract( tcValue, '', m.I, 1+4 ), CR_LF, ' ' ) + Endfor - * issue#16: memberdata property should be saved in compressed format - TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 +* issue#16: memberdata property should be saved in compressed format + TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - ENDTEXT + ENDTEXT - IF LEN(lcValue) > 255 - tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue - ELSE - tcValue = CHRTRAN( tcValue, CR_LF, '' ) - ENDIF + If Len(lcValue) > 255 + tcValue = C_MPROPHEADER + Str( Len(tcValue), 8 ) + tcValue + Else + tcValue = Chrtran( tcValue, CR_LF, '' ) + Endif - CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I - *-- Valor especial Fox con cabecera CHR(1): Debo agregarla y desnormalizar el valor - tcValue = STRTRAN( STRTRAN( STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ), ' ', C_CR ), ' ', C_LF ) - tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue + Case Left( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I +*-- Valor especial Fox con cabecera CHR(1): Debo agregarla y desnormalizar el valor + tcValue = Strtran( Strtran( Strextract( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ), ' ', C_CR ), ' ', C_LF ) + tcValue = C_MPROPHEADER + Str( Len(tcValue), 8 ) + tcValue - ENDCASE + Endcase - RELEASE tcProp, tcComentario, lnCodError, lnPos, lcValue - RETURN tcValue - ENDPROC + Release tcProp, tcComentario, lnCodError, lnPos, lcValue + Return tcValue + Endproc - PROCEDURE denormalizeXMLValue - LPARAMETERS tcValor - *-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES. - LOCAL lnPos, lnPos2, lnAscii - tcValor = STRTRAN(tcValor, CHR(38)+'gt;', '>') && > - tcValor = STRTRAN(tcValor, CHR(38)+'lt;', '<') && < - tcValor = STRTRAN(tcValor, CHR(38)+'quot;', CHR(34)) && " - tcValor = STRTRAN(tcValor, CHR(38)+'apos;', CHR(39)) && ' - tcValor = STRTRAN(tcValor, CHR(38)+'amp;', CHR(38)) && & + Procedure denormalizeXMLValue + Lparameters tcValor +*-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES. + Local lnPos, lnPos2, lnAscii + tcValor = Strtran(tcValor, Chr(38)+'gt;', '>') && > + tcValor = Strtran(tcValor, Chr(38)+'lt;', '<') && < + tcValor = Strtran(tcValor, Chr(38)+'quot;', Chr(34)) && " + tcValor = Strtran(tcValor, Chr(38)+'apos;', Chr(39)) && ' + tcValor = Strtran(tcValor, Chr(38)+'amp;', Chr(38)) && & - *-- Obtengo los Hex - DO WHILE .T. - lnPos = AT( CHR(38)+'#x', tcValor ) - IF lnPos = 0 - EXIT - ENDIF - lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) ) - lnAscii = EVALUATE( '0' + SUBSTR( tcValor, lnPos + 3, lnPos2 - lnPos - 3 ) ) - tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII - ENDDO +*-- Obtengo los Hex + Do While .T. + lnPos = At( Chr(38)+'#x', tcValor ) + If lnPos = 0 + Exit + Endif + lnPos2 = lnPos + 1 + At( ';', Substr( tcValor, lnPos + 2, 4 ) ) + lnAscii = Evaluate( '0' + Substr( tcValor, lnPos + 3, lnPos2 - lnPos - 3 ) ) + tcValor = Stuff(tcValor, lnPos, lnPos2 - lnPos + 1, Chr(lnAscii)) && ASCII + Enddo - *-- Obtengo los Dec - DO WHILE .T. - lnPos = AT( CHR(38)+'#', tcValor ) - IF lnPos = 0 - EXIT - ENDIF - lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) ) - lnAscii = EVALUATE( SUBSTR( tcValor, lnPos + 2, lnPos2 - lnPos - 2 ) ) - tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII - ENDDO +*-- Obtengo los Dec + Do While .T. + lnPos = At( Chr(38)+'#', tcValor ) + If lnPos = 0 + Exit + Endif + lnPos2 = lnPos + 1 + At( ';', Substr( tcValor, lnPos + 2, 4 ) ) + lnAscii = Evaluate( Substr( tcValor, lnPos + 2, lnPos2 - lnPos - 2 ) ) + tcValor = Stuff(tcValor, lnPos, lnPos2 - lnPos + 1, Chr(lnAscii)) && ASCII + Enddo - RELEASE lnPos, lnPos2, lnAscii - RETURN tcValor - ENDPROC + Release lnPos, lnPos2, lnAscii + Return tcValor + Endproc - PROCEDURE encode_SpecialCodes_1_31 - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcText (!@ IN ) Decodifica los primeros 31 caracteres ASCII de CHR(nCode) a {nCode} - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcText - LOCAL I - FOR I = 0 TO 31 - tcText = STRTRAN( tcText, CHR(m.I), '{' + TRANSFORM(m.I) + '}' ) - ENDFOR - RELEASE I - RETURN tcText - ENDPROC + Procedure encode_SpecialCodes_1_31 +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcText (!@ IN ) Decodifica los primeros 31 caracteres ASCII de CHR(nCode) a {nCode} +*--------------------------------------------------------------------------------------------------- + Lparameters tcText + Local I + For I = 0 To 31 + tcText = Strtran( tcText, Chr(m.I), '{' + Transform(m.I) + '}' ) + Endfor + Release I + Return tcText + Endproc - PROCEDURE encode_SpecialCodes_CR_LF - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcText (!@ IN ) Codifica los caracteres ASCII 10 y 13 de CHR(nCode) a {nCode} - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcText - tcText = STRTRAN( STRTRAN( tcText, CHR(10), '{10}' ), CHR(13), '{13}' ) - RETURN tcText - ENDPROC + Procedure encode_SpecialCodes_CR_LF +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcText (!@ IN ) Codifica los caracteres ASCII 10 y 13 de CHR(nCode) a {nCode} +*--------------------------------------------------------------------------------------------------- + Lparameters tcText + tcText = Strtran( Strtran( tcText, Chr(10), '{10}' ), Chr(13), '{13}' ) + Return tcText + Endproc - HIDDEN PROCEDURE exception2Str - LPARAMETERS toEx AS EXCEPTION - LOCAL lcError - lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CHR(13) + CHR(13) ; - + toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CHR(13) + CHR(13) ; - + toEx.LINECONTENTS - RELEASE toEx - RETURN lcError - ENDPROC + Hidden Procedure exception2Str + Lparameters toEx As Exception + Local lcError + lcError = 'Error ' + Transform(toEx.ErrorNo) + ', ' + toEx.Message + Chr(13) + Chr(13) ; + + toEx.Procedure + ', ' + Transform(toEx.Lineno) + Chr(13) + Chr(13) ; + + toEx.LineContents + Release toEx + Return lcError + Endproc - PROCEDURE fileTypeCode - LPARAMETERS tcExtension, tcOriginalType - tcExtension = UPPER(tcExtension) - RETURN ICASE( tcExtension = 'DBC', 'd' ; - , tcExtension = 'DBF', EVL(tcOriginalType, 'D') ; + Procedure fileTypeCode + Lparameters tcExtension, tcOriginalType + tcExtension = Upper(tcExtension) + Return Icase( tcExtension = 'DBC', 'd' ; + , tcExtension = 'DBF', Evl(tcOriginalType, 'D') ; , tcExtension = 'QPR', 'Q' ; , tcExtension = 'SCX', 'K' ; , tcExtension = 'FRX', 'R' ; @@ -6766,183 +6778,183 @@ DEFINE CLASS c_conversor_base AS Custom , tcExtension = 'H', 'T' ; , tcExtension = 'SPR', 'E' ; , tcExtension = 'MPR', 'P' ; - , EVL(tcOriginalType, 'x') ) - ENDPROC + , Evl(tcOriginalType, 'x') ) + Endproc - FUNCTION getTimeStamp - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tnTimeStamp (v! IN ) Timestamp en formato numérico - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tnTimeStamp - *-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME - TRY - LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ltTimeStamp,lnResto ; - ,lcTimeStamp_Ret, laDirInfo[1,5], loEx AS EXCEPTION + Function getTimeStamp +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tnTimeStamp (v! IN ) Timestamp en formato numérico +*--------------------------------------------------------------------------------------------------- + Lparameters tnTimeStamp +*-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME + Try + 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' - lcTimeStamp_Ret = '' + With This As c_conversor_base Of 'FOXBIN2PRG.PRG' + lcTimeStamp_Ret = '' - IF EMPTY(tnTimeStamp) - IF .lFileMode - IF ADIR(laDirInfo,.c_InputFile)=0 - EXIT - ENDIF + If Empty(tnTimeStamp) + If .lFileMode + If Adir(laDirInfo,.c_InputFile)=0 + Exit + Endif - ltTimeStamp = EVALUATE( '{^' + DTOC(laDirInfo(1,3)) + ' ' + TRANSFORM(laDirInfo(1,4)) + '}' ) + ltTimeStamp = Evaluate( '{^' + Dtoc(laDirInfo(1,3)) + ' ' + Transform(laDirInfo(1,4)) + '}' ) - *-- En mi arreglo, si la hora pasada tiene 32 segundos o más, redondeo al siguiente minuto, ya que - *-- la descodificación posterior de getTimeStamp tiene ese margen de error. - IF SEC(m.ltTimeStamp) >= 32 - ltTimeStamp = m.ltTimeStamp + 28 - ENDIF +*-- En mi arreglo, si la hora pasada tiene 32 segundos o más, redondeo al siguiente minuto, ya que +*-- la descodificación posterior de getTimeStamp tiene ese margen de error. + If Sec(m.ltTimeStamp) >= 32 + ltTimeStamp = m.ltTimeStamp + 28 + Endif - lcTimeStamp_Ret = TTOC( ltTimeStamp ) - EXIT - ENDIF + lcTimeStamp_Ret = Ttoc( ltTimeStamp ) + Exit + Endif - tnTimeStamp = .n_ClassTimeStamp + tnTimeStamp = .n_ClassTimeStamp - IF EMPTY(tnTimeStamp) - EXIT - ENDIF - ENDIF + If Empty(tnTimeStamp) + Exit + Endif + Endif - *-- YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS - lnResto = tnTimeStamp - lnYear = INT( lnResto / 2**25 + 1980) - lnResto = lnResto % 2**25 - lnMonth = INT( lnResto / 2**21 ) - lnResto = lnResto % 2**21 - lnDay = INT( lnResto / 2**16 ) - lnResto = lnResto % 2**16 - lnHour = INT( lnResto / 2**11 ) - lnResto = lnResto % 2**11 - lnMinutes = INT( lnResto / 2**5 ) - lnResto = lnResto % 2**5 - lnSeconds = lnResto +*-- YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS + lnResto = tnTimeStamp + lnYear = Int( lnResto / 2**25 + 1980) + lnResto = lnResto % 2**25 + lnMonth = Int( lnResto / 2**21 ) + lnResto = lnResto % 2**21 + lnDay = Int( lnResto / 2**16 ) + lnResto = lnResto % 2**16 + lnHour = Int( lnResto / 2**11 ) + lnResto = lnResto % 2**11 + lnMinutes = Int( lnResto / 2**5 ) + lnResto = lnResto % 2**5 + lnSeconds = lnResto - lcTimeStamp = PADL(lnYear,4,'0') + "/" + PADL(lnMonth,2,'0') + "/" + PADL(lnDay,2,'0') + " " ; - + PADL(lnHour,2,'0') + ":" + PADL(lnMinutes,2,'0') + ":" + PADL(lnSeconds,2,'0') + lcTimeStamp = Padl(lnYear,4,'0') + "/" + Padl(lnMonth,2,'0') + "/" + Padl(lnDay,2,'0') + " " ; + + Padl(lnHour,2,'0') + ":" + Padl(lnMinutes,2,'0') + ":" + Padl(lnSeconds,2,'0') - ltTimeStamp = EVALUATE( "{^" + lcTimeStamp + "}" ) + ltTimeStamp = Evaluate( "{^" + lcTimeStamp + "}" ) - lcTimeStamp_Ret = TTOC( ltTimeStamp ) - ENDWITH + lcTimeStamp_Ret = Ttoc( ltTimeStamp ) + Endwith - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - ENDTRY + Endtry - RETURN lcTimeStamp_Ret - ENDFUNC + Return lcTimeStamp_Ret + Endfunc - PROCEDURE get_ListNamesWithValuesFrom_InLine_MetadataTag - *-- OBTENGO EL ARRAY DE DATOS Y VALORES DE LA LINEA DE METADATOS INDICADA - *-- NOTA: Los valores NO PUEDEN contener comillas dobles en su valor, ya que generaría un error al parsearlos. - *-- Ejemplo: - *< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> - *< OLE: Nombre="frm_form.Pageframe1.Page1.Cnt_controles_h.Olecontrol1" Parent="frm_form.Pageframe1.Page1.Cnt_controles_h" ObjName="Olecontrol1" Checksum="1685567300" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPg...ADAP7AAAA==" /> - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLineWithMetadata (!@ IN ) Línea con metadatos y un tag de metadatos - * taPropsAndValues (!@ OUT) Array a devolver con las propiedades y valores encontrados - * tnPropsAndValues_Count (!@ OUT) Cantidad de propiedades encontradas - * tcLeftTag (v! IN ) TAG de inicio de los metadatos - * tcRightTag (v! IN ) TAG de fin de los metadatos - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag + Procedure get_ListNamesWithValuesFrom_InLine_MetadataTag +*-- OBTENGO EL ARRAY DE DATOS Y VALORES DE LA LINEA DE METADATOS INDICADA +*-- NOTA: Los valores NO PUEDEN contener comillas dobles en su valor, ya que generaría un error al parsearlos. +*-- Ejemplo: +*< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> +*< OLE: Nombre="frm_form.Pageframe1.Page1.Cnt_controles_h.Olecontrol1" Parent="frm_form.Pageframe1.Page1.Cnt_controles_h" ObjName="Olecontrol1" Checksum="1685567300" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPg...ADAP7AAAA==" /> +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcLineWithMetadata (!@ IN ) Línea con metadatos y un tag de metadatos +* taPropsAndValues (!@ OUT) Array a devolver con las propiedades y valores encontrados +* tnPropsAndValues_Count (!@ OUT) Cantidad de propiedades encontradas +* tcLeftTag (v! IN ) TAG de inicio de los metadatos +* tcRightTag (v! IN ) TAG de fin de los metadatos +*-------------------------------------------------------------------------------------------------------------- + Lparameters tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag - EXTERNAL ARRAY taPropsAndValues + External Array taPropsAndValues - LOCAL lcMetadatos, I, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , loEx as Exception + Local lcMetadatos, I, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , loEx As Exception - TRY - loLang = _SCREEN.o_FoxBin2Prg_Lang - STORE '' TO lcVirtualMeta - STORE 0 TO lnPos1, lnPos2, lnLastPos, tnPropsAndValues_Count, I + Try + loLang = _Screen.o_FoxBin2Prg_Lang + Store '' To lcVirtualMeta + Store 0 To lnPos1, lnPos2, lnLastPos, tnPropsAndValues_Count, I - lcMetadatos = ALLTRIM( STREXTRACT( tcLineWithMetadata, tcLeftTag, tcRightTag, 1, 1) ) + lcMetadatos = Alltrim( Strextract( tcLineWithMetadata, tcLeftTag, tcRightTag, 1, 1) ) - IF EMPTY(lcMetadatos) - * Puede que la línea esté separada con un CR erróneo. El usuario debe revisarlo - ERROR (TEXTMERGE("Can't identify Metadata TAG '<>'. May be the Source line have an extra CR/LF?")) - ENDIF + If Empty(lcMetadatos) +* Puede que la línea esté separada con un CR erróneo. El usuario debe revisarlo + Error (Textmerge("Can't identify Metadata TAG '<>'. May be the Source line have an extra CR/LF?")) + Endif - lnCantComillas = OCCURS( '"', lcMetadatos ) + lnCantComillas = Occurs( '"', lcMetadatos ) - IF lnCantComillas % 2 <> 0 && Valido que las comillas "" sean pares - *ERROR "Error de datos: No se puede parsear porque las comillas no son pares en la línea [" + lcMetadatos + "]" - ERROR (TEXTMERGE(loLang.C_DATA_ERROR_CANT_PARSE_UNPAIRING_DOUBLE_QUOTES_LOC)) - ENDIF + If lnCantComillas % 2 <> 0 && Valido que las comillas "" sean pares +*ERROR "Error de datos: No se puede parsear porque las comillas no son pares en la línea [" + lcMetadatos + "]" + Error (Textmerge(loLang.C_DATA_ERROR_CANT_PARSE_UNPAIRING_DOUBLE_QUOTES_LOC)) + Endif - lnLastPos = 1 - DIMENSION taPropsAndValues( lnCantComillas / 2, 2 ) + lnLastPos = 1 + Dimension taPropsAndValues( lnCantComillas / 2, 2 ) - *------------------------------------------------------------------------------------- - * IMPORTANTE!! - * ------------ - * SI SE SEPARAN LAS IGUALDADES CON ESPACIOS, ÉSTAS DEJAN DE RECONOCERSE!! (prop = "valor" en vez de prop="valor") - * TENER EN CUENTA AL GENERAR EL TEXTO O AL MODIFICARLO MANUALMENTE AL MERGEAR - *------------------------------------------------------------------------------------- - FOR I = 1 TO lnCantComillas STEP 2 - tnPropsAndValues_Count = tnPropsAndValues_Count + 1 +*------------------------------------------------------------------------------------- +* IMPORTANTE!! +* ------------ +* SI SE SEPARAN LAS IGUALDADES CON ESPACIOS, ÉSTAS DEJAN DE RECONOCERSE!! (prop = "valor" en vez de prop="valor") +* TENER EN CUENTA AL GENERAR EL TEXTO O AL MODIFICARLO MANUALMENTE AL MERGEAR +*------------------------------------------------------------------------------------- + For I = 1 To lnCantComillas Step 2 + tnPropsAndValues_Count = tnPropsAndValues_Count + 1 - * Type="V" Cpid="1252" - * ^ ^ => Posiciones del par de comillas dobles - lnPos1 = AT( '"', lcMetadatos, m.I ) - lnPos2 = AT( '"', lcMetadatos, m.I + 1 ) +* Type="V" Cpid="1252" +* ^ ^ => Posiciones del par de comillas dobles + lnPos1 = At( '"', lcMetadatos, m.I ) + lnPos2 = At( '"', lcMetadatos, m.I + 1 ) - * Type="V" Cpid="1252" - * ^ ^ ^ => LastPos, lnPos1 y lnPos2 - taPropsAndValues(tnPropsAndValues_Count,1) = ALLTRIM( GETWORDNUM( SUBSTR( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) ) - taPropsAndValues(tnPropsAndValues_Count,2) = SUBSTR( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 ) +* Type="V" Cpid="1252" +* ^ ^ ^ => LastPos, lnPos1 y lnPos2 + taPropsAndValues(tnPropsAndValues_Count,1) = Alltrim( Getwordnum( Substr( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) ) + taPropsAndValues(tnPropsAndValues_Count,2) = Substr( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 ) - lnLastPos = lnPos2 + 1 - ENDFOR + lnLastPos = lnPos2 + 1 + Endfor - CATCH TO loEx - loEx.UserValue = loEx.UserValue + TEXTMERGE('I=<>, lcMetadatos="<>", tcLineWithMetadata="<>"') + CR_LF - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + loEx.UserValue = loEx.UserValue + Textmerge('I=<>, lcMetadatos="<>", tcLineWithMetadata="<>"') + CR_LF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag ; - , lcMetadatos, I, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas + Finally + Release tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag ; + , lcMetadatos, I, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE get_SeparatedLineAndComment - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLine (!@ IN/OUT) Línea a separar del comentario - * tcComment (@? OUT) Comentario - * tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcLine as String, tcComment as String, tlDeepCommentAnalysis as Boolean - LOCAL ln_AT_Cmt + Procedure get_SeparatedLineAndComment +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcLine (!@ IN/OUT) Línea a separar del comentario +* tcComment (@? OUT) Comentario +* tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) +*--------------------------------------------------------------------------------------------------- + Lparameters tcLine As String, tcComment As String, tlDeepCommentAnalysis As Boolean + Local ln_AT_Cmt tcComment = '' - ln_AT_Cmt = AT( '&'+'&', tcLine) + ln_AT_Cmt = At( '&'+'&', tcLine) - IF ln_AT_Cmt > 0 - IF tlDeepCommentAnalysis THEN - LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X + If ln_AT_Cmt > 0 + If tlDeepCommentAnalysis Then + Local laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A&]+[&2" &]+[& Comentario Opción A-2]) laSeparador(1,1) = '"' @@ -6956,991 +6968,991 @@ DEFINE CLASS c_conversor_base AS Custom laSeparador(3,3) = 1 lcSeparadoresIzq = laSeparador(1,1) + laSeparador(2,1) + laSeparador(3,1) lcSeparadoresDer = laSeparador(1,2) + laSeparador(2,2) + laSeparador(3,2) - lnLen = LEN(lcStr) + lnLen = Len(lcStr) - *-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&') +*-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&') X = 1 - lnAT1 = AT(laSeparador(m.X,1), lcStr) + lnAT1 = At(laSeparador(m.X,1), lcStr) - *-- Funcionamiento: - *-- La anulación de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va - *-- cancelando hasta la siguiente. A partir de ahi, se busca carácter a carácter el siguiente separador - *-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. - *-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, - *-- por ejemplo, esto: - *-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 - *-- se convierte temporalmente en esto: - *-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 - *-- lo que facilita encontrar el comentario '&&' real. - *-- Si se encuentra algún separador de cadena que no cierre, se genera un error 10 (Syntax Error). - IF lnAT1 > 0 THEN - FOR I = lnAT1+1 TO lnLen - IF m.X > 0 THEN - lnAT2 = AT(laSeparador(m.X,2), lcStr, laSeparador(m.X,3)) +*-- Funcionamiento: +*-- La anulación de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va +*-- cancelando hasta la siguiente. A partir de ahi, se busca carácter a carácter el siguiente separador +*-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. +*-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, +*-- por ejemplo, esto: +*-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 +*-- se convierte temporalmente en esto: +*-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 +*-- lo que facilita encontrar el comentario '&&' real. +*-- Si se encuentra algún separador de cadena que no cierre, se genera un error 10 (Syntax Error). + If lnAT1 > 0 Then + For I = lnAT1+1 To lnLen + If m.X > 0 Then + lnAT2 = At(laSeparador(m.X,2), lcStr, laSeparador(m.X,3)) - IF lnAT2 > 0 THEN - lcStr = STUFF(lcStr, lnAT1, lnAT2-lnAT1+1, REPLICATE('X',lnAT2-lnAT1+1)) - ELSE - ln_AT_Cmt = AT( '&'+'&', lcStr) + If lnAT2 > 0 Then + lcStr = Stuff(lcStr, lnAT1, lnAT2-lnAT1+1, Replicate('X',lnAT2-lnAT1+1)) + Else + ln_AT_Cmt = At( '&'+'&', lcStr) - IF ln_AT_Cmt = 0 OR ln_AT_Cmt < lnAT1 - *-- No tiene comentario '&&' real, o sí lo tiene y además contiene un delimitador de cadena como parte del comentario - EXIT - ELSE - ERROR 'Closing string delimiter <' + laSeparador(m.X,2) + '> not found: ' + tcLine - ENDIF - ENDIF - ENDIF + If ln_AT_Cmt = 0 Or ln_AT_Cmt < lnAT1 +*-- No tiene comentario '&&' real, o sí lo tiene y además contiene un delimitador de cadena como parte del comentario + Exit + Else + Error 'Closing string delimiter <' + laSeparador(m.X,2) + '> not found: ' + tcLine + Endif + Endif + Endif - *-- Verifico si el carácter es un separador de cadenas: '"[ - X = AT( SUBSTR(lcStr, m.I, 1), lcSeparadoresIzq) +*-- Verifico si el carácter es un separador de cadenas: '"[ + X = At( Substr(lcStr, m.I, 1), lcSeparadoresIzq) - IF m.X > 0 THEN - lnAT1 = AT(laSeparador(m.X,1), lcStr) - ENDIF - ENDFOR - ENDIF + If m.X > 0 Then + lnAT1 = At(laSeparador(m.X,1), lcStr) + Endif + Endfor + Endif - ln_AT_Cmt = AT( '&'+'&', lcStr) - ENDIF && tlDeepCommentAnalysis + ln_AT_Cmt = At( '&'+'&', lcStr) + Endif && tlDeepCommentAnalysis - IF ln_AT_Cmt > 0 - tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) ) - tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios - ENDIF + If ln_AT_Cmt > 0 + tcComment = Ltrim( Substr( tcLine, ln_AT_Cmt + 2 ) ) + tcLine = Rtrim( Left( tcLine, ln_AT_Cmt - 1 ), 0, Chr(9), ' ' ) && Quito TABS y espacios + Endif - ENDIF + Endif - RETURN (ln_AT_Cmt > 0) - ENDPROC + Return (ln_AT_Cmt > 0) + Endproc - PROCEDURE get_SeparatedPropAndValue - *-- Devuelve el valor separado de la propiedad. - *-- Si se indican más de 3 parámetros, evalúa el valor completo a través de las líneas de código (valores multi-línea) - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcAsignacion (v! IN ) Asignación completa con variable, igualdad y valor - * tcPropName (@! OUT) Nombre de la variable - * tcValue (@? OUT) Valor - * toClase (v! IN ) - * taCodeLines (@! IN ) Líneas de código a analizar - * tnCodeLines (v! IN ) Cantidad de líneas de código - * I (@! IN/OUT) Línea actual - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcAsignacion, tcPropName, tcValue, toClase, taCodeLines, tnCodeLines, I - LOCAL ln_AT_Cmt - STORE '' TO tcPropName, tcValue + Procedure get_SeparatedPropAndValue +*-- Devuelve el valor separado de la propiedad. +*-- Si se indican más de 3 parámetros, evalúa el valor completo a través de las líneas de código (valores multi-línea) +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcAsignacion (v! IN ) Asignación completa con variable, igualdad y valor +* tcPropName (@! OUT) Nombre de la variable +* tcValue (@? OUT) Valor +* toClase (v! IN ) +* taCodeLines (@! IN ) Líneas de código a analizar +* tnCodeLines (v! IN ) Cantidad de líneas de código +* I (@! IN/OUT) Línea actual +*-------------------------------------------------------------------------------------------------------------- + Lparameters tcAsignacion, tcPropName, tcValue, toClase, taCodeLines, tnCodeLines, I + Local ln_AT_Cmt + Store '' To tcPropName, tcValue - *-- EVALUAR UNA ASIGNACIÓN ESPECÍFICA INLINE - IF '=' $ tcAsignacion - ln_AT_Cmt = AT( '=', tcAsignacion) - tcPropName = ALLTRIM( LEFT( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', CHR(9) ) && Quito espacios y TABS - tcValue = LTRIM( SUBSTR( tcAsignacion, ln_AT_Cmt + 2 ) ) +*-- EVALUAR UNA ASIGNACIÓN ESPECÍFICA INLINE + If '=' $ tcAsignacion + ln_AT_Cmt = At( '=', tcAsignacion) + tcPropName = Alltrim( Left( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', Chr(9) ) && Quito espacios y TABS + tcValue = Ltrim( Substr( tcAsignacion, ln_AT_Cmt + 2 ) ) - 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' - DO CASE - CASE .analyzeAssignmentOf_TAG( @tcPropName, @tcValue, @taCodeLines, tnCodeLines, @m.I ; - , C_FB2P_VALUE_I, C_FB2P_VALUE_F, C_LEN_FB2P_VALUE_I, C_LEN_FB2P_VALUE_F ) - *-- FB2P_VALUE + 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' + Do Case + Case .analyzeAssignmentOf_TAG( @tcPropName, @tcValue, @taCodeLines, tnCodeLines, @m.I ; + , C_FB2P_VALUE_I, C_FB2P_VALUE_F, C_LEN_FB2P_VALUE_I, C_LEN_FB2P_VALUE_F ) +*-- FB2P_VALUE - CASE .analyzeAssignmentOf_TAG( @tcPropName, @tcValue, @taCodeLines, tnCodeLines, @m.I ; - , C_MEMBERDATA_I, C_MEMBERDATA_F, C_LEN_MEMBERDATA_I, C_LEN_MEMBERDATA_F ) - *-- MEMBERDATA + Case .analyzeAssignmentOf_TAG( @tcPropName, @tcValue, @taCodeLines, tnCodeLines, @m.I ; + , C_MEMBERDATA_I, C_MEMBERDATA_F, C_LEN_MEMBERDATA_I, C_LEN_MEMBERDATA_F ) +*-- MEMBERDATA - OTHERWISE - *-- Propiedad normal - .denormalizePropertyValue( @tcPropName, @tcValue, '' ) + Otherwise +*-- Propiedad normal + .denormalizePropertyValue( @tcPropName, @tcValue, '' ) - ENDCASE - ENDWITH && THIS - ENDIF - ENDIF + Endcase + Endwith && THIS + Endif + Endif - RELEASE tcAsignacion, tcPropName, tcValue, toClase, taCodeLines, tnCodeLines, I, ln_AT_Cmt - RETURN - ENDPROC + Release tcAsignacion, tcPropName, tcValue, toClase, taCodeLines, tnCodeLines, I, ln_AT_Cmt + Return + Endproc - PROCEDURE get_ValueFromNullTerminatedValue - LPARAMETERS tcNullTerminatedValue - LOCAL lcValue, lnNullPos - lnNullPos = AT(CHR(0), tcNullTerminatedValue ) - IF lnNullPos = 0 - lcValue = CHRTRAN( tcNullTerminatedValue, ['], ["] ) - ELSE - lcValue = CHRTRAN( LEFT( tcNullTerminatedValue, lnNullPos - 1 ), ['], ["] ) - ENDIF - lcValue = THIS.encode_SpecialCodes_CR_LF(lcValue) - RELEASE tcNullTerminatedValue, lnNullPos - RETURN lcValue - ENDPROC + Procedure get_ValueFromNullTerminatedValue + Lparameters tcNullTerminatedValue + Local lcValue, lnNullPos + lnNullPos = At(Chr(0), tcNullTerminatedValue ) + If lnNullPos = 0 + lcValue = Chrtran( tcNullTerminatedValue, ['], ["] ) + Else + lcValue = Chrtran( Left( tcNullTerminatedValue, lnNullPos - 1 ), ['], ["] ) + Endif + lcValue = This.encode_SpecialCodes_CR_LF(lcValue) + Release tcNullTerminatedValue, lnNullPos + Return lcValue + Endproc - PROCEDURE identifyCodeBlocks - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo - ENDPROC + Procedure identifyCodeBlocks + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo + Endproc - PROCEDURE identifyExclusionBlocks - LPARAMETERS taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion - * LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF/#ENDIF Y SE USAN PARA NO BUSCAR - * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar - * tnCodeLines (@? IN ) Cantidad de líneas de código - * ta_ID_Bloques (@? IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc - * taLineasExclusion (@? OUT) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@? OUT) Cantidad de bloques de exclusión - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY ta_ID_Bloques, taLineasExclusion + Procedure identifyExclusionBlocks + Lparameters taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion +* LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF/#ENDIF Y SE USAN PARA NO BUSCAR +* INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar +* tnCodeLines (@? IN ) Cantidad de líneas de código +* ta_ID_Bloques (@? IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc +* taLineasExclusion (@? OUT) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@? OUT) Cantidad de bloques de exclusión +*-------------------------------------------------------------------------------------------------------------- + External Array ta_ID_Bloques, taLineasExclusion - TRY - LOCAL lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - DIMENSION taLineasExclusion(tnCodeLines), taBloquesExclusion(1,2) - STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X + Try + Local lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang + Dimension taLineasExclusion(tnCodeLines), taBloquesExclusion(1,2) + Store 0 To tnBloquesExclusion, lnPrimerID, I, X - IF tnCodeLines > 1 - IF EMPTY(ta_ID_Bloques) - DIMENSION ta_ID_Bloques(2,4) - ta_ID_Bloques(1,1) = '#IF' - ta_ID_Bloques(1,2) = '#ENDI' - ta_ID_Bloques(1,3) = LEN( ta_ID_Bloques(1,1) ) - ta_ID_Bloques(1,4) = LEN( ta_ID_Bloques(1,2) ) - ta_ID_Bloques(2,1) = 'TEXT' - ta_ID_Bloques(2,2) = 'ENDT' - ta_ID_Bloques(2,3) = LEN( ta_ID_Bloques(2,1) ) - ta_ID_Bloques(2,4) = LEN( ta_ID_Bloques(2,2) ) - lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 ) - ENDIF + If tnCodeLines > 1 + If Empty(ta_ID_Bloques) + Dimension ta_ID_Bloques(2,4) + ta_ID_Bloques(1,1) = '#IF' + ta_ID_Bloques(1,2) = '#ENDI' + ta_ID_Bloques(1,3) = Len( ta_ID_Bloques(1,1) ) + ta_ID_Bloques(1,4) = Len( ta_ID_Bloques(1,2) ) + ta_ID_Bloques(2,1) = 'TEXT' + ta_ID_Bloques(2,2) = 'ENDT' + ta_ID_Bloques(2,3) = Len( ta_ID_Bloques(2,1) ) + ta_ID_Bloques(2,4) = Len( ta_ID_Bloques(2,2) ) + lnID_Bloques_Count = Alen( ta_ID_Bloques, 1 ) + Endif - *-- Búsqueda del ID de inicio de bloque - 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(m.I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) - lcLine = LTRIM( taCodeLines(m.I), 0, CHR(9), ' ' ) +*-- Búsqueda del ID de inicio de bloque + 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(m.I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) + lcLine = Ltrim( taCodeLines(m.I), 0, Chr(9), ' ' ) - IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) - *-- Optimización: Excluyo las líneas que solo son comentarios - taLineasExclusion(m.I) = .T. - *-- - LOOP - ENDIF + If .lineIsOnlyCommentAndNoMetadata( @lcLine ) +*-- Optimización: Excluyo las líneas que solo son comentarios + taLineasExclusion(m.I) = .T. +*-- + Loop + Endif - lcLine = UPPER( LEFT( lcLine,1 ) ) + UPPER( LTRIM( SUBSTR( lcLine, 2 ) ) ) - lnPrimerID = 0 + lcLine = Upper( Left( lcLine,1 ) ) + Upper( Ltrim( Substr( lcLine, 2 ) ) ) + lnPrimerID = 0 - FOR X = 1 TO lnID_Bloques_Count - lnLen_IDFinBQ = LEN( ta_ID_Bloques(m.X,2) ) - IF .isIndicatedToken( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, m.X, 1 ) ; - AND NOT .currentLineIsPreviousLineContinuation( @taCodeLines, m.I ) - lnPrimerID = m.X - lnAnidamientos = 1 - EXIT - ENDIF - ENDFOR + For X = 1 To lnID_Bloques_Count + lnLen_IDFinBQ = Len( ta_ID_Bloques(m.X,2) ) + If .isIndicatedToken( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, m.X, 1 ) ; + AND Not .currentLineIsPreviousLineContinuation( @taCodeLines, m.I ) + lnPrimerID = m.X + lnAnidamientos = 1 + Exit + Endif + Endfor - IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente - tnBloquesExclusion = tnBloquesExclusion + 1 - DIMENSION taBloquesExclusion(tnBloquesExclusion,2) - taBloquesExclusion(tnBloquesExclusion,1) = m.I - taLineasExclusion(m.I) = .T. - - * Búsqueda del ID de fin de bloque - FOR I = m.I + 1 TO tnCodeLines - * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - *lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(m.I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) - *lcLine = LTRIM( CHRTRAN( taCodeLines(m.I), CHR(9), ' ' ) ) - lcLine = LTRIM( taCodeLines(m.I), 0, CHR(9), ' ' ) + If lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente + tnBloquesExclusion = tnBloquesExclusion + 1 + Dimension taBloquesExclusion(tnBloquesExclusion,2) + taBloquesExclusion(tnBloquesExclusion,1) = m.I taLineasExclusion(m.I) = .T. - IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) - LOOP - ENDIF +* Búsqueda del ID de fin de bloque + For I = m.I + 1 To tnCodeLines +* Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' +*lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(m.I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) +*lcLine = LTRIM( CHRTRAN( taCodeLines(m.I), CHR(9), ' ' ) ) + lcLine = Ltrim( taCodeLines(m.I), 0, Chr(9), ' ' ) + taLineasExclusion(m.I) = .T. - lcLine = UPPER( LEFT( lcLine,1 ) ) + UPPER( LTRIM( SUBSTR( lcLine, 2 ) ) ) + If .lineIsOnlyCommentAndNoMetadata( @lcLine ) + Loop + Endif - DO CASE - CASE lnPrimerID = 1 AND .isIndicatedToken( @lcLine, @ta_ID_Bloques, 0, m.X, 1 ) ; - AND NOT .currentLineIsPreviousLineContinuation( @taCodeLines, m.I ) - *-- Busca el primer marcador (#IF) NOTA: No busco [TEXT] porque no se pueden anidar. - lnAnidamientos = lnAnidamientos + 1 + lcLine = Upper( Left( lcLine,1 ) ) + Upper( Ltrim( Substr( lcLine, 2 ) ) ) - CASE .isIndicatedToken( @lcLine, @ta_ID_Bloques, 0, m.X, 2 ) - *-- Busca el segundo marcador (#ENDIF o ENDTEXT) - lnAnidamientos = lnAnidamientos - 1 + Do Case + Case lnPrimerID = 1 And .isIndicatedToken( @lcLine, @ta_ID_Bloques, 0, m.X, 1 ) ; + AND Not .currentLineIsPreviousLineContinuation( @taCodeLines, m.I ) +*-- Busca el primer marcador (#IF) NOTA: No busco [TEXT] porque no se pueden anidar. + lnAnidamientos = lnAnidamientos + 1 - IF lnAnidamientos = 0 - taBloquesExclusion(tnBloquesExclusion,2) = m.I - EXIT - ENDIF - ENDCASE - ENDFOR + Case .isIndicatedToken( @lcLine, @ta_ID_Bloques, 0, m.X, 2 ) +*-- Busca el segundo marcador (#ENDIF o ENDTEXT) + lnAnidamientos = lnAnidamientos - 1 - *-- Validación - IF EMPTY(taBloquesExclusion(tnBloquesExclusion,2)) - *ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; - + '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; - + '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) - .n_Methods_LineNo = taBloquesExclusion(tnBloquesExclusion,1) - ERROR (TEXTMERGE(loLang.C_END_MARKER_NOT_FOUND_LOC)) - ENDIF - ENDIF - ENDFOR - ENDWITH && THIS - ENDIF + If lnAnidamientos = 0 + taBloquesExclusion(tnBloquesExclusion,2) = m.I + Exit + Endif + Endcase + Endfor - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF +*-- Validación + If Empty(taBloquesExclusion(tnBloquesExclusion,2)) +*ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; ++ '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; ++ '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) + .n_Methods_LineNo = taBloquesExclusion(tnBloquesExclusion,1) + Error (Textmerge(loLang.C_END_MARKER_NOT_FOUND_LOC)) + Endif + Endif + Endfor + Endwith && THIS + Endif - THROW + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - FINALLY - RELEASE taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion, loLang ; - , lnBloques, I, X, lnPrimerID, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine - ENDTRY + Throw - RETURN - ENDPROC + Finally + Release taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion, loLang ; + , lnBloques, I, X, lnPrimerID, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine + Endtry + + Return + Endproc - PROCEDURE excludedLine - LPARAMETERS tn_Linea, tnBloquesExclusion, taLineasExclusion + Procedure excludedLine + Lparameters tn_Linea, tnBloquesExclusion, taLineasExclusion - RETURN taLineasExclusion(tn_Linea) - ENDPROC + Return taLineasExclusion(tn_Linea) + Endproc - PROCEDURE lineIsOnlyCommentAndNoMetadata - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLine (!@ IN/OUT) Línea a separar del comentario - * tcComment (@? OUT) Comentario - * tlDoNotSeparateLineAndComment (v? IN ) Indica o separar la línea de código del comentario - * tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) - *--------------------------------------------------------------------------------------------------- - * NOTA: Recordar que esta función suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda. - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcLine as String, tcComment as String, tlDoNotSeparateLineAndComment as Boolean, tlDeepCommentAnalysis as Boolean - LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt + Procedure lineIsOnlyCommentAndNoMetadata +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcLine (!@ IN/OUT) Línea a separar del comentario +* tcComment (@? OUT) Comentario +* tlDoNotSeparateLineAndComment (v? IN ) Indica o separar la línea de código del comentario +* tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) +*--------------------------------------------------------------------------------------------------- +* NOTA: Recordar que esta función suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda. +*--------------------------------------------------------------------------------------------------- + Lparameters tcLine As String, tcComment As String, tlDoNotSeparateLineAndComment As Boolean, tlDeepCommentAnalysis As Boolean + Local lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt - WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' - IF tlDoNotSeparateLineAndComment + With This As c_conversor_base Of 'FOXBIN2PRG.PRG' + If tlDoNotSeparateLineAndComment tcComment = '' - ELSE + Else .get_SeparatedLineAndComment( @tcLine, @tcComment, tlDeepCommentAnalysis ) - ENDIF + Endif - DO CASE - CASE LEFT(tcLine,2) == '*<' - tcComment = tcLine + Do Case + Case Left(tcLine,2) == '*<' + tcComment = tcLine - CASE EMPTY(tcLine) OR LEFT(tcLine, 1) == '*' ; - OR UPPER(LEFT(tcLine + ' ', 5)) == 'NOTE ' ; && Vacía o Comentarios - AND NOT UPPER(LEFT(tcLine + ' ', 6)) == 'NOTE =' && Excluir asignaciones - * - lllineIsOnlyCommentAndNoMetadata = .T. + Case Empty(tcLine) Or Left(tcLine, 1) == '*' ; + OR Upper(Left(tcLine + ' ', 5)) == 'NOTE ' ; && Vacía o Comentarios + And Not Upper(Left(tcLine + ' ', 6)) == 'NOTE =' && Excluir asignaciones +* + lllineIsOnlyCommentAndNoMetadata = .T. - ENDCASE - ENDWITH + Endcase + Endwith - RELEASE tcLine, tcComment, ln_AT_Cmt - RETURN lllineIsOnlyCommentAndNoMetadata - ENDPROC + Release tcLine, tcComment, ln_AT_Cmt + Return lllineIsOnlyCommentAndNoMetadata + Endproc - PROCEDURE loadModule - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (!@ IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - *LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - *loLang = _SCREEN.o_FoxBin2Prg_Lang - *THIS.writeLog( C_TAB + loLang.C_CONVERTING_FILE_LOC + ' ' + THIS.c_OutputFile + '...' ) - *RELEASE loLang - RETURN - ENDPROC + Procedure loadModule +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (!@ IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toModulo, toEx As Exception, toFoxBin2Prg + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif +*LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' +*loLang = _SCREEN.o_FoxBin2Prg_Lang +*THIS.writeLog( C_TAB + loLang.C_CONVERTING_FILE_LOC + ' ' + THIS.c_OutputFile + '...' ) +*RELEASE loLang + Return + Endproc - PROCEDURE normalizeAssignment - LPARAMETERS tcAsignacion, tcComentario - LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos + Procedure normalizeAssignment + 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 = '' .normalizePropertyValue( @lcPropName, @lcValor, @tcComentario ) tcAsignacion = lcPropName + ' = ' + lcValor - ENDWITH + Endwith - RELEASE tcComentario, lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos - RETURN tcAsignacion - ENDPROC + Release tcComentario, lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos + Return tcAsignacion + Endproc - PROCEDURE normalizePropertyValue - *-- Este método se ejecuta cuando se genera el tx2 desde el binario - LPARAMETERS tcProp, tcValue, tcComentario - LOCAL lcValue, I + Procedure normalizePropertyValue +*-- Este método se ejecuta cuando se genera el tx2 desde el binario + Lparameters tcProp, tcValue, tcComentario + Local lcValue, I tcComentario = '' - *-- Limpieza de caracteres sin uso - *IF INLIST(tcValue, '..\', '..\..\' ) THEN - * MESSAGEBOX( 'Encontrado valor "' + tcValue + '" en propiedad "' + tcProp, 4096, PROGRAM() ) - * tcValue = '' - *ENDIF +*-- Limpieza de caracteres sin uso +*IF INLIST(tcValue, '..\', '..\..\' ) THEN +* MESSAGEBOX( 'Encontrado valor "' + tcValue + '" en propiedad "' + tcProp, 4096, PROGRAM() ) +* tcValue = '' +*ENDIF - *-- Ajustes de algunos casos especiales - DO CASE - CASE tcProp == '_memberdata' - lcValue = '' +*-- Ajustes de algunos casos especiales + Do Case + Case tcProp == '_memberdata' + lcValue = '' - FOR I = 1 TO OCCURS( '/>', tcValue ) - *TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 - * <<>> <', m.I, 1+4 ), CR_LF, ' ' )>> - *ENDTEXT - lcValue = lcValue + CHR(13) + CHR(10) + CHR(9) + CHR(9) + CHRTRAN( STREXTRACT( tcValue, '', m.I, 1+4 ), CR_LF, ' ' ) - ENDFOR + For I = 1 To Occurs( '/>', tcValue ) +*TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 +* <<>> <', m.I, 1+4 ), CR_LF, ' ' )>> +*ENDTEXT + lcValue = lcValue + Chr(13) + Chr(10) + Chr(9) + Chr(9) + Chrtran( Strextract( tcValue, '', m.I, 1+4 ), CR_LF, ' ' ) + Endfor - TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> <<>> - ENDTEXT - - CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I - *-- Valor especial Fox con cabecera CHR(1): Debo quitarla y normalizar el valor - tcValue = C_FB2P_VALUE_I ; - + STRTRAN( STRTRAN( STRTRAN( STRTRAN( ; - STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ) ; - , CR_LF, ' +10;' ), C_CR, ' ' ), C_LF, ' ' ), ' +10;', CR_LF ) ; - + C_FB2P_VALUE_F - - - ENDCASE - - RELEASE tcProp, lcValue, I, tcComentario - RETURN tcValue - ENDPROC - + ENDTEXT + + Case Left( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I +*-- Valor especial Fox con cabecera CHR(1): Debo quitarla y normalizar el valor + tcValue = C_FB2P_VALUE_I ; + + Strtran( Strtran( Strtran( Strtran( ; + STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ) ; + , CR_LF, ' +10;' ), C_CR, ' ' ), C_LF, ' ' ), ' +10;', CR_LF ) ; + + C_FB2P_VALUE_F + + + Endcase + + Release tcProp, lcValue, I, tcComentario + Return tcValue + Endproc + - PROCEDURE normalizeXMLValue - LPARAMETERS tcValor - *-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES. - tcValor = STRTRAN(tcValor, CHR(38), CHR(38) + 'amp;') && reemplaza & por & && - tcValor = STRTRAN(tcValor, CHR(39), CHR(38) + 'apos;') && reemplaza ' por ' && - tcValor = STRTRAN(tcValor, CHR(34), CHR(38) + 'quot;') && reemplaza " por " && - tcValor = STRTRAN(tcValor, '<', CHR(38) + 'lt;') && reemplaza < por < && - tcValor = STRTRAN(tcValor, '>', CHR(38) + 'gt;') && reemplaza > por > && - tcValor = STRTRAN(tcValor, CHR(13)+CHR(10), CHR(10)) && reeemplaza CR+LF por LF - tcValor = CHRTRAN(tcValor, CHR(13), CHR(10)) && reemplaza CR por LF + Procedure normalizeXMLValue + Lparameters tcValor +*-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES. + tcValor = Strtran(tcValor, Chr(38), Chr(38) + 'amp;') && reemplaza & por & && + tcValor = Strtran(tcValor, Chr(39), Chr(38) + 'apos;') && reemplaza ' por ' && + tcValor = Strtran(tcValor, Chr(34), Chr(38) + 'quot;') && reemplaza " por " && + tcValor = Strtran(tcValor, '<', Chr(38) + 'lt;') && reemplaza < por < && + tcValor = Strtran(tcValor, '>', Chr(38) + 'gt;') && reemplaza > por > && + tcValor = Strtran(tcValor, Chr(13)+Chr(10), Chr(10)) && reeemplaza CR+LF por LF + tcValor = Chrtran(tcValor, Chr(13), Chr(10)) && reemplaza CR por LF - RETURN tcValor - ENDPROC + Return tcValor + Endproc - FUNCTION rowTimeStamp(ltDateTime) - * Generate a FoxPro 3.0-style row timestamp - *-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. - LOCAL lcTimeValue, tnTimeStamp + Function rowTimeStamp(ltDateTime) +* Generate a FoxPro 3.0-style row timestamp +*-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. + Local lcTimeValue, tnTimeStamp - TRY - IF EMPTY(ltDateTime) - tnTimeStamp = 0 - EXIT - ENDIF + Try + If Empty(ltDateTime) + tnTimeStamp = 0 + Exit + Endif - IF VARTYPE(m.ltDateTime) <> 'T' - m.ltDateTime = DATETIME() - ENDIF + If Vartype(m.ltDateTime) <> 'T' + m.ltDateTime = Datetime() + Endif - tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ; - + MONTH(m.ltDateTime) * 2^21 ; - + DAY(m.ltDateTime) * 2^16 ; - + HOUR(m.ltDateTime) * 2^11 ; - + MINUTE(m.ltDateTime) * 2^5 ; - + SEC(m.ltDateTime) - ENDTRY + tnTimeStamp = ( Year(m.ltDateTime) - 1980) * 2^25 ; + + Month(m.ltDateTime) * 2^21 ; + + Day(m.ltDateTime) * 2^16 ; + + Hour(m.ltDateTime) * 2^11 ; + + Minute(m.ltDateTime) * 2^5 ; + + Sec(m.ltDateTime) + Endtry - RETURN INT(tnTimeStamp) - ENDFUNC + Return Int(tnTimeStamp) + Endfunc - PROCEDURE set_UserValue - LPARAMETERS toEx as Exception - ENDPROC + Procedure set_UserValue + Lparameters toEx As Exception + Endproc - PROCEDURE sortPropsAndValues_SetAndGetSCXPropNames - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcOperation (v! IN ) Operación a realizar ("SETNAME" o "GETNAME") - * tcPropName (v! IN ) Nombre de la propiedad - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcOperation, tcPropName + Procedure sortPropsAndValues_SetAndGetSCXPropNames +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcOperation (v! IN ) Operación a realizar ("SETNAME" o "GETNAME") +* tcPropName (v! IN ) Nombre de la propiedad +*-------------------------------------------------------------------------------------------------------------- + Lparameters tcOperation, tcPropName - TRY - LOCAL lcPropName, lcClass, lnPos ; - , loEx AS EXCEPTION ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - lcPropName = tcPropName - tcOperation = UPPER(EVL(tcOperation,'')) + Try + Local lcPropName, lcClass, lnPos ; + , loEx As Exception ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang + lcPropName = tcPropName + tcOperation = Upper(Evl(tcOperation,'')) - DO CASE - CASE tcOperation == 'GETNAME' - lcPropName = SUBSTR(tcPropName,5) + Do Case + Case tcOperation == 'GETNAME' + lcPropName = Substr(tcPropName,5) - CASE NOT tcOperation == 'SETNAME' - ERROR loLang.C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC + Case Not tcOperation == 'SETNAME' + Error loLang.C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC - CASE lcPropName == 'Name' && System "Name" property - lcPropName = 'A999' + lcPropName + Case lcPropName == 'Name' && System "Name" property + lcPropName = 'A999' + lcPropName - OTHERWISE - *-- Soporte de evaluación de propiedades por clase evaluada - WITH THIS - #IF .F. &&USED("foxbin2prg_keywords") THEN - lcClass = ICASE( .c_ClaseActual == 'grid', 'all' ; - , .c_ClaseActual == 'form', 'all' ; - , .c_ClaseActual == 'pageframe', 'all' ; - , .c_ClaseActual == 'control', 'all' ; - , .c_ClaseActual == 'container', 'all' ; - , .c_ClaseActual == 'toolbar', 'all' ; - , .c_ClaseActual ) + Otherwise +*-- Soporte de evaluación de propiedades por clase evaluada + With This + #If .F. &&USED("foxbin2prg_keywords") THEN + lcClass = Icase( .c_ClaseActual == 'grid', 'all' ; + , .c_ClaseActual == 'form', 'all' ; + , .c_ClaseActual == 'pageframe', 'all' ; + , .c_ClaseActual == 'control', 'all' ; + , .c_ClaseActual == 'container', 'all' ; + , .c_ClaseActual == 'toolbar', 'all' ; + , .c_ClaseActual ) - lnPos = IIF( SEEK( PADR(lcClass,15) + PADR(lcPropName,30), 'foxbin2prg_keywords' ), foxbin2prg_keywords.i_order, 0 ) + lnPos = Iif( Seek( Padr(lcClass,15) + Padr(lcPropName,30), 'foxbin2prg_keywords' ), foxbin2prg_keywords.i_order, 0 ) - #ELSE - DO CASE - CASE .c_ClaseActual == 'checkbox' - lnPos = ASCAN( .a_SpecialProps_Chk, lcPropName, 1, 0, 1, 1+2+4 ) + #Else + Do Case + Case .c_ClaseActual == 'checkbox' + lnPos = Ascan( .a_SpecialProps_Chk, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'collection' - lnPos = ASCAN( .a_SpecialProps_Coll, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'collection' + lnPos = Ascan( .a_SpecialProps_Coll, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'combobox' - lnPos = ASCAN( .a_SpecialProps_Cbo, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'combobox' + lnPos = Ascan( .a_SpecialProps_Cbo, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'commandgroup' - lnPos = ASCAN( .a_SpecialProps_Cmg, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'commandgroup' + lnPos = Ascan( .a_SpecialProps_Cmg, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'commandbutton' - lnPos = ASCAN( .a_SpecialProps_Cmd, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'commandbutton' + lnPos = Ascan( .a_SpecialProps_Cmd, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'cursor' - lnPos = ASCAN( .a_SpecialProps_Cur, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'cursor' + lnPos = Ascan( .a_SpecialProps_Cur, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'cursoradapter' - lnPos = ASCAN( .a_SpecialProps_CA, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'cursoradapter' + lnPos = Ascan( .a_SpecialProps_CA, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'dataenvironment' - lnPos = ASCAN( .a_SpecialProps_DE, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'dataenvironment' + lnPos = Ascan( .a_SpecialProps_DE, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'editbox' - lnPos = ASCAN( .a_SpecialProps_Edt, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'editbox' + lnPos = Ascan( .a_SpecialProps_Edt, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'formset' - lnPos = ASCAN( .a_SpecialProps_Frs, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'formset' + lnPos = Ascan( .a_SpecialProps_Frs, lcPropName, 1, 0, 1, 1+2+4 ) - *-- Comento la clase grid, porque puede contener a todos los controles, como un form - *CASE .c_ClaseActual == 'grid' - * lnPos = ASCAN( .a_SpecialProps_Grd, lcPropName, 1, 0, 1, 1+2+4 ) +*-- Comento la clase grid, porque puede contener a todos los controles, como un form +*CASE .c_ClaseActual == 'grid' +* lnPos = ASCAN( .a_SpecialProps_Grd, lcPropName, 1, 0, 1, 1+2+4 ) - *-- Comento la clase form, porque puede contener a todos los controles, como un form - *CASE .c_ClaseActual == 'form' - * lnPos = ASCAN( .a_SpecialProps_Frm, lcPropName, 1, 0, 1, 1+2+4 ) +*-- Comento la clase form, porque puede contener a todos los controles, como un form +*CASE .c_ClaseActual == 'form' +* lnPos = ASCAN( .a_SpecialProps_Frm, lcPropName, 1, 0, 1, 1+2+4 ) - *-- Comento la clase pageframe, porque puede contener a todos los controles, como un form - *CASE .c_ClaseActual == 'pageframe' - * lnPos = ASCAN( .a_SpecialProps_Pgf, lcPropName, 1, 0, 1, 1+2+4 ) +*-- Comento la clase pageframe, porque puede contener a todos los controles, como un form +*CASE .c_ClaseActual == 'pageframe' +* lnPos = ASCAN( .a_SpecialProps_Pgf, lcPropName, 1, 0, 1, 1+2+4 ) - *-- Comento la clase control, porque puede contener a todos los controles, como un form - *CASE .c_ClaseActual == 'control' - * lnPos = ASCAN( .a_SpecialProps_Ctl, lcPropName, 1, 0, 1, 1+2+4 ) +*-- Comento la clase control, porque puede contener a todos los controles, como un form +*CASE .c_ClaseActual == 'control' +* lnPos = ASCAN( .a_SpecialProps_Ctl, lcPropName, 1, 0, 1, 1+2+4 ) - *-- Comento la clase container, porque puede contener a todos los controles, como un form - *CASE .c_ClaseActual == 'container' - * lnPos = ASCAN( .a_SpecialProps_Cnt, lcPropName, 1, 0, 1, 1+2+4 ) +*-- Comento la clase container, porque puede contener a todos los controles, como un form +*CASE .c_ClaseActual == 'container' +* lnPos = ASCAN( .a_SpecialProps_Cnt, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'column' - lnPos = ASCAN( .a_SpecialProps_Grc, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'column' + lnPos = Ascan( .a_SpecialProps_Grc, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'header' - lnPos = ASCAN( .a_SpecialProps_Grh, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'header' + lnPos = Ascan( .a_SpecialProps_Grh, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'hyperlink' - lnPos = ASCAN( .a_SpecialProps_Hlk, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'hyperlink' + lnPos = Ascan( .a_SpecialProps_Hlk, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'image' - lnPos = ASCAN( .a_SpecialProps_Img, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'image' + lnPos = Ascan( .a_SpecialProps_Img, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'label' - lnPos = ASCAN( .a_SpecialProps_Lbl, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'label' + lnPos = Ascan( .a_SpecialProps_Lbl, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'line' - lnPos = ASCAN( .a_SpecialProps_Lin, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'line' + lnPos = Ascan( .a_SpecialProps_Lin, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'listbox' - lnPos = ASCAN( .a_SpecialProps_Lst, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'listbox' + lnPos = Ascan( .a_SpecialProps_Lst, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'olebound' - lnPos = ASCAN( .a_SpecialProps_Ole, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'olebound' + lnPos = Ascan( .a_SpecialProps_Ole, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'optiongroup' - lnPos = ASCAN( .a_SpecialProps_Opg, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'optiongroup' + lnPos = Ascan( .a_SpecialProps_Opg, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'optionbutton' - lnPos = ASCAN( .a_SpecialProps_Opb, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'optionbutton' + lnPos = Ascan( .a_SpecialProps_Opb, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'projecthook' - lnPos = ASCAN( .a_SpecialProps_Phk, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'projecthook' + lnPos = Ascan( .a_SpecialProps_Phk, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'relation' - lnPos = ASCAN( .a_SpecialProps_Rel, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'relation' + lnPos = Ascan( .a_SpecialProps_Rel, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'reportlistener' - lnPos = ASCAN( .a_SpecialProps_Rls, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'reportlistener' + lnPos = Ascan( .a_SpecialProps_Rls, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'separator' - lnPos = ASCAN( .a_SpecialProps_Sep, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'separator' + lnPos = Ascan( .a_SpecialProps_Sep, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'shape' - lnPos = ASCAN( .a_SpecialProps_Shp, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'shape' + lnPos = Ascan( .a_SpecialProps_Shp, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'spinner' - lnPos = ASCAN( .a_SpecialProps_Spn, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'spinner' + lnPos = Ascan( .a_SpecialProps_Spn, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'textbox' - lnPos = ASCAN( .a_SpecialProps_Txt, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'textbox' + lnPos = Ascan( .a_SpecialProps_Txt, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'timer' - lnPos = ASCAN( .a_SpecialProps_Tmr, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'timer' + lnPos = Ascan( .a_SpecialProps_Tmr, lcPropName, 1, 0, 1, 1+2+4 ) - *-- Comento la clase toolbar, porque puede contener a todos los controles, como un form - *CASE .c_ClaseActual == 'toolbar' - * lnPos = ASCAN( .a_SpecialProps_Tbr, lcPropName, 1, 0, 1, 1+2+4 ) +*-- Comento la clase toolbar, porque puede contener a todos los controles, como un form +*CASE .c_ClaseActual == 'toolbar' +* lnPos = ASCAN( .a_SpecialProps_Tbr, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'xmladapter' - lnPos = ASCAN( .a_SpecialProps_XMLAda, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'xmladapter' + lnPos = Ascan( .a_SpecialProps_XMLAda, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'xmlfield' - lnPos = ASCAN( .a_SpecialProps_XMLFld, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'xmlfield' + lnPos = Ascan( .a_SpecialProps_XMLFld, lcPropName, 1, 0, 1, 1+2+4 ) - CASE .c_ClaseActual == 'xmltable' - lnPos = ASCAN( .a_SpecialProps_XMLTbl, lcPropName, 1, 0, 1, 1+2+4 ) + Case .c_ClaseActual == 'xmltable' + lnPos = Ascan( .a_SpecialProps_XMLTbl, lcPropName, 1, 0, 1, 1+2+4 ) - OTHERWISE - lnPos = ASCAN( .a_SpecialProps, lcPropName, 1, 0, 1, 1+2+4 ) - ENDCASE - #ENDIF - - *IF lnPos2 <> lnPos - * ERROR 'lnPos y lnPos2 no coinciden para "' + .c_ClaseActual + '.' + lcPropName + '"! lnPos=' + TRANSFORM(lnPos) + ', lnPos2=' + TRANSFORM(lnPos2) - *ENDIF - - *-- Genera una propiedad con el formato "A nnn Propiedad", donde los valores más altos quedan al final, - *-- de modo que primero van las props nativas, luego las del usuario y al final "name", que es especial. - *-- Ej: "A004ScaleMode", ..., "A998UserProp", "A999Name" - lcPropName = 'A' + PADL( EVL(lnPos,998), 3, '0' ) + lcPropName - ENDWITH && THIS - ENDCASE - - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - RELEASE tcOperation, tcPropName, lnPos, loEx - ENDTRY - - RETURN lcPropName - ENDPROC - - - PROCEDURE sortPropsAndValues - * KNOWLEDGE BASE: - * 02/12/2013 FDBOZZO Fidel Charny me pasó un ejemplo donde se pierden propiedades físicamente - * si se ordenan alfabéticamente en un ADD OBJECT. Pierde "picture" y otras más. - * Pareciera que la última debe ser "Name". - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taPropsAndValues (!@ IN ) El array con las propiedades y valores del objeto o clase - * tnPropsAndValues_Count (v! IN ) Cantidad de propiedades - * tnSortType (v! IN ) Tipo de sort: - * 0=Solo separar propiedades de clase y de objetos (.) - * 1=Sort completo de propiedades (para la versión TEXTO) - * 2=Sort completo de propiedades con "Name" al final (para la versión BIN) - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taPropsAndValues, tnPropsAndValues_Count, tnSortType - - EXTERNAL ARRAY taPropsAndValues - - TRY - LOCAL I, X, lnArrayCols, laPropsAndValues(1,2), lcPropName, lcSortedMemo, lcMethods ; - , lnSelect, lcObjName - lnArrayCols = ALEN( taPropsAndValues, 2 ) - lnSelect = SELECT() - DIMENSION laPropsAndValues( tnPropsAndValues_Count, lnArrayCols ) - ACOPY( taPropsAndValues, laPropsAndValues ) - - WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' - IF m.tnSortType > 0 - * CON SORT: - * - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final - - * ATENCIÓN: 10/07/2018 - * Cuando hay ADD OBJECT multicontenedor (obj.obj.obj...), el reordenamiento - * puede producir daños colaterales, como objetos mal colocados. - * (Era de esperar: No todo se puede ordenar alfabéticamente) - * Un solución de compromiso podría ser al menos mantener juntos los objetos de mismo nombre, - * que en la práctica pueden estar todos mezclados. Al menos eso no rompería nada. - * VER: https://github.com/fdbozzo/foxbin2prg/issues/28 - * - * PASO 1: Obtener los nombres únicos y asignarles un código de orden - CREATE CURSOR C_OBJ (OBJNAME C(50), IORDER I AUTOINC) - INDEX ON OBJNAME TAG OBJNAME - - * PASO 2: Configurar las prioridades de ordenamiento (primero props, luego objs) - FOR I = 1 TO m.tnPropsAndValues_Count - IF '.' $ laPropsAndValues(m.I,1) - IF m.tnSortType = 2 - * Genera obj+props para BIN - lcObjName = GETWORDNUM(laPropsAndValues(m.I,1), 1, '.') - - IF NOT SEEK(LOWER(lcObjName), "C_OBJ") - INSERT INTO C_OBJ (OBJNAME) VALUES (LOWER(lcObjName)) - ENDIF - - laPropsAndValues(m.I,1) = 'B' + PADL(C_OBJ.IORDER,3,'0') ; - + JUSTSTEM(laPropsAndValues(m.I,1)) + '.' ; - + .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', JUSTEXT(laPropsAndValues(m.I,1)) ) - - *laPropsAndValues(m.I,1) = 'B000' + lcObjName + '.' ; - + .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', JUSTEXT(laPropsAndValues(m.I,1)) ) - ELSE - * Genera obj+props para TX2 - lcObjName = GETWORDNUM(laPropsAndValues(m.I,1), 1, '.') - - IF NOT SEEK(LOWER(lcObjName), "C_OBJ") - INSERT INTO C_OBJ (OBJNAME) VALUES (LOWER(lcObjName)) - ENDIF - - laPropsAndValues(m.I,1) = 'B' + PADL(C_OBJ.IORDER,3,'0') ; - + JUSTSTEM(laPropsAndValues(m.I,1)) + '.' ; - + JUSTEXT(laPropsAndValues(m.I,1)) - - *laPropsAndValues(m.I,1) = 'B' + PADL(I,3,'0') + laPropsAndValues(m.I,1) - ENDIF - ELSE - IF m.tnSortType = 2 - * Genera obj+props para BIN - laPropsAndValues(m.I,1) = .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', laPropsAndValues(m.I,1) ) - ELSE - * Genera obj+props para TX2 - laPropsAndValues(m.I,1) = 'A000' + laPropsAndValues(m.I,1) - ENDIF - ENDIF - ENDFOR - - * Paso 3: Ordenar según la prioridad previa - IF .l_PropSort_Enabled - ASORT( laPropsAndValues, 1, -1, 0, 1) - ENDIF - - - * Paso 4: Quitar metadatos y rearmar array - FOR I = 1 TO m.tnPropsAndValues_Count - *-- Quitar caracteres agregados antes del SORT - IF '.' $ laPropsAndValues(m.I,1) - IF m.tnSortType = 2 - * Genera obj+props para BIN - taPropsAndValues(m.I,1) = JUSTSTEM( SUBSTR( laPropsAndValues(m.I,1), 2+3 ) ) + '.' ; - + .sortPropsAndValues_SetAndGetSCXPropNames( 'GETNAME', JUSTEXT(laPropsAndValues(m.I,1)) ) - ELSE - * Genera obj+props para TX2 - taPropsAndValues(m.I,1) = SUBSTR( laPropsAndValues(m.I,1), 2+3 ) - ENDIF - ELSE - IF m.tnSortType = 2 - * Genera obj+props para BIN - taPropsAndValues(m.I,1) = .sortPropsAndValues_SetAndGetSCXPropNames( 'GETNAME', laPropsAndValues(m.I,1) ) - ELSE - * Genera obj+props para TX2 - taPropsAndValues(m.I,1) = SUBSTR( laPropsAndValues(m.I,1), 2+3 ) - ENDIF - ENDIF - - taPropsAndValues(m.I,2) = laPropsAndValues(m.I,2) - - IF lnArrayCols >= 3 - taPropsAndValues(m.I,3) = laPropsAndValues(m.I,3) - ENDIF - ENDFOR - - ELSE && m.tnSortType = 0 - *-- SIN SORT: Creo 2 arrays, el bueno y el temporal, y al terminar agrego el temporal al bueno. - *-- Debo separar las props.normales de las de los objetos (ocurre cuando es un ADD OBJECT) - X = 0 - - *-- PRIMERO las que no tienen punto - FOR I = 1 TO m.tnPropsAndValues_Count - IF EMPTY( laPropsAndValues(m.I,1) ) - LOOP - ENDIF - - IF NOT '.' $ laPropsAndValues(m.I,1) - X = m.X + 1 - taPropsAndValues(m.X,1) = laPropsAndValues(m.I,1) - taPropsAndValues(m.X,2) = laPropsAndValues(m.I,2) - IF lnArrayCols >= 3 - taPropsAndValues(m.X,3) = laPropsAndValues(m.I,3) - ENDIF - ENDIF - ENDFOR - - *-- LUEGO las demás props. - FOR I = 1 TO m.tnPropsAndValues_Count - IF EMPTY( laPropsAndValues(m.I,1) ) - LOOP - ENDIF - - IF '.' $ laPropsAndValues(m.I,1) - X = m.X + 1 - taPropsAndValues(m.X,1) = laPropsAndValues(m.I,1) - taPropsAndValues(m.X,2) = laPropsAndValues(m.I,2) - IF lnArrayCols >= 3 - taPropsAndValues(m.X,3) = laPropsAndValues(m.I,3) - ENDIF - ENDIF - ENDFOR - ENDIF - ENDWITH && THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' - - - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - RELEASE taPropsAndValues, tnPropsAndValues_Count, tnSortType ; - , I, X, lnArrayCols, laPropsAndValues, lcPropName, lcSortedMemo, lcMethods - USE IN (SELECT("C_OBJ")) - SELECT (lnSelect) - ENDTRY - - RETURN - ENDPROC - - - - PROCEDURE sortSpecialProps - TRY - LOCAL I, loEx AS EXCEPTION, lcPropsFile - lcPropsFile = '' + Otherwise + lnPos = Ascan( .a_SpecialProps, lcPropName, 1, 0, 1, 1+2+4 ) + Endcase + #Endif + +*IF lnPos2 <> lnPos +* ERROR 'lnPos y lnPos2 no coinciden para "' + .c_ClaseActual + '.' + lcPropName + '"! lnPos=' + TRANSFORM(lnPos) + ', lnPos2=' + TRANSFORM(lnPos2) +*ENDIF + +*-- Genera una propiedad con el formato "A nnn Propiedad", donde los valores más altos quedan al final, +*-- de modo que primero van las props nativas, luego las del usuario y al final "name", que es especial. +*-- Ej: "A004ScaleMode", ..., "A998UserProp", "A999Name" + lcPropName = 'A' + Padl( Evl(lnPos,998), 3, '0' ) + lcPropName + Endwith && THIS + Endcase + + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release tcOperation, tcPropName, lnPos, loEx + Endtry + + Return lcPropName + Endproc + + + Procedure sortPropsAndValues +* KNOWLEDGE BASE: +* 02/12/2013 FDBOZZO Fidel Charny me pasó un ejemplo donde se pierden propiedades físicamente +* si se ordenan alfabéticamente en un ADD OBJECT. Pierde "picture" y otras más. +* Pareciera que la última debe ser "Name". +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taPropsAndValues (!@ IN ) El array con las propiedades y valores del objeto o clase +* tnPropsAndValues_Count (v! IN ) Cantidad de propiedades +* tnSortType (v! IN ) Tipo de sort: +* 0=Solo separar propiedades de clase y de objetos (.) +* 1=Sort completo de propiedades (para la versión TEXTO) +* 2=Sort completo de propiedades con "Name" al final (para la versión BIN) +*-------------------------------------------------------------------------------------------------------------- + Lparameters taPropsAndValues, tnPropsAndValues_Count, tnSortType + + External Array taPropsAndValues + + Try + Local I, X, lnArrayCols, laPropsAndValues(1,2), lcPropName, lcSortedMemo, lcMethods ; + , lnSelect, lcObjName + lnArrayCols = Alen( taPropsAndValues, 2 ) + lnSelect = Select() + Dimension laPropsAndValues( tnPropsAndValues_Count, lnArrayCols ) + Acopy( taPropsAndValues, laPropsAndValues ) + + With This As c_conversor_base Of 'FOXBIN2PRG.PRG' + If m.tnSortType > 0 +* CON SORT: +* - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final + +* ATENCIÓN: 10/07/2018 +* Cuando hay ADD OBJECT multicontenedor (obj.obj.obj...), el reordenamiento +* puede producir daños colaterales, como objetos mal colocados. +* (Era de esperar: No todo se puede ordenar alfabéticamente) +* Un solución de compromiso podría ser al menos mantener juntos los objetos de mismo nombre, +* que en la práctica pueden estar todos mezclados. Al menos eso no rompería nada. +* VER: https://github.com/fdbozzo/foxbin2prg/issues/28 +* +* PASO 1: Obtener los nombres únicos y asignarles un código de orden + Create Cursor C_OBJ (OBJNAME C(50), IORDER I Autoinc) + Index On OBJNAME Tag OBJNAME + +* PASO 2: Configurar las prioridades de ordenamiento (primero props, luego objs) + For I = 1 To m.tnPropsAndValues_Count + If '.' $ laPropsAndValues(m.I,1) + If m.tnSortType = 2 +* Genera obj+props para BIN + lcObjName = Getwordnum(laPropsAndValues(m.I,1), 1, '.') + + If Not Seek(Lower(lcObjName), "C_OBJ") + Insert Into C_OBJ (OBJNAME) Values (Lower(lcObjName)) + Endif + + laPropsAndValues(m.I,1) = 'B' + Padl(C_OBJ.IORDER,3,'0') ; + + Juststem(laPropsAndValues(m.I,1)) + '.' ; + + .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', Justext(laPropsAndValues(m.I,1)) ) + +*laPropsAndValues(m.I,1) = 'B000' + lcObjName + '.' ; ++ .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', JUSTEXT(laPropsAndValues(m.I,1)) ) + Else +* Genera obj+props para TX2 + lcObjName = Getwordnum(laPropsAndValues(m.I,1), 1, '.') + + If Not Seek(Lower(lcObjName), "C_OBJ") + Insert Into C_OBJ (OBJNAME) Values (Lower(lcObjName)) + Endif + + laPropsAndValues(m.I,1) = 'B' + Padl(C_OBJ.IORDER,3,'0') ; + + Juststem(laPropsAndValues(m.I,1)) + '.' ; + + Justext(laPropsAndValues(m.I,1)) + +*laPropsAndValues(m.I,1) = 'B' + PADL(I,3,'0') + laPropsAndValues(m.I,1) + Endif + Else + If m.tnSortType = 2 +* Genera obj+props para BIN + laPropsAndValues(m.I,1) = .sortPropsAndValues_SetAndGetSCXPropNames( 'SETNAME', laPropsAndValues(m.I,1) ) + Else +* Genera obj+props para TX2 + laPropsAndValues(m.I,1) = 'A000' + laPropsAndValues(m.I,1) + Endif + Endif + Endfor + +* Paso 3: Ordenar según la prioridad previa + If .l_PropSort_Enabled + Asort( laPropsAndValues, 1, -1, 0, 1) + Endif + + +* Paso 4: Quitar metadatos y rearmar array + For I = 1 To m.tnPropsAndValues_Count +*-- Quitar caracteres agregados antes del SORT + If '.' $ laPropsAndValues(m.I,1) + If m.tnSortType = 2 +* Genera obj+props para BIN + taPropsAndValues(m.I,1) = Juststem( Substr( laPropsAndValues(m.I,1), 2+3 ) ) + '.' ; + + .sortPropsAndValues_SetAndGetSCXPropNames( 'GETNAME', Justext(laPropsAndValues(m.I,1)) ) + Else +* Genera obj+props para TX2 + taPropsAndValues(m.I,1) = Substr( laPropsAndValues(m.I,1), 2+3 ) + Endif + Else + If m.tnSortType = 2 +* Genera obj+props para BIN + taPropsAndValues(m.I,1) = .sortPropsAndValues_SetAndGetSCXPropNames( 'GETNAME', laPropsAndValues(m.I,1) ) + Else +* Genera obj+props para TX2 + taPropsAndValues(m.I,1) = Substr( laPropsAndValues(m.I,1), 2+3 ) + Endif + Endif + + taPropsAndValues(m.I,2) = laPropsAndValues(m.I,2) + + If lnArrayCols >= 3 + taPropsAndValues(m.I,3) = laPropsAndValues(m.I,3) + Endif + Endfor + + Else && m.tnSortType = 0 +*-- SIN SORT: Creo 2 arrays, el bueno y el temporal, y al terminar agrego el temporal al bueno. +*-- Debo separar las props.normales de las de los objetos (ocurre cuando es un ADD OBJECT) + X = 0 + +*-- PRIMERO las que no tienen punto + For I = 1 To m.tnPropsAndValues_Count + If Empty( laPropsAndValues(m.I,1) ) + Loop + Endif + + If Not '.' $ laPropsAndValues(m.I,1) + X = m.X + 1 + taPropsAndValues(m.X,1) = laPropsAndValues(m.I,1) + taPropsAndValues(m.X,2) = laPropsAndValues(m.I,2) + If lnArrayCols >= 3 + taPropsAndValues(m.X,3) = laPropsAndValues(m.I,3) + Endif + Endif + Endfor + +*-- LUEGO las demás props. + For I = 1 To m.tnPropsAndValues_Count + If Empty( laPropsAndValues(m.I,1) ) + Loop + Endif + + If '.' $ laPropsAndValues(m.I,1) + X = m.X + 1 + taPropsAndValues(m.X,1) = laPropsAndValues(m.I,1) + taPropsAndValues(m.X,2) = laPropsAndValues(m.I,2) + If lnArrayCols >= 3 + taPropsAndValues(m.X,3) = laPropsAndValues(m.I,3) + Endif + Endif + Endfor + Endif + Endwith && THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + + + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release taPropsAndValues, tnPropsAndValues_Count, tnSortType ; + , I, X, lnArrayCols, laPropsAndValues, lcPropName, lcSortedMemo, lcMethods + Use In (Select("C_OBJ")) + Select (lnSelect) + Endtry + + Return + Endproc + + + + Procedure sortSpecialProps + Try + Local I, loEx As Exception, lcPropsFile + lcPropsFile = '' - WITH THIS AS conversor_base OF "FOXBIN2PRG.PRG" - *-- (TODAS) => Antes era solo FORM - #IF .F. - *-- 03/04/2015 FDBOZZO - *-- Quise comparar la velocidad de los ASCAN(array) contra un SEEK a una tabla de propiedades con índice, y resulta que para - *-- unas 1500 propiedades casi no hay diferencias (10 segundos en unos 1600 archivos) :( - USE (FULLPATH( 'foxbin2prg_keywords', .c_Foxbin2prg_FullPath )) SHARED NOUPDATE AGAIN IN 0 ORDER PK && C_CLASS+C_KEYWORD - #ELSE - I = 0 + With This As conversor_base Of "FOXBIN2PRG.PRG" +*-- (TODAS) => Antes era solo FORM + #If .F. +*-- 03/04/2015 FDBOZZO +*-- Quise comparar la velocidad de los ASCAN(array) contra un SEEK a una tabla de propiedades con índice, y resulta que para +*-- unas 1500 propiedades casi no hay diferencias (10 segundos en unos 1600 archivos) :( + Use (Fullpath( 'foxbin2prg_keywords', .c_Foxbin2prg_FullPath )) Shared Noupdate Again In 0 Order PK && C_CLASS+C_KEYWORD + #Else + I = 0 - lcPropsFile = FORCEPATH( "props_all.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_all.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_checkbox.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Chk, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_checkbox.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Chk, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_collection.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Coll, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_collection.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Coll, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_combobox.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Cbo, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_combobox.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Cbo, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_commandgroup.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Cmg, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_commandgroup.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Cmg, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_commandbutton.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Cmd, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_commandbutton.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Cmd, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_cursor.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Cur, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_cursor.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Cur, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_cursoradapter.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_CA, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_cursoradapter.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_CA, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_dataenvironment.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_DE, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_dataenvironment.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_DE, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_editbox.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Edt, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_editbox.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Edt, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_formset.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Frs, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_formset.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Frs, Filetostr( lcPropsFile ), 1+4 ) - *lcPropsFile = FORCEPATH( "props_grid.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - *I = ALINES( .a_SpecialProps_Grd, FILETOSTR( lcPropsFile ), 1+4 ) +*lcPropsFile = FORCEPATH( "props_grid.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) +*I = ALINES( .a_SpecialProps_Grd, FILETOSTR( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_grid_column.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Grc, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_grid_column.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Grc, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_grid_header.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Grh, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_grid_header.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Grh, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_hyperlink.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Hlk, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_hyperlink.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Hlk, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_image.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Img, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_image.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Img, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_label.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Lbl, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_label.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Lbl, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_line.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Lin, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_line.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Lin, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_listbox.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Lst, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_listbox.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Lst, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_olebound.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Ole, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_olebound.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Ole, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_optiongroup.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Opg, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_optiongroup.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Opg, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_optiongroup_option.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Opb, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_optiongroup_option.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Opb, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_projecthook.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Phk, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_projecthook.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Phk, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_relation.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Rel, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_relation.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Rel, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_reportlistener.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Rls, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_reportlistener.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Rls, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_separator.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Sep, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_separator.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Sep, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_shape.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Shp, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_shape.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Shp, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_spinner.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Spn, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_spinner.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Spn, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_textbox.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Txt, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_textbox.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Txt, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_timer.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_Tmr, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_timer.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_Tmr, Filetostr( lcPropsFile ), 1+4 ) - *lcPropsFile = FORCEPATH( "props_toolbar.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - *I = ALINES( .a_SpecialProps_Tbr, FILETOSTR( lcPropsFile ), 1+4 ) +*lcPropsFile = FORCEPATH( "props_toolbar.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) +*I = ALINES( .a_SpecialProps_Tbr, FILETOSTR( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_xmladapter.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_XMLAda, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_xmladapter.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_XMLAda, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_xmlfield.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_XMLFld, FILETOSTR( lcPropsFile ), 1+4 ) + lcPropsFile = Forcepath( "props_xmlfield.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_XMLFld, Filetostr( lcPropsFile ), 1+4 ) - lcPropsFile = FORCEPATH( "props_xmltable.txt", JUSTPATH( .c_Foxbin2prg_FullPath ) ) - I = ALINES( .a_SpecialProps_XMLTbl, FILETOSTR( lcPropsFile ), 1+4 ) - #ENDIF + lcPropsFile = Forcepath( "props_xmltable.txt", Justpath( .c_Foxbin2prg_FullPath ) ) + I = Alines( .a_SpecialProps_XMLTbl, Filetostr( lcPropsFile ), 1+4 ) + #Endif - ENDWITH + Endwith - CATCH TO loEx - loEx.USERVALUE = 'lcPropsFile = ' + lcPropsFile + Catch To loEx + loEx.UserValue = 'lcPropsFile = ' + lcPropsFile - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE writeLog - LPARAMETERS tcText, tnTimeStamp + Procedure writeLog + Lparameters tcText, tnTimeStamp - TRY - WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' - *-- Según el valor de nTimestamp: - *-- 0 = Sin timestamp - *-- 1 = Timestamp por delante - *-- 2 = Timestamp por detrás - .c_TextLog = .c_TextLog ; - + IIF( EVL(tnTimeStamp,0) = 1, TTOC(DATETIME(),3) + ' ', '' ) ; - + EVL(tcText,'') ; - + IIF( EVL(tnTimeStamp,0) = 2, ' ' + TTOC(DATETIME(),3), '' ) ; - + CR_LF - ENDWITH - CATCH - ENDTRY - ENDPROC + Try + With This As c_conversor_base Of 'FOXBIN2PRG.PRG' +*-- Según el valor de nTimestamp: +*-- 0 = Sin timestamp +*-- 1 = Timestamp por delante +*-- 2 = Timestamp por detrás + .c_TextLog = .c_TextLog ; + + Iif( Evl(tnTimeStamp,0) = 1, Ttoc(Datetime(),3) + ' ', '' ) ; + + Evl(tcText,'') ; + + Iif( Evl(tnTimeStamp,0) = 2, ' ' + Ttoc(Datetime(),3), '' ) ; + + CR_LF + Endwith + Catch + Endtry + Endproc - PROCEDURE writeErrorLog - LPARAMETERS tcText + Procedure writeErrorLog + Lparameters tcText - TRY - WITH THIS AS conversor_base OF "FOXBIN2PRG.PRG" - .c_TextErr = .c_TextErr + EVL(tcText,'') + CR_LF - .l_Error = .T. - ENDWITH - CATCH - ENDTRY - ENDPROC + Try + With This As conversor_base Of "FOXBIN2PRG.PRG" + .c_TextErr = .c_TextErr + Evl(tcText,'') + CR_LF + .l_Error = .T. + Endwith + Catch + Endtry + Endproc -ENDDEFINE +Enddefine -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 +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 - _MEMBERDATA = [] ; + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -7986,137 +7998,137 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (!@ IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - DODEFAULT( @toModulo, @toEx, @toFoxBin2Prg ) - ENDPROC + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (!@ IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toModulo, toEx As Exception, toFoxBin2Prg + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + DoDefault( @toModulo, @toEx, @toFoxBin2Prg ) + Endproc - FUNCTION get_ValueByName_FromListNamesWithValues - *-- ASIGNO EL VALOR DEL ARRAY DE DATOS Y VALORES PARA LA PROPIEDAD INDICADA - LPARAMETERS tcPropName, tcValueType, taPropsAndValues - LOCAL lnPos, luPropValue + Function get_ValueByName_FromListNamesWithValues +*-- ASIGNO EL VALOR DEL ARRAY DE DATOS Y VALORES PARA LA PROPIEDAD INDICADA + Lparameters tcPropName, tcValueType, taPropsAndValues + Local lnPos, luPropValue - lnPos = ASCAN( taPropsAndValues, tcPropName, 1, 0, 1, 1+2+4+8) + lnPos = Ascan( taPropsAndValues, tcPropName, 1, 0, 1, 1+2+4+8) - IF lnPos = 0 OR EMPTY( taPropsAndValues( lnPos, 2 ) ) - *-- Valores no encontrados o vacíos + If lnPos = 0 Or Empty( taPropsAndValues( lnPos, 2 ) ) +*-- Valores no encontrados o vacíos luPropValue = '' - ELSE + Else luPropValue = taPropsAndValues( lnPos, 2 ) - ENDIF + Endif - DO CASE - CASE tcValueType = 'I' - luPropValue = CAST( luPropValue AS INTEGER ) + Do Case + Case tcValueType = 'I' + luPropValue = Cast( luPropValue As Integer ) - CASE tcValueType = 'N' - luPropValue = CAST( luPropValue AS DOUBLE ) + Case tcValueType = 'N' + luPropValue = Cast( luPropValue As Double ) - CASE tcValueType = 'T' - luPropValue = CAST( luPropValue AS DATETIME ) + Case tcValueType = 'T' + luPropValue = Cast( luPropValue As Datetime ) - CASE tcValueType = 'D' - luPropValue = CAST( luPropValue AS DATE ) + Case tcValueType = 'D' + luPropValue = Cast( luPropValue As Date ) - CASE tcValueType = 'E' - luPropValue = EVALUATE( luPropValue ) + Case tcValueType = 'E' + luPropValue = Evaluate( luPropValue ) - OTHERWISE && Asumo 'C' para lo demás - luPropValue = luPropValue + Otherwise && Asumo 'C' para lo demás + luPropValue = luPropValue - ENDCASE + Endcase - RELEASE tcPropName, tcValueType, taPropsAndValues, lnPos - RETURN luPropValue - ENDFUNC + Release tcPropName, tcValueType, taPropsAndValues, lnPos + Return luPropValue + Endfunc - PROCEDURE analyzeCodeBlock_FoxBin2Prg - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toModulo, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_FoxBin2Prg +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toModulo, tcLine, taCodeLines, I, tnCodeLines - LOCAL llBloqueEncontrado, laPropsAndValues(1,2), lnPropsAndValues_Count + Local llBloqueEncontrado, laPropsAndValues(1,2), lnPropsAndValues_Count - IF UPPER( LEFT( tcLine + ' ', LEN(C_FB2PRG_META_I) + 1 ) ) == C_FB2PRG_META_I + ' ' - WITH THIS AS c_conversor_prg_a_bin OF foxbin2prg.prg + If Upper( Left( tcLine + ' ', Len(C_FB2PRG_META_I) + 1 ) ) == C_FB2PRG_META_I + ' ' + With This As c_conversor_prg_a_bin Of foxbin2prg.prg llBloqueEncontrado = .T. - *-- Metadatos del módulo +*-- Metadatos del módulo .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_FB2PRG_META_I, C_FB2PRG_META_F ) toModulo._Version = .get_ValueByName_FromListNamesWithValues( 'Version', 'N', @laPropsAndValues ) toModulo._SourceFile = .get_ValueByName_FromListNamesWithValues( 'SourceFile', 'C', @laPropsAndValues ) - ENDWITH - ENDIF + Endwith + Endif - RELEASE toModulo, tcLine, taCodeLines, I, tnCodeLines - RETURN llBloqueEncontrado - ENDPROC + Release toModulo, tcLine, taCodeLines, I, tnCodeLines + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_LIBCOMMENT - *------------------------------------------------------ - *-- Analiza el bloque * - *------------------------------------------------------ - LPARAMETERS toModulo, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_LIBCOMMENT +*------------------------------------------------------ +*-- Analiza el bloque * +*------------------------------------------------------ + Lparameters toModulo, tcLine, taCodeLines, I, tnCodeLines - LOCAL llBloqueEncontrado, laPropsAndValues(1,2), lnPropsAndValues_Count + Local llBloqueEncontrado, laPropsAndValues(1,2), lnPropsAndValues_Count - IF UPPER( LEFT( tcLine, LEN(C_LIBCOMMENT_I) ) ) == C_LIBCOMMENT_I + If Upper( Left( tcLine, Len(C_LIBCOMMENT_I) ) ) == C_LIBCOMMENT_I llBloqueEncontrado = .T. - *-- Metadatos del módulo - toModulo._Comment = ALLTRIM( STREXTRACT( tcLine, C_LIBCOMMENT_I, C_LIBCOMMENT_F ) ) - ENDIF +*-- Metadatos del módulo + toModulo._Comment = Alltrim( Strextract( tcLine, C_LIBCOMMENT_I, C_LIBCOMMENT_F ) ) + Endif - RELEASE toModulo, tcLine, taCodeLines, I, tnCodeLines, laPropsAndValues, lnPropsAndValues_Count - RETURN llBloqueEncontrado - ENDPROC + Release toModulo, tcLine, taCodeLines, I, tnCodeLines, laPropsAndValues, lnPropsAndValues_Count + Return llBloqueEncontrado + Endproc - PROCEDURE createProject - LPARAMETERS tcTableOrCursor && 'TABLE' or 'CURSOR' + Procedure createProject + Lparameters tcTableOrCursor && 'TABLE' or 'CURSOR' - LOCAL lcCursorName - tcTableOrCursor = EVL( tcTableOrCursor, 'TABLE' ) - lcCursorName = ICASE( tcTableOrCursor = 'TABLE', THIS.c_OutputFile, 'TABLABIN' ) + Local lcCursorName + tcTableOrCursor = Evl( tcTableOrCursor, 'TABLE' ) + lcCursorName = Icase( tcTableOrCursor = 'TABLE', This.c_OutputFile, 'TABLABIN' ) - CREATE &tcTableOrCursor. (lcCursorName) ; - ( NAME M ; - , TYPE C(1) ; - , ID N(10) ; - , TIMESTAMP N(10) ; + Create &tcTableOrCursor. (lcCursorName) ; + ( Name M ; + , Type C(1) ; + , Id N(10) ; + , Timestamp N(10) ; , OUTFILE M ; - , HOMEDIR M ; + , HomeDir M ; , EXCLUDE L ; , MAINPROG L ; , SAVECODE L ; - , DEBUG L ; - , ENCRYPT L ; + , Debug L ; + , Encrypt L ; , NOLOGO L ; , CMNTSTYLE N(1) ; , OBJREV N(5) ; , DEVINFO M ; , SYMBOLS M ; - , OBJECT M ; + , Object M ; , CKVAL N(6) ; , CPID N(5) ; , OSTYPE C(4) ; @@ -8125,51 +8137,51 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED1 M ; , RESERVED2 M ; , SCCDATA M ; - , LOCAL L ; - , KEY C(32) ; - , USER M ) + , Local L ; + , Key C(32) ; + , User M ) - IF tcTableOrCursor = 'TABLE' THEN - USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED - ENDIF + If tcTableOrCursor = 'TABLE' Then + Use (This.c_OutputFile) Alias TABLABIN Again Shared + Endif - ENDPROC + Endproc - PROCEDURE createProject_RecordHeader - LPARAMETERS toProject + Procedure createProject_RecordHeader + Lparameters toProject - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - INSERT INTO TABLABIN ; - ( NAME ; - , TYPE ; - , TIMESTAMP ; + Insert Into TABLABIN ; + ( Name ; + , Type ; + , Timestamp ; , OUTFILE ; - , HOMEDIR ; + , HomeDir ; , SAVECODE ; - , DEBUG ; - , ENCRYPT ; + , Debug ; + , Encrypt ; , NOLOGO ; , CMNTSTYLE ; , OBJREV ; , DEVINFO ; - , OBJECT ; + , Object ; , RESERVED1 ; , RESERVED2 ; , SCCDATA ; - , LOCAL ; - , USER ; - , KEY ) ; + , Local ; + , User ; + , Key ) ; VALUES ; - ( UPPER( FORCEPATH( EVL(THIS.c_OriginalFileName,THIS.c_OutputFile), toProject._HomeDir) ) + CHR(0) ; + ( Upper( Forcepath( Evl(This.c_OriginalFileName,This.c_OutputFile), toProject._HomeDir) ) + Chr(0) ; , 'H' ; , 0 ; - , '' + CHR(0) ; - , LOWER(toProject._HomeDir) + CHR(0) ; + , '' + Chr(0) ; + , Lower(toProject._HomeDir) + Chr(0) ; , toProject._SaveCode ; , toProject._Debug ; , toProject._Encrypted ; @@ -8177,38 +8189,38 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , toProject._CmntStyle ; , 260 ; , toProject.getRowDeviceInfo() ; - , LOWER(toProject._HomeDir) + CHR(0) ; - , UPPER( FORCEPATH( EVL(THIS.c_OriginalFileName,THIS.c_OutputFile), toProject._HomeDir) ) + CHR(0) ; + , Lower(toProject._HomeDir) + Chr(0) ; + , Upper( Forcepath( Evl(This.c_OriginalFileName,This.c_OutputFile), toProject._HomeDir) ) + Chr(0) ; , toProject._ServerHead.getRowServerInfo() ; , toProject._SccData ; , .T. ; - , STRCONV(toProject._User,14) ; - , UPPER( JUSTSTEM( THIS.c_OutputFile) ) ) + , Strconv(toProject._User,14) ; + , Upper( Juststem( This.c_OutputFile) ) ) - ENDPROC + Endproc - PROCEDURE createClasslib - LPARAMETERS tcTableOrCursor && 'TABLE' or 'CURSOR' + Procedure createClasslib + Lparameters tcTableOrCursor && 'TABLE' or 'CURSOR' - LOCAL lcCursorName - tcTableOrCursor = EVL( tcTableOrCursor, 'TABLE' ) - lcCursorName = ICASE( tcTableOrCursor = 'TABLE', THIS.c_OutputFile, 'TABLABIN' ) + Local lcCursorName + tcTableOrCursor = Evl( tcTableOrCursor, 'TABLE' ) + lcCursorName = Icase( tcTableOrCursor = 'TABLE', This.c_OutputFile, 'TABLABIN' ) - CREATE &tcTableOrCursor. (lcCursorName) ; + Create &tcTableOrCursor. (lcCursorName) ; ( PLATFORM C(8) ; , UNIQUEID C(10) ; - , TIMESTAMP N(10) ; - , CLASS M ; + , Timestamp N(10) ; + , Class M ; , CLASSLOC M ; - , BASECLASS M ; + , BaseClass M ; , OBJNAME M ; - , PARENT M ; + , Parent M ; , PROPERTIES M ; - , PROTECTED M ; + , Protected M ; , METHODS M ; - , OBJCODE M NOCPTRANS ; + , OBJCODE M NoCPTrans ; , OLE M ; , OLE2 M ; , RESERVED1 M ; @@ -8219,24 +8231,24 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 M ; , RESERVED7 M ; , RESERVED8 M ; - , USER M ) + , User M ) - IF tcTableOrCursor = 'TABLE' THEN - USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED - ENDIF + If tcTableOrCursor = 'TABLE' Then + Use (This.c_OutputFile) Alias TABLABIN Again Shared + Endif - ENDPROC + Endproc - PROCEDURE createClasslib_RecordHeader - LPARAMETERS toModulo + Procedure createClasslib_RecordHeader + Lparameters toModulo - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + #Endif - INSERT INTO TABLABIN ; + Insert Into TABLABIN ; ( PLATFORM ; , UNIQUEID ; , RESERVED1 ; @@ -8247,30 +8259,30 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , 'VERSION = 3.00' ; , toModulo._Comment ) - ENDPROC + Endproc - PROCEDURE createForm - LPARAMETERS tcTableOrCursor && 'TABLE' or 'CURSOR' + Procedure createForm + Lparameters tcTableOrCursor && 'TABLE' or 'CURSOR' - LOCAL lcCursorName - tcTableOrCursor = EVL( tcTableOrCursor, 'TABLE' ) - lcCursorName = ICASE( tcTableOrCursor = 'TABLE', THIS.c_OutputFile, 'TABLABIN' ) + Local lcCursorName + tcTableOrCursor = Evl( tcTableOrCursor, 'TABLE' ) + lcCursorName = Icase( tcTableOrCursor = 'TABLE', This.c_OutputFile, 'TABLABIN' ) - CREATE &tcTableOrCursor. (lcCursorName) ; + Create &tcTableOrCursor. (lcCursorName) ; ( PLATFORM C(8) ; , UNIQUEID C(10) ; - , TIMESTAMP N(10) ; - , CLASS M ; + , Timestamp N(10) ; + , Class M ; , CLASSLOC M ; - , BASECLASS M ; + , BaseClass M ; , OBJNAME M ; - , PARENT M ; + , Parent M ; , PROPERTIES M ; - , PROTECTED M ; + , Protected M ; , METHODS M ; - , OBJCODE M NOCPTRANS ; + , OBJCODE M NoCPTrans ; , OLE M ; , OLE2 M ; , RESERVED1 M ; @@ -8281,24 +8293,24 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 M ; , RESERVED7 M ; , RESERVED8 M ; - , USER M ) + , User M ) - IF tcTableOrCursor = 'TABLE' THEN - USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED - ENDIF + If tcTableOrCursor = 'TABLE' Then + Use (This.c_OutputFile) Alias TABLABIN Again Shared + Endif - ENDPROC + Endproc - PROCEDURE createForm_RecordHeader - LPARAMETERS toModulo + Procedure createForm_RecordHeader + Lparameters toModulo - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + #Endif - INSERT INTO TABLABIN ; + Insert Into TABLABIN ; ( PLATFORM ; , UNIQUEID ; , RESERVED1 ; @@ -8309,18 +8321,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , 'VERSION = 3.00' ; , toModulo._Comment ) - ENDPROC + Endproc - PROCEDURE createReport - LPARAMETERS tcTableOrCursor && 'TABLE' or 'CURSOR' + Procedure createReport + Lparameters tcTableOrCursor && 'TABLE' or 'CURSOR' - LOCAL lcCursorName - tcTableOrCursor = EVL( tcTableOrCursor, 'TABLE' ) - lcCursorName = ICASE( tcTableOrCursor = 'TABLE', THIS.c_OutputFile, 'TABLABIN' ) + Local lcCursorName + tcTableOrCursor = Evl( tcTableOrCursor, 'TABLE' ) + lcCursorName = Icase( tcTableOrCursor = 'TABLE', This.c_OutputFile, 'TABLABIN' ) - CREATE &tcTableOrCursor. (lcCursorName) ; + Create &tcTableOrCursor. (lcCursorName) ; ( 'PLATFORM' C(8) ; , 'UNIQUEID' C(10) ; , 'TIMESTAMP' N(10) ; @@ -8334,14 +8346,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , 'WIDTH' N(9,3) ; , 'STYLE' M ; , 'PICTURE' M ; - , 'ORDER' M NOCPTRANS ; + , 'ORDER' M NoCPTrans ; , 'UNIQUE' L ; , 'COMMENT' M ; , 'ENVIRON' L ; , 'BOXCHAR' C(1) ; , 'FILLCHAR' C(1) ; , 'TAG' M ; - , 'TAG2' M NOCPTRANS ; + , 'TAG2' M NoCPTrans ; , 'PENRED' N(5) ; , 'PENGREEN' N(5) ; , 'PENBLUE' N(5) ; @@ -8397,473 +8409,473 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , 'SUPEXPR' M ; , 'USER' M ) - IF tcTableOrCursor = 'TABLE' THEN - USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED - ENDIF + If tcTableOrCursor = 'TABLE' Then + Use (This.c_OutputFile) Alias TABLABIN Again Shared + Endif - ENDPROC + Endproc - PROCEDURE createMenu - LPARAMETERS tcTableOrCursor && 'TABLE' or 'CURSOR' + Procedure createMenu + Lparameters tcTableOrCursor && 'TABLE' or 'CURSOR' - LOCAL lcCursorName - tcTableOrCursor = EVL( tcTableOrCursor, 'TABLE' ) - lcCursorName = ICASE( tcTableOrCursor = 'TABLE', THIS.c_OutputFile, 'TABLABIN' ) + Local lcCursorName + tcTableOrCursor = Evl( tcTableOrCursor, 'TABLE' ) + lcCursorName = Icase( tcTableOrCursor = 'TABLE', This.c_OutputFile, 'TABLABIN' ) - CREATE &tcTableOrCursor. (lcCursorName) ; + Create &tcTableOrCursor. (lcCursorName) ; ( 'OBJTYPE' Numeric(2) ; , 'OBJCODE' Numeric(2) ; - , 'NAME' MEMO ; - , 'PROMPT' MEMO ; - , 'COMMAND' MEMO ; - , 'MESSAGE' MEMO ; + , 'NAME' Memo ; + , 'PROMPT' Memo ; + , 'COMMAND' Memo ; + , 'MESSAGE' Memo ; , 'PROCTYPE' Numeric(1) ; - , 'PROCEDURE' MEMO ; + , 'PROCEDURE' Memo ; , 'SETUPTYPE' Numeric(1) ; - , 'SETUP' MEMO ; + , 'SETUP' Memo ; , 'CLEANTYPE' Numeric(1) ; - , 'CLEANUP' MEMO ; - , 'MARK' CHARACTER(1) ; - , 'KEYNAME' MEMO ; - , 'KEYLABEL' MEMO ; - , 'SKIPFOR' MEMO ; + , 'CLEANUP' Memo ; + , 'MARK' Character(1) ; + , 'KEYNAME' Memo ; + , 'KEYLABEL' Memo ; + , 'SKIPFOR' Memo ; , 'NAMECHANGE' Logical ; , 'NUMITEMS' Numeric(2) ; - , 'LEVELNAME' CHARACTER(10) ; - , 'ITEMNUM' CHARACTER(3) ; - , 'COMMENT' MEMORY(4) ; + , 'LEVELNAME' Character(10) ; + , 'ITEMNUM' Character(3) ; + , 'COMMENT' Memory(4) ; , 'LOCATION' Numeric(2) ; , 'SCHEME' Numeric(2) ; , 'SYSRES' Numeric(1) ; - , 'RESNAME' MEMORY(4) ) + , 'RESNAME' Memory(4) ) - IF tcTableOrCursor = 'TABLE' THEN - USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED - ENDIF + If tcTableOrCursor = 'TABLE' Then + Use (This.c_OutputFile) Alias TABLABIN Again Shared + Endif - ENDPROC + Endproc - PROCEDURE writeBinaryFile - LPARAMETERS toModulo - ENDPROC + Procedure writeBinaryFile + Lparameters toModulo + Endproc - PROCEDURE classProps2Memo - *-------------------------------------------------------------------------------------------------------------- - * ARMA EL MEMO DE PROPERTIES CON LAS PROPIEDADES Y SUS VALORES - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toClase (!@ IN ) Objeto de la Clase - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toClase, toFoxBin2Prg + Procedure classProps2Memo +*-------------------------------------------------------------------------------------------------------------- +* ARMA EL MEMO DE PROPERTIES CON LAS PROPIEDADES Y SUS VALORES +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toClase (!@ IN ) Objeto de la Clase +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- + Lparameters toClase, toFoxBin2Prg - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - *-- ESTRUCTURA A ANALIZAR: Propiedades normales, con CR codificado () y con CR+LF () - * HEIGHT = 2.73 - * NAME = "c1" - * prop1 = .F. && Mi prop 1 - * prop_especial_cr = Este es el valor 1 Este el 2 Y Este bajo Shift_Enter el 3 - * prop_especial_crlf = - * Este es el valor 1 - * Este el 2 - * Y Este bajo Shift_Enter el 3 - * - * WIDTH = 27.40 - * _MEMBERDATA = - * - * - * && XML Metadata for customizable properties - *-- Fin: ESTRUCTURA A ANALIZAR: +*-- ESTRUCTURA A ANALIZAR: Propiedades normales, con CR codificado () y con CR+LF () +* HEIGHT = 2.73 +* NAME = "c1" +* prop1 = .F. && Mi prop 1 +* prop_especial_cr = Este es el valor 1 Este el 2 Y Este bajo Shift_Enter el 3 +* prop_especial_crlf = +* Este es el valor 1 +* Este el 2 +* Y Este bajo Shift_Enter el 3 +* +* WIDTH = 27.40 +* _MEMBERDATA = +* +* +* && XML Metadata for customizable properties +*-- Fin: ESTRUCTURA A ANALIZAR: - TRY - LOCAL I, lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count - lcMemo = '' + Try + Local I, lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count + lcMemo = '' - IF toClase._Prop_Count > 0 - WITH THIS AS c_conversor_prg_a_bin OF foxbin2prg.prg - .updateProgressbar( 'Generating Props for Class ' + toClase._Nombre + '...', 0, 1, 2 ) - .c_ClaseActual = LOWER(toClase._BaseClass) - DIMENSION laPropsAndValues( toClase._Prop_Count, 3 ) - ACOPY( toClase._Props, laPropsAndValues ) - lnPropsAndValues_Count = toClase._Prop_Count + If toClase._Prop_Count > 0 + With This As c_conversor_prg_a_bin Of foxbin2prg.prg + .updateProgressbar( 'Generating Props for Class ' + toClase._Nombre + '...', 0, 1, 2 ) + .c_ClaseActual = Lower(toClase._BaseClass) + Dimension laPropsAndValues( toClase._Prop_Count, 3 ) + Acopy( toClase._Props, laPropsAndValues ) + lnPropsAndValues_Count = toClase._Prop_Count - *-- REORDENO LAS PROPIEDADES - .sortPropsAndValues( @laPropsAndValues, lnPropsAndValues_Count, 2 ) +*-- REORDENO LAS PROPIEDADES + .sortPropsAndValues( @laPropsAndValues, lnPropsAndValues_Count, 2 ) - *-- ARMO EL MEMO A DEVOLVER - FOR I = 1 TO lnPropsAndValues_Count - * - * Skip ZOrderSet if configured to - * - IF toFoxBin2Prg.l_RemoveZOrderSetFromProps AND ATC( '.ZOrderSet.', '.' + laPropsAndValues(m.I, 1) + '.' ) > 0 THEN - LOOP - ENDIF - lcMemo = lcMemo + laPropsAndValues(m.I,1) + ' = ' + laPropsAndValues(m.I,2) + CR_LF - ENDFOR - ENDWITH - ENDIF && toClase._Prop_Count > 0 +*-- ARMO EL MEMO A DEVOLVER + For I = 1 To lnPropsAndValues_Count +* +* Skip ZOrderSet if configured to +* + If toFoxBin2Prg.l_RemoveZOrderSetFromProps And Atc( '.ZOrderSet.', '.' + laPropsAndValues(m.I, 1) + '.' ) > 0 Then + Loop + Endif + lcMemo = lcMemo + laPropsAndValues(m.I,1) + ' = ' + laPropsAndValues(m.I,2) + CR_LF + Endfor + Endwith + Endif && toClase._Prop_Count > 0 - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE toClase, I, laPropsAndValues, lnPropsAndValues_Count - ENDTRY + Finally + Release toClase, I, laPropsAndValues, lnPropsAndValues_Count + Endtry - RETURN lcMemo - ENDPROC + Return lcMemo + Endproc - PROCEDURE objectProps2Memo - *-- ARMA EL MEMO DE PROPERTIES CON LAS PROPIEDADES Y SUS VALORES - LPARAMETERS toObjeto, toClase + Procedure objectProps2Memo +*-- ARMA EL MEMO DE PROPERTIES CON LAS PROPIEDADES Y SUS VALORES + Lparameters toObjeto, toClase - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; - , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' ; + , toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcMemo, I, laPropsAndValues(1,2) + Local lcMemo, I, laPropsAndValues(1,2) lcMemo = '' - IF toObjeto._Prop_Count > 0 - WITH THIS AS c_conversor_prg_a_bin OF foxbin2prg.prg - .c_ClaseActual = LOWER(toObjeto._BaseClass) - DIMENSION laPropsAndValues( toObjeto._Prop_Count, 2 ) - ACOPY( toObjeto._Props, laPropsAndValues ) + If toObjeto._Prop_Count > 0 + With This As c_conversor_prg_a_bin Of foxbin2prg.prg + .c_ClaseActual = Lower(toObjeto._BaseClass) + Dimension laPropsAndValues( toObjeto._Prop_Count, 2 ) + Acopy( toObjeto._Props, laPropsAndValues ) - *-- REORDENO LAS PROPIEDADES +*-- REORDENO LAS PROPIEDADES .sortPropsAndValues( @laPropsAndValues, toObjeto._Prop_Count, 2 ) - *-- ARMO EL MEMO A DEVOLVER - FOR I = 1 TO toObjeto._Prop_Count +*-- ARMO EL MEMO A DEVOLVER + For I = 1 To toObjeto._Prop_Count lcMemo = lcMemo + laPropsAndValues(m.I,1) + ' = ' + laPropsAndValues(m.I,2) + CR_LF - ENDFOR - ENDWITH - ENDIF + Endfor + Endwith + Endif - RELEASE toObjeto, toClase, I, laPropsAndValues - RETURN lcMemo - ENDPROC + Release toObjeto, toClase, I, laPropsAndValues + Return lcMemo + Endproc - PROCEDURE classMethods2Memo - LPARAMETERS toClase + Procedure classMethods2Memo + Lparameters toClase - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcMemo, I, X, lcNombreObjeto ; - , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' + Local lcMemo, I, X, lcNombreObjeto ; + , loProcedure As CL_PROCEDURE Of 'FOXBIN2PRG.PRG' lcMemo = '' - *-- Recorrer los métodos - WITH THIS AS c_conversor_prg_a_bin OF foxbin2prg.prg - FOR I = 1 TO toClase._Procedure_Count - loProcedure = NULL +*-- Recorrer los métodos + With This As c_conversor_prg_a_bin Of foxbin2prg.prg + For I = 1 To toClase._Procedure_Count + loProcedure = Null loProcedure = toClase._Procedures(m.I) - IF loProcedure._ProcLine_Count > 0 THEN + If loProcedure._ProcLine_Count > 0 Then .updateProgressbar( 'Generating Procedure ' + toClase._Nombre + '.' + loProcedure._Nombre + '...', m.I, toClase._Procedure_Count, 2 ) - IF '.' $ loProcedure._Nombre - *-- cboNombre.InteractiveChange ==> No debe acortarse por ser método modificado de combobox heredado de la clase - *-- cntDatos.txtEdad.Valid ==> Debe acortarse si cntDatos es un objeto existente - lcNombreObjeto = LEFT( loProcedure._Nombre, AT('.', loProcedure._Nombre) - 1 ) + If '.' $ loProcedure._Nombre +*-- cboNombre.InteractiveChange ==> No debe acortarse por ser método modificado de combobox heredado de la clase +*-- cntDatos.txtEdad.Valid ==> Debe acortarse si cntDatos es un objeto existente + lcNombreObjeto = Left( loProcedure._Nombre, At('.', loProcedure._Nombre) - 1 ) - IF .findMethodsObjectByName( lcNombreObjeto, toClase ) = 0 + If .findMethodsObjectByName( lcNombreObjeto, toClase ) = 0 TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> <> ENDTEXT - *lcMemo = lcMemo + C_PROCEDURE + ' ' + loProcedure._Nombre - ELSE +*lcMemo = lcMemo + C_PROCEDURE + ' ' + loProcedure._Nombre + Else TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> <> ENDTEXT - *lcMemo = lcMemo + C_PROCEDURE + ' ' + SUBSTR( loProcedure._Nombre, AT('.', loProcedure._Nombre) + 1 ) - ENDIF - ELSE +*lcMemo = lcMemo + C_PROCEDURE + ' ' + SUBSTR( loProcedure._Nombre, AT('.', loProcedure._Nombre) + 1 ) + Endif + Else TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> <> ENDTEXT - *lcMemo = lcMemo + C_PROCEDURE + ' ' + loProcedure._Nombre - ENDIF +*lcMemo = lcMemo + C_PROCEDURE + ' ' + loProcedure._Nombre + Endif - *-- Incluir las líneas del método - *.updateProgressbar( 'Generating Lines of Procedure ' + toClase._Nombre + '.' + loProcedure._Nombre + '...', m.I, toClase._Procedure_Count, 2 ) - FOR X = 1 TO loProcedure._ProcLine_Count - *TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - * <> - *ENDTEXT - lcMemo = lcMemo + CHR(13) + CHR(10) + loProcedure._ProcLines(m.X) - ENDFOR +*-- Incluir las líneas del método +*.updateProgressbar( 'Generating Lines of Procedure ' + toClase._Nombre + '.' + loProcedure._Nombre + '...', m.I, toClase._Procedure_Count, 2 ) + For X = 1 To loProcedure._ProcLine_Count +*TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 +* <> +*ENDTEXT + lcMemo = lcMemo + Chr(13) + Chr(10) + loProcedure._ProcLines(m.X) + Endfor TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> <<>> ENDTEXT - ENDIF - ENDFOR - ENDWITH + Endif + Endfor + Endwith - loProcedure = NULL - RELEASE toClase, I, X, lcNombreObjeto, loProcedure - RETURN lcMemo - ENDPROC + loProcedure = Null + Release toClase, I, X, lcNombreObjeto, loProcedure + Return lcMemo + Endproc - PROCEDURE objectMethods2Memo - LPARAMETERS toObjeto, toClase + Procedure objectMethods2Memo + Lparameters toObjeto, toClase - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; - , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' ; + , toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcMemo, I, X, lcNombreObjeto ; - , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' + Local lcMemo, I, X, lcNombreObjeto ; + , loProcedure As CL_PROCEDURE Of 'FOXBIN2PRG.PRG' lcMemo = '' - *-- Recorrer los métodos - THIS.updateProgressbar( 'Generating Object Methods for ' + toClase._Nombre + '.' + toObjeto._ObjName + '...', 0, 1, 2 ) - FOR I = 1 TO toObjeto._Procedure_Count - loProcedure = NULL +*-- Recorrer los métodos + This.updateProgressbar( 'Generating Object Methods for ' + toClase._Nombre + '.' + toObjeto._ObjName + '...', 0, 1, 2 ) + For I = 1 To toObjeto._Procedure_Count + loProcedure = Null loProcedure = toObjeto._Procedures(m.I) TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> <> ENDTEXT - *-- Incluir las líneas del método - FOR X = 1 TO loProcedure._ProcLine_Count - lcMemo = lcMemo + CHR(13) + CHR(10) + loProcedure._ProcLines(m.X) - ENDFOR +*-- Incluir las líneas del método + For X = 1 To loProcedure._ProcLine_Count + lcMemo = lcMemo + Chr(13) + Chr(10) + loProcedure._ProcLines(m.X) + Endfor TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> <<>> ENDTEXT - ENDFOR + Endfor - loProcedure = NULL - RELEASE toObjeto, toClase, I, X, lcNombreObjeto, loProcedure - RETURN lcMemo - ENDPROC + loProcedure = Null + Release toObjeto, toClase, I, X, lcNombreObjeto, loProcedure + Return lcMemo + Endproc - PROCEDURE getClassPropertyComment - *-- Devuelve el comentario (columna 2 del array toClase._Props) de la propiedad indicada, - *-- buscándola en la columna 2 por su nombre. - LPARAMETERS tcPropName AS STRING, toClase + Procedure getClassPropertyComment +*-- Devuelve el comentario (columna 2 del array toClase._Props) de la propiedad indicada, +*-- buscándola en la columna 2 por su nombre. + Lparameters tcPropName As String, toClase - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL I, lcComentario + Local I, lcComentario lcComentario = '' - FOR I = 1 TO toClase._Prop_Count - IF RTRIM( GETWORDNUM( toClase._Props(m.I,1), 1, '=' ) ) == tcPropName + For I = 1 To toClase._Prop_Count + If Rtrim( Getwordnum( toClase._Props(m.I,1), 1, '=' ) ) == tcPropName lcComentario = toClase._Props( m.I, 2 ) - EXIT - ENDIF - ENDFOR + Exit + Endif + Endfor - RELEASE tcPropName, toClase, I - RETURN lcComentario - ENDPROC + Release tcPropName, toClase, I + Return lcComentario + Endproc - PROCEDURE getClassMethodComment - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLine (@! IN/OUT) Línea a separar del comentario (En este punto, el único comentario puede ser un HELPSTRING) - * tcComment (@? OUT) Comentario - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcLine AS STRING, tcComment as String + Procedure getClassMethodComment +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcLine (@! IN/OUT) Línea a separar del comentario (En este punto, el único comentario puede ser un HELPSTRING) +* tcComment (@? OUT) Comentario +*--------------------------------------------------------------------------------------------------- + Lparameters tcLine As String, tcComment As String - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lnATC + Local lnATC tcComment = '' - lnATC = ATC("HELPSTRING", tcLine) + lnATC = Atc("HELPSTRING", tcLine) - IF lnATC > 0 - tcComment = ALLTRIM(SUBSTR(tcLine, lnATC + 10 )) + If lnATC > 0 + tcComment = Alltrim(Substr(tcLine, lnATC + 10 )) - * Quitar comillas - tcComment = SUBSTR(tcComment, 2, LEN(tcComment) - 2) +* Quitar comillas + tcComment = Substr(tcComment, 2, Len(tcComment) - 2) - tcLine = RTRIM(LEFT(tcLine, lnATC - 1 ), 0, CHR(9), CHR(0), ' ') - ENDIF + tcLine = Rtrim(Left(tcLine, lnATC - 1 ), 0, Chr(9), Chr(0), ' ') + Endif - RETURN tcComment - ENDPROC + Return tcComment + Endproc - PROCEDURE getTextFrom_BIN_FileStructure - TRY - LOCAL lcStructure, lnSelect - lnSelect = SELECT() - SELECT 0 - USE (THIS.c_InputFile) SHARED AGAIN ALIAS _TABLABIN - COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( THIS.c_TempDir ) ) ) - **** CONTINUAR SI ES NECESARIO - SIN USO POR AHORA /// DO NOT USE - NOT IMPLEMENTED! + Procedure getTextFrom_BIN_FileStructure + Try + Local lcStructure, lnSelect + lnSelect = Select() + Select 0 + Use (This.c_InputFile) Shared Again Alias _TABLABIN + Copy Structure Extended To ( Forcepath( '_FRX_STRUC.DBF', Addbs( This.c_TempDir ) ) ) +**** CONTINUAR SI ES NECESARIO - SIN USO POR AHORA /// DO NOT USE - NOT IMPLEMENTED! - CATCH TO loEx - THROW + Catch To loEx + Throw - FINALLY - USE IN (SELECT("_TABLABIN")) - SELECT (lnSelect) - ENDTRY + Finally + Use In (Select("_TABLABIN")) + Select (lnSelect) + Endtry - RETURN lcStructure - ENDPROC + Return lcStructure + Endproc - PROCEDURE defined_PAM2Memo - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toClase (!@ IN ) Objeto de la Clase - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toClase - RETURN toClase._Defined_PAM - ENDPROC + Procedure defined_PAM2Memo +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toClase (!@ IN ) Objeto de la Clase +*-------------------------------------------------------------------------------------------------------------- + Lparameters toClase + Return toClase._Defined_PAM + Endproc - PROCEDURE strip_Dimensions - LPARAMETERS tcSeparatedCommaVars - LOCAL lnPos1, lnPos2, I + Procedure strip_Dimensions + Lparameters tcSeparatedCommaVars + Local lnPos1, lnPos2, I - FOR I = OCCURS( '[', tcSeparatedCommaVars ) TO 1 STEP -1 - lnPos1 = AT( '[', tcSeparatedCommaVars, m.I ) - lnPos2 = AT( ']', tcSeparatedCommaVars, m.I ) - tcSeparatedCommaVars = STUFF( tcSeparatedCommaVars, lnPos1, lnPos2 - lnPos1 + 1, '' ) - ENDFOR + For I = Occurs( '[', tcSeparatedCommaVars ) To 1 Step -1 + lnPos1 = At( '[', tcSeparatedCommaVars, m.I ) + lnPos2 = At( ']', tcSeparatedCommaVars, m.I ) + tcSeparatedCommaVars = Stuff( tcSeparatedCommaVars, lnPos1, lnPos2 - lnPos1 + 1, '' ) + Endfor - RELEASE tcSeparatedCommaVars, lnPos1, lnPos2, I - RETURN - ENDPROC + Release tcSeparatedCommaVars, lnPos1, lnPos2, I + Return + Endproc - PROCEDURE hiddenAndProtected_PAM - LPARAMETERS toClase + Procedure hiddenAndProtected_PAM + Lparameters toClase - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lcMemo, I, lcPAM, lcComentario + Local lcMemo, I, lcPAM, lcComentario lcMemo = '' - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' .evaluate_PAM( @lcMemo, toClase._ProtectedProps, 'property', 'protected' ) .evaluate_PAM( @lcMemo, toClase._HiddenProps, 'property', 'hidden' ) .evaluate_PAM( @lcMemo, toClase._ProtectedMethods, 'method', 'protected' ) .evaluate_PAM( @lcMemo, toClase._HiddenMethods, 'method', 'hidden' ) - ENDWITH && THIS + Endwith && THIS - RELEASE toClase, I, lcPAM, lcComentario - RETURN lcMemo - ENDPROC + Release toClase, I, lcPAM, lcComentario + Return lcMemo + Endproc - PROCEDURE evaluate_PAM - LPARAMETERS tcMemo AS STRING, tcPAM AS STRING, tcPAM_Type AS STRING, tcPAM_Visibility AS STRING + Procedure evaluate_PAM + Lparameters tcMemo As String, tcPAM As String, tcPAM_Type As String, tcPAM_Visibility As String - LOCAL lcPAM, I + Local lcPAM, I - FOR I = 1 TO OCCURS( ',', tcPAM + ',' ) - lcPAM = ALLTRIM( GETWORDNUM( tcPAM, m.I, ',' ) ) + For I = 1 To Occurs( ',', tcPAM + ',' ) + lcPAM = Alltrim( Getwordnum( tcPAM, m.I, ',' ) ) - IF NOT EMPTY(lcPAM) - IF EVL(tcPAM_Visibility, 'normal') == 'hidden' + If Not Empty(lcPAM) + If Evl(tcPAM_Visibility, 'normal') == 'hidden' lcPAM = lcPAM + '^' - ENDIF + Endif tcMemo = tcMemo + lcPAM + CR_LF - ENDIF - ENDFOR + Endif + Endfor - RELEASE tcMemo, tcPAM, tcPAM_Type, tcPAM_Visibility, lcPAM, I - RETURN - ENDPROC + Release tcMemo, tcPAM, tcPAM_Type, tcPAM_Visibility, lcPAM, I + Return + Endproc - PROCEDURE insert_Object - LPARAMETERS toClase, toObjeto, toFoxBin2Prg + Procedure insert_Object + Lparameters toClase, toObjeto, toFoxBin2Prg - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + Local toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + #Endif - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - IF NOT .l_Test - LOCAL lcPropsMemo, lcMethodsMemo + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + If Not .l_Test + Local lcPropsMemo, lcMethodsMemo lcPropsMemo = .objectProps2Memo( toObjeto, toClase ) lcMethodsMemo = .objectMethods2Memo( toObjeto, toClase ) - IF EMPTY(toObjeto._TimeStamp) + If Empty(toObjeto._TimeStamp) toObjeto._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(toObjeto._UniqueID) + Endif + If Empty(toObjeto._UniqueID) toObjeto._UniqueID = toFoxBin2Prg.unique_ID() - ENDIF + Endif - *-- Inserto el objeto - IF JUSTEXT(toFoxBin2Prg.c_InputFile) = toFoxBin2Prg.c_PJ2 - * Solo los PJX/PJ2 tienen el campo DEVINFO - INSERT INTO TABLABIN ; +*-- Inserto el objeto + If Justext(toFoxBin2Prg.c_InputFile) = toFoxBin2Prg.c_PJ2 +* Solo los PJX/PJ2 tienen el campo DEVINFO + Insert Into TABLABIN ; ( PLATFORM ; , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; + , Timestamp ; + , Class ; , CLASSLOC ; - , BASECLASS ; + , BaseClass ; , OBJNAME ; - , PARENT ; + , Parent ; , PROPERTIES ; - , PROTECTED ; + , Protected ; , METHODS ; , OLE ; , OLE2 ; @@ -8875,7 +8887,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER ; + , User ; , DEVINFO ) ; VALUES ; ( 'WINDOWS' ; @@ -8899,20 +8911,20 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , '' ; , '' ; , '' ; - , STRCONV(toObjeto._User,14) ; - , STRCONV(toObjeto._DevInfo,14) ) - ELSE - INSERT INTO TABLABIN ; + , Strconv(toObjeto._User,14) ; + , Strconv(toObjeto._DevInfo,14) ) + Else + Insert Into TABLABIN ; ( PLATFORM ; , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; + , Timestamp ; + , Class ; , CLASSLOC ; - , BASECLASS ; + , BaseClass ; , OBJNAME ; - , PARENT ; + , Parent ; , PROPERTIES ; - , PROTECTED ; + , Protected ; , METHODS ; , OLE ; , OLE2 ; @@ -8924,7 +8936,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER ) ; + , User ) ; VALUES ; ( 'WINDOWS' ; , toObjeto._UniqueID ; @@ -8947,1489 +8959,1489 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , '' ; , '' ; , '' ; - , STRCONV(toObjeto._User,14) ) - ENDIF - ENDIF - ENDWITH && THIS + , Strconv(toObjeto._User,14) ) + Endif + Endif + Endwith && THIS - RELEASE toClase, toObjeto, toFoxBin2Prg, lcPropsMemo, lcMethodsMemo - RETURN - ENDPROC + Release toClase, toObjeto, toFoxBin2Prg, lcPropsMemo, lcMethodsMemo + Return + Endproc - PROCEDURE insert_AllObjects - *-- Recorro primero los objetos con ZOrder definido, y luego los demás - *-- NOTA: Como consecuencia de una integración de código, puede que se hayan agregado objetos nuevos (desconocidos), - *-- pero todo lo demás tiene un ZOrder definido, que es el número de registro original * 100. - LPARAMETERS toClase, toFoxBin2Prg + Procedure insert_AllObjects +*-- Recorro primero los objetos con ZOrder definido, y luego los demás +*-- NOTA: Como consecuencia de una integración de código, puede que se hayan agregado objetos nuevos (desconocidos), +*-- pero todo lo demás tiene un ZOrder definido, que es el número de registro original * 100. + Lparameters toClase, toFoxBin2Prg - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL N, X, lcObjName, loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - loObjeto = NULL + Try + Local N, X, lcObjName, loObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + loObjeto = Null - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - IF toClase._AddObject_Count > 0 - N = 0 + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + If toClase._AddObject_Count > 0 + N = 0 - *-- Armo array con el orden Z de los objetos - DIMENSION laObjNames( toClase._AddObject_Count, 2 ) +*-- Armo array con el orden Z de los objetos + Dimension laObjNames( toClase._AddObject_Count, 2 ) - FOR X = 1 TO toClase._AddObject_Count - loObjeto = toClase._AddObjects( m.X ) + For X = 1 To toClase._AddObject_Count + loObjeto = toClase._AddObjects( m.X ) - IF EMPTY(loObjeto._TimeStamp) - loObjeto._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loObjeto._UniqueID) - loObjeto._UniqueID = toFoxBin2Prg.unique_ID() - ENDIF + If Empty(loObjeto._TimeStamp) + loObjeto._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + Endif + If Empty(loObjeto._UniqueID) + loObjeto._UniqueID = toFoxBin2Prg.unique_ID() + Endif - laObjNames( m.X, 1 ) = loObjeto._Nombre - laObjNames( m.X, 2 ) = loObjeto._ZOrder - loObjeto = NULL - ENDFOR + laObjNames( m.X, 1 ) = loObjeto._Nombre + laObjNames( m.X, 2 ) = loObjeto._ZOrder + loObjeto = Null + Endfor - ASORT( laObjNames, 2, -1, 0, 1 ) + Asort( laObjNames, 2, -1, 0, 1 ) - *-- Escribo los objetos en el orden Z - FOR X = 1 TO toClase._AddObject_Count - lcObjName = laObjNames( m.X, 1 ) +*-- Escribo los objetos en el orden Z + For X = 1 To toClase._AddObject_Count + lcObjName = laObjNames( m.X, 1 ) - FOR EACH loObjeto IN toClase._AddObjects FOXOBJECT - *-- Verifico que sea el objeto que corresponde - IF loObjeto._WriteOrder = 0 AND LOWER(loObjeto._Nombre) == LOWER(lcObjName) - N = N + 1 - loObjeto._WriteOrder = N + For Each loObjeto In toClase._AddObjects FoxObject +*-- Verifico que sea el objeto que corresponde + If loObjeto._WriteOrder = 0 And Lower(loObjeto._Nombre) == Lower(lcObjName) + N = N + 1 + loObjeto._WriteOrder = N + .insert_Object( @toClase, @loObjeto, @toFoxBin2Prg ) + Exit + Endif + Endfor + Endfor + + +*-- Recorro los objetos Desconocidos + For Each loObjeto In toClase._AddObjects FoxObject + If loObjeto._WriteOrder = 0 .insert_Object( @toClase, @loObjeto, @toFoxBin2Prg ) - EXIT - ENDIF - ENDFOR - ENDFOR + Endif + Endfor + Endif && toClase._AddObject_Count > 0 + Endwith && THIS - *-- Recorro los objetos Desconocidos - FOR EACH loObjeto IN toClase._AddObjects FOXOBJECT - IF loObjeto._WriteOrder = 0 - .insert_Object( @toClase, @loObjeto, @toFoxBin2Prg ) - ENDIF - ENDFOR + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - ENDIF && toClase._AddObject_Count > 0 - ENDWITH && THIS + Throw - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Finally + loObjeto = Null + Release toClase, toFoxBin2Prg, N, X, lcObjName, loObjeto - THROW + Endtry - FINALLY - loObjeto = NULL - RELEASE toClase, toFoxBin2Prg, N, X, lcObjName, loObjeto - - ENDTRY - - RETURN - ENDPROC + Return + Endproc - PROCEDURE set_Line - LPARAMETERS tcLine, taCodeLines, I - tcLine = LTRIM( taCodeLines(m.I), 0, CHR(9), ' ' ) - ENDPROC + Procedure set_Line + Lparameters tcLine, taCodeLines, I + tcLine = Ltrim( taCodeLines(m.I), 0, Chr(9), ' ' ) + Endproc - PROCEDURE analyzeProcedureLines - LPARAMETERS toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; + Procedure analyzeProcedureLines + Lparameters toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; , taLineasExclusion, tnBloquesExclusion - EXTERNAL ARRAY taCodeLines + External Array taCodeLines - #IF .F. - LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llEsProcedureDeClase ; - , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - loProcedure = NULL + Try + Local llEsProcedureDeClase ; + , loProcedure As CL_PROCEDURE Of 'FOXBIN2PRG.PRG' ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang + loProcedure = Null - IF '.' $ tcProcedureAbierto AND VARTYPE(toObjeto) = 'O' AND toObjeto._Procedure_Count > 0 - loProcedure = toObjeto._Procedures(toObjeto._Procedure_Count) - ELSE - llEsProcedureDeClase = .T. - loProcedure = toClase._Procedures(toClase._Procedure_Count) - ENDIF + If '.' $ tcProcedureAbierto And Vartype(toObjeto) = 'O' And toObjeto._Procedure_Count > 0 + loProcedure = toObjeto._Procedures(toObjeto._Procedure_Count) + Else + llEsProcedureDeClase = .T. + loProcedure = toClase._Procedures(toClase._Procedure_Count) + Endif - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - IF NOT .excludedLine( m.I, tnBloquesExclusion, @taLineasExclusion ) ; - AND NOT .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) + If Not .excludedLine( m.I, tnBloquesExclusion, @taLineasExclusion ) ; + AND Not .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) - DO CASE - CASE UPPER( LEFT( tcLine + ' ', 8 ) ) == 'ENDPROC ' ; && Fin del PROCEDURE - OR UPPER( LEFT( tcLine + ' ', 8 ) ) == 'ENDFUNC ' && Fin de la FUNCTION + Do Case + Case Upper( Left( tcLine + ' ', 8 ) ) == 'ENDPROC ' ; && Fin del PROCEDURE + Or Upper( Left( tcLine + ' ', 8 ) ) == 'ENDFUNC ' && Fin de la FUNCTION - tcProcedureAbierto = '' - EXIT + tcProcedureAbierto = '' + Exit - CASE UPPER( LEFT( tcLine + ' ', 10 ) ) == 'ENDDEFINE ' && Fin de bloque (ENDDEFINE) encontrado - IF llEsProcedureDeClase - *ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; - + toClase._Nombre + ' (' + loProcedure._Nombre + ')' ; - + ', línea ' + TRANSFORM(m.I) + ' del archivo ' + .c_InputFile - ERROR (TEXTMERGE(loLang.C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC)) - ELSE - *ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; - + toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ; - + ', línea ' + TRANSFORM(m.I) + ' del archivo ' + .c_InputFile - ERROR (TEXTMERGE(loLang.C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC)) - ENDIF - ENDCASE - ENDIF + Case Upper( Left( tcLine + ' ', 10 ) ) == 'ENDDEFINE ' && Fin de bloque (ENDDEFINE) encontrado + If llEsProcedureDeClase +*ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; ++ toClase._Nombre + ' (' + loProcedure._Nombre + ')' ; ++ ', línea ' + TRANSFORM(m.I) + ' del archivo ' + .c_InputFile + Error (Textmerge(loLang.C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_LOC)) + Else +*ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; ++ toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ; ++ ', línea ' + TRANSFORM(m.I) + ' del archivo ' + .c_InputFile + Error (Textmerge(loLang.C_STRUCTURE_NESTING_ERROR_ENDPROC_EXPECTED_2_LOC)) + Endif + Endcase + Endif - *-- Quito 2 TABS de la izquierda (si se puede y si el integrador/desarrollador no la lió quitándolos) - DO CASE - CASE LEFT( taCodeLines(m.I),2 ) = C_TAB + C_TAB - loProcedure.add_Line( SUBSTR(taCodeLines(m.I), 3) ) - CASE LEFT( taCodeLines(m.I),1 ) = C_TAB - loProcedure.add_Line( SUBSTR(taCodeLines(m.I), 2) ) - OTHERWISE - loProcedure.add_Line( taCodeLines(m.I) ) - ENDCASE - ENDFOR - ENDWITH && THIS +*-- Quito 2 TABS de la izquierda (si se puede y si el integrador/desarrollador no la lió quitándolos) + Do Case + Case Left( taCodeLines(m.I),2 ) = C_TAB + C_TAB + loProcedure.add_Line( Substr(taCodeLines(m.I), 3) ) + Case Left( taCodeLines(m.I),1 ) = C_TAB + loProcedure.add_Line( Substr(taCodeLines(m.I), 2) ) + Otherwise + loProcedure.add_Line( taCodeLines(m.I) ) + Endcase + Endfor + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - loProcedure = NULL - RELEASE toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; - , taLineasExclusion, tnBloquesExclusion, llEsProcedureDeClase, loProcedure + Finally + loProcedure = Null + Release toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; + , taLineasExclusion, tnBloquesExclusion, llEsProcedureDeClase, loProcedure - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE analyzeCodeBlock_ADD_OBJECT - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (!@ IN ) Objeto del Modulo - * toClase (!@ IN ) Objeto de la Clase - * tcLine (!@ IN ) Línea de datos en evaluación - * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar - * I (!@ IN ) Número de línea en evaluación - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * toFoxBin2Prg (?@ IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toClase, tcLine, I, taCodeLines, tnCodeLines, toFoxBin2Prg + Procedure analyzeCodeBlock_ADD_OBJECT +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (!@ IN ) Objeto del Modulo +* toClase (!@ IN ) Objeto de la Clase +* tcLine (!@ IN ) Línea de datos en evaluación +* taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar +* I (!@ IN ) Número de línea en evaluación +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* toFoxBin2Prg (?@ IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- + Lparameters toModulo, toClase, tcLine, I, taCodeLines, tnCodeLines, toFoxBin2Prg - EXTERNAL ARRAY taCodeLines + External Array taCodeLines - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + Local toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado + Try + Local llBloqueEncontrado - IF UPPER( LEFT( tcLine, 11 ) ) == 'ADD OBJECT ' - *-- Estructura a reconocer: ADD OBJECT 'frm_a.Check1' AS check [WITH] - WITH THIS AS c_conversor_prg_a_bin OF foxbin2prg.prg - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, Z, lcProp, lcValue, lcNombre, lcObjName, lnPos ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + If Upper( Left( tcLine, 11 ) ) == 'ADD OBJECT ' +*-- Estructura a reconocer: ADD OBJECT 'frm_a.Check1' AS check [WITH] + With This As c_conversor_prg_a_bin Of foxbin2prg.prg + Local laPropsAndValues(1,2), lnPropsAndValues_Count, Z, lcProp, lcValue, lcNombre, lcObjName, lnPos ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + llBloqueEncontrado = .T. + loLang = _Screen.o_FoxBin2Prg_Lang + tcLine = Chrtran( tcLine, ['], ["] ) + + If Empty(toClase._Fin_Cab) + toClase._Fin_Cab = m.I-1 + toClase._Ini_Cuerpo = m.I + Endif + + toObjeto = Null + lcNombre = Alltrim( Chrtran( Strextract(tcLine, 'ADD OBJECT ', ' AS ', 1, 1), ['"], [] ) ) + lcObjName = Justext( '.' + lcNombre ) + .updateProgressbar( 'Analyzing Block Add Object ' + toClase._Nombre + '.' + lcObjName + '...', m.I, tnCodeLines, 1 ) + + If toClase.l_ObjectMetadataInHeader + For Z = 1 To toClase._AddObject_Count + If Lower(toClase._AddObjects(m.Z)._Nombre) == Lower(lcNombre) Then + toObjeto = toClase._AddObjects(m.Z) + Exit + Endif + Endfor + Endif + + If Isnull(toObjeto) + Z = 0 + toObjeto = Createobject('CL_OBJETO') +*-- Luego se reasigna el ZOrder, pero si no lo hace, se pone último como si se acabara de agregar. +*-- Puede pasar si se agrega manualmente al TX2 y se olvida agregar la metadata OBJECTDATA. + toObjeto._ZOrder = 9999 + toObjeto._Nombre = lcNombre + Endif + + toObjeto._ObjName = lcObjName + + If '.' $ toObjeto._Nombre + toObjeto._Parent = toClase._ObjName + '.' + Juststem( toObjeto._Nombre ) + Else + toObjeto._Parent = toClase._ObjName + Endif + + toObjeto._Nombre = toObjeto._Parent + '.' + toObjeto._ObjName + toObjeto._Class = Alltrim( Strextract(tcLine + ' WITH', ' AS ', ' WITH', 1, 1) ) + +*-- Chequeo de nombre de objeto repetido para el mismo contenedor + If toClase._aPathObjName_Count > 0 + lnPos = Ascan( toClase._aPathObjNames, toObjeto._Nombre, 1, 0, 1, 1+2+4+8 ) + + If lnPos > 0 Then +*-- ERROR: Objeto Duplicado + .writeErrorLog( '* ' + loLang.C_DUPLICATED_OBJECT_LOC + ' "' + toClase._Class + '.' + toObjeto._Nombre ; + + '" @line ' + Transform(m.I) + ', (1st.Line:' + Transform(toClase._aPathObjNames(lnPos,2)) + ')' ) + Endif + Endif + + If Not toClase.l_ObjectMetadataInHeader Or m.Z=0 + toClase.add_Object( toObjeto ) + Endif + + toClase.add_PathObjName(toObjeto._Nombre, m.I) + +*-- Propiedades del ADD OBJECT + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) + + If Upper( Left( tcLine, C_LEN_END_OBJECT_I) ) == C_END_OBJECT_I && Fin del ADD OBJECT y METADATOS +*< END OBJECT: baseclass = "olecontrol" Uniqueid = "_3X50L3I7V" OLEObject = "C:\WINDOWS\system32\FOXTLIB.OCX" checksum = "4101493921" /> + + .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count ; + , C_END_OBJECT_I, C_END_OBJECT_F ) + + toObjeto._ClassLib = .get_ValueByName_FromListNamesWithValues( 'ClassLib', 'C', @laPropsAndValues ) + toObjeto._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues ) + + If Not toClase.l_ObjectMetadataInHeader + toObjeto._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) + toObjeto._TimeStamp = Int( .rowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) + toObjeto._ZOrder = .get_ValueByName_FromListNamesWithValues( 'ZOrder', 'I', @laPropsAndValues ) + Endif + + toObjeto._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues ) + toObjeto._Ole = Strconv( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) + + If Not Empty( toObjeto._Ole2 ) && Le agrego "OLEObject = " delante + toObjeto._Ole2 = 'OLEObject = ' + toObjeto._Ole2 + CR_LF + Endif + +*-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. + If Empty(toObjeto._Ole) && Si _Ole está vacío es porque el propio control no tiene la info y está en la cabecera (antiguo guardado) + If toModulo.existeObjetoOLE( toObjeto._Nombre, @m.Z ) + toObjeto._Ole = toModulo._Ole_Objs(m.Z)._Value + Endif + Endif + + Exit + Endif + + If Right(tcLine, 3) == ', ;' && VALOR INTERMEDIO CON ", ;" + .get_SeparatedPropAndValue( Left(tcLine, Len(tcLine) - 3), @lcProp, @lcValue, toClase, @taCodeLines, @tnCodeLines, @m.I ) + +* +* Skip ZOrderSet if configured to +* + If toFoxBin2Prg.l_RemoveZOrderSetFromProps And Atc( '.ZOrderSet.', '.' + lcProp + '.' ) > 0 Then + Loop + Endif + toObjeto.add_Property( @lcProp, @lcValue ) + Else && VALOR FINAL SIN ", ;" (JUSTO ANTES DEL ) + .get_SeparatedPropAndValue( tcLine, @lcProp, @lcValue, toClase, @taCodeLines, @tnCodeLines, @m.I ) + +* +* Skip ZOrderSet if configured to +* + If toFoxBin2Prg.l_RemoveZOrderSetFromProps And Atc( '.ZOrderSet.', '.' + lcProp + '.' ) > 0 Then + Loop + Endif + toObjeto.add_Property( @lcProp, @lcValue ) + Endif + + Endfor + Endwith && THIS + Endif + + Catch To loEx + loEx.UserValue = loEx.UserValue + Textmerge('Source line=<>') + CR_LF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release toModulo, toClase, tcLine, I, taCodeLines, tnCodeLines ; + , laPropsAndValues, lnPropsAndValues_Count, Z, lcProp, lcValue, lcNombre, lcObjName + Endtry + + Return llBloqueEncontrado + Endproc + + + + + Procedure analyzeCodeBlock_DEFINED_PAM +*-------------------------------------------------------------------------------------------------------------- +* 07/01/2014 FDBOZZO Los *métodos deben ir siempre al final, si no los eventos ACCESS no se ejecutan! +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toClase (!@ IN ) Objeto de la Clase +* tcLine (!@ IN ) Línea de datos en evaluación +* taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* I (!@ IN ) Número de línea en evaluación +*-------------------------------------------------------------------------------------------------------------- + Lparameters toClase, tcLine, taCodeLines, tnCodeLines, I + +*-- ESTRUCTURA A ANALIZAR (también se admite sin los símbolos ^ y *): +* +*m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! +*m: *mimetodo && Mi metodo +*p: prop1 && Mi prop 1 +*p: prop_especial_cr && +*a: ^array_1_d[1,0] && Array 1 dimensión (1) +*a: ^array_2_d[1,2] && Array una dimension (1,2) +*p: _memberdata && XML Metadata for customizable properties +* + + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods, lcPAM_Type + + If Left( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I llBloqueEncontrado = .T. - loLang = _SCREEN.o_FoxBin2Prg_Lang - tcLine = CHRTRAN( tcLine, ['], ["] ) + Store '' To lcDefinedPAM, lcItem, lcMethods - IF EMPTY(toClase._Fin_Cab) - toClase._Fin_Cab = m.I-1 - toClase._Ini_Cuerpo = m.I - ENDIF + With This As c_conversor_prg_a_bin Of foxbin2prg.prg + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - toObjeto = NULL - lcNombre = ALLTRIM( CHRTRAN( STREXTRACT(tcLine, 'ADD OBJECT ', ' AS ', 1, 1), ['"], [] ) ) - lcObjName = JUSTEXT( '.' + lcNombre ) - .updateProgressbar( 'Analyzing Block Add Object ' + toClase._Nombre + '.' + lcObjName + '...', m.I, tnCodeLines, 1 ) + Do Case + Case Left( tcLine, C_LEN_DEFINED_PAM_F ) == C_DEFINED_PAM_F + I = m.I + 1 + Exit - IF toClase.l_ObjectMetadataInHeader - FOR Z = 1 TO toClase._AddObject_Count - IF LOWER(toClase._AddObjects(m.Z)._Nombre) == LOWER(lcNombre) THEN - toObjeto = toClase._AddObjects(m.Z) - EXIT - ENDIF - ENDFOR - ENDIF + Otherwise + lnPos = At( ':', tcLine, 1 ) + lnPos2 = At( '&'+'&', tcLine ) + lcPAM_Type = Left(tcLine,3) && *p:, *a:, *m: - IF ISNULL(toObjeto) - Z = 0 - toObjeto = CREATEOBJECT('CL_OBJETO') - *-- Luego se reasigna el ZOrder, pero si no lo hace, se pone último como si se acabara de agregar. - *-- Puede pasar si se agrega manualmente al TX2 y se olvida agregar la metadata OBJECTDATA. - toObjeto._ZOrder = 9999 - toObjeto._Nombre = lcNombre - ENDIF + If lnPos2 > 0 +*-- Con comentarios + lcPAM_Name = Lower( Alltrim( Substr( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', Chr(9) ) ) + lcItem = lcPAM_Name + ' ' + Substr( tcLine, lnPos2 + 3 ) + CR_LF - toObjeto._ObjName = lcObjName + Else +*-- Sin comentarios + lcPAM_Name = Lower( Alltrim( Substr( tcLine, lnPos+1 ), 0, ' ', Chr(9) ) ) + lcItem = lcPAM_Name + Iif( lcPAM_Type == '*p:' , '', ' ') + CR_LF - IF '.' $ toObjeto._Nombre - toObjeto._Parent = toClase._ObjName + '.' + JUSTSTEM( toObjeto._Nombre ) - ELSE - toObjeto._Parent = toClase._ObjName - ENDIF + Endif - toObjeto._Nombre = toObjeto._Parent + '.' + toObjeto._ObjName - toObjeto._Class = ALLTRIM( STREXTRACT(tcLine + ' WITH', ' AS ', ' WITH', 1, 1) ) +*-- Separo propiedades y métodos + If lcPAM_Type == '*m:' + If Left(lcItem,1) == '*' + lcMethods = lcMethods + lcItem + Else + lcMethods = lcMethods + '*' + lcItem + Endif + Else + If lcPAM_Type == '*a:' And Left(lcItem,1) <> '^' + lcDefinedPAM = lcDefinedPAM + '^' + lcItem + Else + lcDefinedPAM = lcDefinedPAM + lcItem + Endif + Endif + Endcase + Endfor + Endwith && THIS - *-- Chequeo de nombre de objeto repetido para el mismo contenedor - IF toClase._aPathObjName_Count > 0 - lnPos = ASCAN( toClase._aPathObjNames, toObjeto._Nombre, 1, 0, 1, 1+2+4+8 ) +*-- Junto propiedades y los métodos al final. + toClase._Defined_PAM = lcDefinedPAM + lcMethods + I = m.I - 1 + Endif - IF lnPos > 0 THEN - *-- ERROR: Objeto Duplicado - .writeErrorLog( '* ' + loLang.C_DUPLICATED_OBJECT_LOC + ' "' + toClase._Class + '.' + toObjeto._Nombre ; - + '" @line ' + TRANSFORM(m.I) + ', (1st.Line:' + TRANSFORM(toClase._aPathObjNames(lnPos,2)) + ')' ) - ENDIF - ENDIF + Catch To loEx + lnCodError = loEx.ErrorNo - IF NOT toClase.l_ObjectMetadataInHeader OR m.Z=0 - toClase.add_Object( toObjeto ) - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - toClase.add_PathObjName(toObjeto._Nombre, m.I) + Throw - *-- Propiedades del ADD OBJECT - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + Finally + Release toClase, tcLine, taCodeLines, tnCodeLines, I ; + , lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods, lcPAM_Type + Endtry - IF UPPER( LEFT( tcLine, C_LEN_END_OBJECT_I) ) == C_END_OBJECT_I && Fin del ADD OBJECT y METADATOS - *< END OBJECT: baseclass = "olecontrol" Uniqueid = "_3X50L3I7V" OLEObject = "C:\WINDOWS\system32\FOXTLIB.OCX" checksum = "4101493921" /> - - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count ; - , C_END_OBJECT_I, C_END_OBJECT_F ) - - toObjeto._ClassLib = .get_ValueByName_FromListNamesWithValues( 'ClassLib', 'C', @laPropsAndValues ) - toObjeto._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues ) - - IF NOT toClase.l_ObjectMetadataInHeader - toObjeto._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) - toObjeto._TimeStamp = INT( .rowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) - toObjeto._ZOrder = .get_ValueByName_FromListNamesWithValues( 'ZOrder', 'I', @laPropsAndValues ) - ENDIF - - toObjeto._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues ) - toObjeto._Ole = STRCONV( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) - - IF NOT EMPTY( toObjeto._Ole2 ) && Le agrego "OLEObject = " delante - toObjeto._Ole2 = 'OLEObject = ' + toObjeto._Ole2 + CR_LF - ENDIF - - *-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. - IF EMPTY(toObjeto._Ole) && Si _Ole está vacío es porque el propio control no tiene la info y está en la cabecera (antiguo guardado) - IF toModulo.existeObjetoOLE( toObjeto._Nombre, @m.Z ) - toObjeto._Ole = toModulo._Ole_Objs(m.Z)._Value - ENDIF - ENDIF - - EXIT - ENDIF - - IF RIGHT(tcLine, 3) == ', ;' && VALOR INTERMEDIO CON ", ;" - .get_SeparatedPropAndValue( LEFT(tcLine, LEN(tcLine) - 3), @lcProp, @lcValue, toClase, @taCodeLines, @tnCodeLines, @m.I ) - - * - * Skip ZOrderSet if configured to - * - IF toFoxBin2Prg.l_RemoveZOrderSetFromProps AND ATC( '.ZOrderSet.', '.' + lcProp + '.' ) > 0 THEN - LOOP - ENDIF - toObjeto.add_Property( @lcProp, @lcValue ) - ELSE && VALOR FINAL SIN ", ;" (JUSTO ANTES DEL ) - .get_SeparatedPropAndValue( tcLine, @lcProp, @lcValue, toClase, @taCodeLines, @tnCodeLines, @m.I ) - - * - * Skip ZOrderSet if configured to - * - IF toFoxBin2Prg.l_RemoveZOrderSetFromProps AND ATC( '.ZOrderSet.', '.' + lcProp + '.' ) > 0 THEN - LOOP - ENDIF - toObjeto.add_Property( @lcProp, @lcValue ) - ENDIF - - ENDFOR - ENDWITH && THIS - ENDIF - - CATCH TO loEx - loEx.UserValue = loEx.UserValue + TEXTMERGE('Source line=<>') + CR_LF - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - RELEASE toModulo, toClase, tcLine, I, taCodeLines, tnCodeLines ; - , laPropsAndValues, lnPropsAndValues_Count, Z, lcProp, lcValue, lcNombre, lcObjName - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_DEFINED_PAM - *-------------------------------------------------------------------------------------------------------------- - * 07/01/2014 FDBOZZO Los *métodos deben ir siempre al final, si no los eventos ACCESS no se ejecutan! - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toClase (!@ IN ) Objeto de la Clase - * tcLine (!@ IN ) Línea de datos en evaluación - * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * I (!@ IN ) Número de línea en evaluación - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I - - *-- ESTRUCTURA A ANALIZAR (también se admite sin los símbolos ^ y *): - * - *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! - *m: *mimetodo && Mi metodo - *p: prop1 && Mi prop 1 - *p: prop_especial_cr && - *a: ^array_1_d[1,0] && Array 1 dimensión (1) - *a: ^array_2_d[1,2] && Array una dimension (1,2) - *p: _memberdata && XML Metadata for customizable properties - * - - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods, lcPAM_Type - - IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I - llBloqueEncontrado = .T. - STORE '' TO lcDefinedPAM, lcItem, lcMethods - - WITH THIS AS c_conversor_prg_a_bin OF foxbin2prg.prg - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) - - DO CASE - CASE LEFT( tcLine, C_LEN_DEFINED_PAM_F ) == C_DEFINED_PAM_F - I = m.I + 1 - EXIT - - OTHERWISE - lnPos = AT( ':', tcLine, 1 ) - lnPos2 = AT( '&'+'&', tcLine ) - lcPAM_Type = LEFT(tcLine,3) && *p:, *a:, *m: - - IF lnPos2 > 0 - *-- Con comentarios - lcPAM_Name = LOWER( ALLTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) ) - lcItem = lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) + CR_LF - - ELSE - *-- Sin comentarios - lcPAM_Name = LOWER( ALLTRIM( SUBSTR( tcLine, lnPos+1 ), 0, ' ', CHR(9) ) ) - lcItem = lcPAM_Name + IIF( lcPAM_Type == '*p:' , '', ' ') + CR_LF - - ENDIF - - *-- Separo propiedades y métodos - IF lcPAM_Type == '*m:' - IF LEFT(lcItem,1) == '*' - lcMethods = lcMethods + lcItem - ELSE - lcMethods = lcMethods + '*' + lcItem - ENDIF - ELSE - IF lcPAM_Type == '*a:' AND LEFT(lcItem,1) <> '^' - lcDefinedPAM = lcDefinedPAM + '^' + lcItem - ELSE - lcDefinedPAM = lcDefinedPAM + lcItem - ENDIF - ENDIF - ENDCASE - ENDFOR - ENDWITH && THIS - - *-- Junto propiedades y los métodos al final. - toClase._Defined_PAM = lcDefinedPAM + lcMethods - I = m.I - 1 - ENDIF - - CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - RELEASE toClase, tcLine, taCodeLines, tnCodeLines, I ; - , lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods, lcPAM_Type - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - - - - PROCEDURE analyzeCodeBlock_DEFINE_CLASS - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (!@ IN ) Objeto del Modulo - * toClase (!@ IN ) Objeto de la Clase - * tcLine (!@ IN ) Línea de datos en evaluación - * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar - * I (!@ IN ) Número de línea en evaluación - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * tcProcedureAbierto (!v IN ) Nombre del Procedure abierto - * taLineasExclusion (!@ IN ) Array de líneas de exclusión - * tnBloquesExclusion (!@ IN ) Cantidad de líneas de exclusión - * tc_Comentario (!v IN ) Comentario - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + Procedure analyzeCodeBlock_DEFINE_CLASS +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (!@ IN ) Objeto del Modulo +* toClase (!@ IN ) Objeto de la Clase +* tcLine (!@ IN ) Línea de datos en evaluación +* taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar +* I (!@ IN ) Número de línea en evaluación +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* tcProcedureAbierto (!v IN ) Nombre del Procedure abierto +* taLineasExclusion (!@ IN ) Array de líneas de exclusión +* tnBloquesExclusion (!@ IN ) Cantidad de líneas de exclusión +* tc_Comentario (!v IN ) Comentario +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- + Lparameters toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; , taLineasExclusion, tnBloquesExclusion, tc_Comentario, toFoxBin2Prg - EXTERNAL ARRAY taCodeLines, tnBloquesExclusion, taLineasExclusion + External Array taCodeLines, tnBloquesExclusion, taLineasExclusion - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine + ' ', 13)) == C_DEFINE_CLASS + ' ' - TRY - llBloqueEncontrado = .T. - LOCAL Z, lcProp, lcValue, loEx AS EXCEPTION ; - , llCLASSMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; - , llINCLUDE_Completed, llCLASS_PROPERTY_Completed, llOBJECTMETADATA_Completed ; - , llCLASSCOMMENTS_Completed ; - , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + If Upper(Left(tcLine + ' ', 13)) == C_DEFINE_CLASS + ' ' + Try + llBloqueEncontrado = .T. + Local Z, lcProp, lcValue, loEx As Exception ; + , llCLASSMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; + , llINCLUDE_Completed, llCLASS_PROPERTY_Completed, llOBJECTMETADATA_Completed ; + , llCLASSCOMMENTS_Completed ; + , loObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - STORE '' TO tcProcedureAbierto - toClase = CREATEOBJECT('CL_CLASE') - toClase._Nombre = LOWER( ALLTRIM( STREXTRACT( tcLine, 'DEFINE CLASS ', ' AS ', 1, 1 ) ) ) - toClase._ObjName = LOWER( toClase._Nombre ) - toClase._Definicion = ALLTRIM( tcLine ) - IF NOT ' OF ' $ UPPER(tcLine) && Puede no tener "OF libreria.vcx" - toClase._Class = ALLTRIM( CHRTRAN( STREXTRACT( tcLine + ' OLEPUBLIC', ' AS ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) - ELSE - toClase._Class = ALLTRIM( CHRTRAN( STREXTRACT( tcLine + ' OF ', ' AS ', ' OF ', 1, 1 ), ["'], [] ) ) - ENDIF - toClase._ClassLoc = LOWER( ALLTRIM( CHRTRAN( STREXTRACT( tcLine + ' OLEPUBLIC', ' OF ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) ) - toClase._OlePublic = ' OLEPUBLIC' $ UPPER(tcLine) - toClase._Comentario = tc_Comentario - toClase._Inicio = m.I - toClase._Ini_Cab = m.I + 1 + loLang = _Screen.o_FoxBin2Prg_Lang + Store '' To tcProcedureAbierto + toClase = Createobject('CL_CLASE') + toClase._Nombre = Lower( Alltrim( Strextract( tcLine, 'DEFINE CLASS ', ' AS ', 1, 1 ) ) ) + toClase._ObjName = Lower( toClase._Nombre ) + toClase._Definicion = Alltrim( tcLine ) + If Not ' OF ' $ Upper(tcLine) && Puede no tener "OF libreria.vcx" + toClase._Class = Alltrim( Chrtran( Strextract( tcLine + ' OLEPUBLIC', ' AS ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) + Else + toClase._Class = Alltrim( Chrtran( Strextract( tcLine + ' OF ', ' AS ', ' OF ', 1, 1 ), ["'], [] ) ) + Endif + toClase._ClassLoc = Lower( Alltrim( Chrtran( Strextract( tcLine + ' OLEPUBLIC', ' OF ', ' OLEPUBLIC', 1, 1 ), ["'], [] ) ) ) + toClase._OlePublic = ' OLEPUBLIC' $ Upper(tcLine) + toClase._Comentario = tc_Comentario + toClase._Inicio = m.I + toClase._Ini_Cab = m.I + 1 - toModulo.add_Class( toClase ) + toModulo.add_Class( toClase ) - *-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. - IF toModulo.existeObjetoOLE( toClase._Nombre, @m.Z ) - toClase._Ole = toModulo._Ole_Objs(m.Z)._Value - ENDIF +*-- Ubico el objeto ole por su nombre (parent+objname), que no se repite. + If toModulo.existeObjetoOLE( toClase._Nombre, @m.Z ) + toClase._Ole = toModulo._Ole_Objs(m.Z)._Value + Endif - * Búsqueda del ID de fin de bloque (ENDDEFINE) - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - FOR I = toClase._Ini_Cab TO tnCodeLines - tc_Comentario = '' - .set_Line( @tcLine, @taCodeLines, m.I ) +* Búsqueda del ID de fin de bloque (ENDDEFINE) + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + For I = toClase._Ini_Cab To tnCodeLines + tc_Comentario = '' + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) - LOOP + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) + Loop - CASE .analyzeCodeBlock_PROCEDURE( @toModulo, @toClase, @loObjeto, @tcLine, @taCodeLines, @m.I, @tnCodeLines ; - , @tcProcedureAbierto, @tc_Comentario, @taLineasExclusion, @tnBloquesExclusion ) - *-- OJO: Esta se analiza primero a propósito, solo porque no puede estar detrás de PROTECTED y HIDDEN - STORE .T. TO llCLASSCOMMENTS_Completed ; - , llCLASS_PROPERTY_Completed ; - , llPROTECTED_Completed ; - , llHIDDEN_Completed ; - , llINCLUDE_Completed ; - , llCLASSMETADATA_Completed ; - , llOBJECTMETADATA_Completed ; - , llDEFINED_PAM_Completed + Case .analyzeCodeBlock_PROCEDURE( @toModulo, @toClase, @loObjeto, @tcLine, @taCodeLines, @m.I, @tnCodeLines ; + , @tcProcedureAbierto, @tc_Comentario, @taLineasExclusion, @tnBloquesExclusion ) +*-- OJO: Esta se analiza primero a propósito, solo porque no puede estar detrás de PROTECTED y HIDDEN + Store .T. To llCLASSCOMMENTS_Completed ; + , llCLASS_PROPERTY_Completed ; + , llPROTECTED_Completed ; + , llHIDDEN_Completed ; + , llINCLUDE_Completed ; + , llCLASSMETADATA_Completed ; + , llOBJECTMETADATA_Completed ; + , llDEFINED_PAM_Completed - CASE NOT llPROTECTED_Completed AND .analyzeCodeBlock_PROTECTED( @toClase, @tcLine ) - llPROTECTED_Completed = .T. + Case Not llPROTECTED_Completed And .analyzeCodeBlock_PROTECTED( @toClase, @tcLine ) + llPROTECTED_Completed = .T. - CASE NOT llHIDDEN_Completed AND .analyzeCodeBlock_HIDDEN( @toClase, @tcLine ) - llHIDDEN_Completed = .T. + Case Not llHIDDEN_Completed And .analyzeCodeBlock_HIDDEN( @toClase, @tcLine ) + llHIDDEN_Completed = .T. - CASE NOT llINCLUDE_Completed AND .c_Type <> "SCX" AND .analyzeCodeBlock_INCLUDE( @toModulo, @toClase, @tcLine, @taCodeLines ; - , @m.I, @tnCodeLines, @tcProcedureAbierto ) - llINCLUDE_Completed = .T. + Case Not llINCLUDE_Completed And .c_Type <> "SCX" And .analyzeCodeBlock_INCLUDE( @toModulo, @toClase, @tcLine, @taCodeLines ; + , @m.I, @tnCodeLines, @tcProcedureAbierto ) + llINCLUDE_Completed = .T. - CASE NOT llCLASSCOMMENTS_Completed AND .analyzeCodeBlock_CLASSCOMMENTS( @toClase, @tcLine ,@taCodeLines, tnCodeLines, @m.I ) - llCLASSCOMMENTS_Completed = .T. + Case Not llCLASSCOMMENTS_Completed And .analyzeCodeBlock_CLASSCOMMENTS( @toClase, @tcLine ,@taCodeLines, tnCodeLines, @m.I ) + llCLASSCOMMENTS_Completed = .T. - CASE NOT llCLASSMETADATA_Completed AND .analyzeCodeBlock_CLASSMETADATA( @toClase, @tcLine ) - llCLASSMETADATA_Completed = .T. + Case Not llCLASSMETADATA_Completed And .analyzeCodeBlock_CLASSMETADATA( @toClase, @tcLine ) + llCLASSMETADATA_Completed = .T. - CASE NOT llOBJECTMETADATA_Completed AND .analyzeCodeBlock_OBJECTMETADATA( @toClase, @tcLine ) - * No se usa flag porque puede haber múltiples ObjectMetadata. + Case Not llOBJECTMETADATA_Completed And .analyzeCodeBlock_OBJECTMETADATA( @toClase, @tcLine ) +* No se usa flag porque puede haber múltiples ObjectMetadata. - CASE NOT llDEFINED_PAM_Completed AND .analyzeCodeBlock_DEFINED_PAM( @toClase, @tcLine, @taCodeLines, tnCodeLines, @m.I ) - llDEFINED_PAM_Completed = .T. + Case Not llDEFINED_PAM_Completed And .analyzeCodeBlock_DEFINED_PAM( @toClase, @tcLine, @taCodeLines, tnCodeLines, @m.I ) + llDEFINED_PAM_Completed = .T. - CASE .analyzeCodeBlock_ADD_OBJECT( @toModulo, @toClase, @tcLine, @m.I, @taCodeLines, @tnCodeLines, @toFoxBin2Prg ) - STORE .T. TO llCLASSCOMMENTS_Completed ; - , llCLASS_PROPERTY_Completed ; - , llPROTECTED_Completed ; - , llHIDDEN_Completed ; - , llINCLUDE_Completed ; - , llCLASSMETADATA_Completed ; - , llOBJECTMETADATA_Completed ; - , llDEFINED_PAM_Completed + Case .analyzeCodeBlock_ADD_OBJECT( @toModulo, @toClase, @tcLine, @m.I, @taCodeLines, @tnCodeLines, @toFoxBin2Prg ) + Store .T. To llCLASSCOMMENTS_Completed ; + , llCLASS_PROPERTY_Completed ; + , llPROTECTED_Completed ; + , llHIDDEN_Completed ; + , llINCLUDE_Completed ; + , llCLASSMETADATA_Completed ; + , llOBJECTMETADATA_Completed ; + , llDEFINED_PAM_Completed - CASE .analyzeCodeBlock_ENDDEFINE( @toClase, @tcLine, @m.I, @tcProcedureAbierto ) - EXIT + Case .analyzeCodeBlock_ENDDEFINE( @toClase, @tcLine, @m.I, @tcProcedureAbierto ) + Exit - CASE NOT llCLASS_PROPERTY_Completed AND EMPTY( toClase._Fin_Cab ) - *-- Propiedades de la CLASE - *-- - *-- NOTA: Las propiedades se agregan tal cual, incluso aunque estén separadas en - *-- varias líneas (memberdata y fb2p_value), ya que luego se ensamblan en classProps2Memo(). - * - .get_SeparatedPropAndValue( tcLine, @lcProp, @lcValue, @toClase, @taCodeLines, tnCodeLines, @m.I ) - toClase.add_Property( @lcProp, @lcValue, RTRIM(tc_Comentario) ) + Case Not llCLASS_PROPERTY_Completed And Empty( toClase._Fin_Cab ) +*-- Propiedades de la CLASE +*-- +*-- NOTA: Las propiedades se agregan tal cual, incluso aunque estén separadas en +*-- varias líneas (memberdata y fb2p_value), ya que luego se ensamblan en classProps2Memo(). +* + .get_SeparatedPropAndValue( tcLine, @lcProp, @lcValue, @toClase, @taCodeLines, tnCodeLines, @m.I ) + toClase.add_Property( @lcProp, @lcValue, Rtrim(tc_Comentario) ) - OTHERWISE - *-- Las líneas que pasan por aquí deberían estar vacías y ser de relleno del embellecimiento + Otherwise +*-- Las líneas que pasan por aquí deberían estar vacías y ser de relleno del embellecimiento - ENDCASE + Endcase - ENDFOR + Endfor - *-- Validación - IF EMPTY( toClase._Fin ) - *ERROR 'No se ha encontrado el marcador de fin [ENDDEFINE] ' ; - + 'que cierra al marcador de inicio [DEFINE CLASS] ' ; - + 'de la línea ' + TRANSFORM( toClase._Inicio ) + ' ' ; - + 'para el identificador [' + toClase._Nombre + ']' - ERROR (TEXTMERGE(loLang.C_ENDDEFINE_MARKER_NOT_FOUND_LOC)) - ENDIF +*-- Validación + If Empty( toClase._Fin ) +*ERROR 'No se ha encontrado el marcador de fin [ENDDEFINE] ' ; ++ 'que cierra al marcador de inicio [DEFINE CLASS] ' ; ++ 'de la línea ' + TRANSFORM( toClase._Inicio ) + ' ' ; ++ 'para el identificador [' + toClase._Nombre + ']' + Error (Textmerge(loLang.C_ENDDEFINE_MARKER_NOT_FOUND_LOC)) + Endif - toClase._PROPERTIES = .classProps2Memo( @toClase, @toFoxBin2Prg ) - toClase._PROTECTED = .hiddenAndProtected_PAM( @toClase ) - toClase._METHODS = .classMethods2Memo( @toClase ) - toClase._RESERVED1 = IIF( .c_Type = 'SCX', '', 'Class' ) - toClase._RESERVED2 = IIF( .c_Type = 'VCX' OR PROPER(toClase._Class) == 'Dataenvironment', TRANSFORM( toClase._AddObject_Count + 1 ), '' ) - toClase._RESERVED3 = .defined_PAM2Memo( @toClase ) - toClase._RESERVED4 = toClase._ClassIcon - toClase._RESERVED5 = toClase._ProjectClassIcon - toClase._RESERVED6 = toClase._Scale - toClase._RESERVED7 = toClase._Comentario - toClase._RESERVED8 = toClase._includeFile - ENDWITH && THIS + toClase._PROPERTIES = .classProps2Memo( @toClase, @toFoxBin2Prg ) + toClase._PROTECTED = .hiddenAndProtected_PAM( @toClase ) + toClase._METHODS = .classMethods2Memo( @toClase ) + toClase._RESERVED1 = Iif( .c_Type = 'SCX', '', 'Class' ) + toClase._RESERVED2 = Iif( .c_Type = 'VCX' Or Proper(toClase._Class) == 'Dataenvironment', Transform( toClase._AddObject_Count + 1 ), '' ) + toClase._RESERVED3 = .defined_PAM2Memo( @toClase ) + toClase._RESERVED4 = toClase._ClassIcon + toClase._RESERVED5 = toClase._ProjectClassIcon + toClase._RESERVED6 = toClase._Scale + toClase._RESERVED7 = toClase._Comentario + toClase._RESERVED8 = toClase._includeFile + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; - , taLineasExclusion, tnBloquesExclusion, tc_Comentario, Z, lcProp, lcValue, loEx ; - , llCLASSMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; - , llINCLUDE_Completed, llCLASS_PROPERTY_Completed, llOBJECTMETADATA_Completed ; - , llCLASSCOMMENTS_Completed, loObjeto - ENDTRY - ENDIF + Finally + Release toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + , taLineasExclusion, tnBloquesExclusion, tc_Comentario, Z, lcProp, lcValue, loEx ; + , llCLASSMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; + , llINCLUDE_Completed, llCLASS_PROPERTY_Completed, llOBJECTMETADATA_Completed ; + , llCLASSCOMMENTS_Completed, loObjeto + Endtry + Endif - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_ENDDEFINE - LPARAMETERS toClase, tcLine, I, tcProcedureAbierto + Procedure analyzeCodeBlock_ENDDEFINE + Lparameters toClase, tcLine, I, tcProcedureAbierto - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER( LEFT( tcLine + ' ', 10 ) ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado + If Upper( Left( tcLine + ' ', 10 ) ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado llBloqueEncontrado = .T. toClase._Fin = m.I - IF EMPTY( toClase._Ini_Cuerpo ) + If Empty( toClase._Ini_Cuerpo ) toClase._Ini_Cuerpo = m.I-1 - ENDIF + Endif toClase._Fin_Cuerpo = m.I-1 - IF EMPTY( toClase._Fin_Cab ) + If Empty( toClase._Fin_Cab ) toClase._Fin_Cab = m.I-1 - ENDIF + Endif - STORE '' TO tcProcedureAbierto - ENDIF + Store '' To tcProcedureAbierto + Endif - RELEASE toClase, tcLine, I, tcProcedureAbierto - RETURN llBloqueEncontrado - ENDPROC + Release toClase, tcLine, I, tcProcedureAbierto + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_HIDDEN - LPARAMETERS toClase, tcLine + Procedure analyzeCodeBlock_HIDDEN + Lparameters toClase, tcLine - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine, 7)) == 'HIDDEN ' + If Upper(Left(tcLine, 7)) == 'HIDDEN ' llBloqueEncontrado = .T. - toClase._HiddenProps = LOWER( ALLTRIM( SUBSTR( tcLine, 8 ) ) ) - ENDIF + toClase._HiddenProps = Lower( Alltrim( Substr( tcLine, 8 ) ) ) + Endif - RELEASE toClase, tcLine - RETURN llBloqueEncontrado - ENDPROC + Release toClase, tcLine + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_INCLUDE - LPARAMETERS toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto - LOCAL llBloqueEncontrado + Procedure analyzeCodeBlock_INCLUDE + Lparameters toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + Local llBloqueEncontrado - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - IF UPPER(LEFT(tcLine, 9)) == '#INCLUDE ' + If Upper(Left(tcLine, 9)) == '#INCLUDE ' llBloqueEncontrado = .T. - IF THIS.c_Type = 'SCX' - toModulo._includeFile = LOWER( ALLTRIM( CHRTRAN( SUBSTR( tcLine, 10 ), ["'], [] ) ) ) - ELSE - toClase._includeFile = LOWER( ALLTRIM( CHRTRAN( SUBSTR( tcLine, 10 ), ["'], [] ) ) ) - ENDIF - ENDIF + If This.c_Type = 'SCX' + toModulo._includeFile = Lower( Alltrim( Chrtran( Substr( tcLine, 10 ), ["'], [] ) ) ) + Else + toClase._includeFile = Lower( Alltrim( Chrtran( Substr( tcLine, 10 ), ["'], [] ) ) ) + Endif + Endif - RELEASE toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto - RETURN llBloqueEncontrado - ENDPROC + Release toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_CLASSCOMMENTS - LPARAMETERS toClase, tcLine ,taCodeLines, tnCodeLines, I + Procedure analyzeCodeBlock_CLASSCOMMENTS + Lparameters toClase, tcLine ,taCodeLines, tnCodeLines, I - EXTERNAL ARRAY taCodeLines + External Array taCodeLines - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado + Try + Local llBloqueEncontrado - IF LEFT( tcLine, C_LEN_CLASSCOMMENTS_I ) == C_CLASSCOMMENTS_I - llBloqueEncontrado = .T. - toClase._Comentario = '' + If Left( tcLine, C_LEN_CLASSCOMMENTS_I ) == C_CLASSCOMMENTS_I + llBloqueEncontrado = .T. + toClase._Comentario = '' - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE LEFT( tcLine, C_LEN_CLASSCOMMENTS_F ) == C_CLASSCOMMENTS_F - I = m.I + 1 - EXIT + Do Case + Case Left( tcLine, C_LEN_CLASSCOMMENTS_F ) == C_CLASSCOMMENTS_F + I = m.I + 1 + Exit - OTHERWISE - toClase._Comentario = toClase._Comentario + CR_LF + SUBSTR( tcLine, 2 ) && Le quito el '*' inicial - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + toClase._Comentario = toClase._Comentario + CR_LF + Substr( tcLine, 2 ) && Le quito el '*' inicial + Endcase + Endfor + Endwith && THIS - I = m.I - 1 + I = m.I - 1 - IF NOT EMPTY(toClase._Comentario) - toClase._Comentario = SUBSTR( toClase._Comentario, 3 ) + CR_LF && Quito el primer CR+LF - ENDIF - ENDIF + If Not Empty(toClase._Comentario) + toClase._Comentario = Substr( toClase._Comentario, 3 ) + CR_LF && Quito el primer CR+LF + Endif + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE toClase, tcLine ,taCodeLines, tnCodeLines, I - ENDTRY + Finally + Release toClase, tcLine ,taCodeLines, tnCodeLines, I + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_CLASSMETADATA - LPARAMETERS toClase, tcLine + Procedure analyzeCodeBlock_CLASSMETADATA + Lparameters toClase, tcLine - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine, C_LEN_CLASSDATA_I)) == C_CLASSDATA_I && METADATA de la CLASE - *< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" /> - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count + If Upper(Left(tcLine, C_LEN_CLASSDATA_I)) == C_CLASSDATA_I && METADATA de la CLASE +*< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" /> + Local laPropsAndValues(1,2), lnPropsAndValues_Count llBloqueEncontrado = .T. - WITH THIS + With This .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_CLASSDATA_I, C_CLASSDATA_F ) toClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues ) - toClase._TimeStamp = INT( .rowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) + toClase._TimeStamp = Int( .rowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) toClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues ) toClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) toClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues ) toClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues ) toClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues ) - IF EMPTY(toClase._Ole) - toClase._Ole = STRCONV( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) - ENDIF - ENDWITH && THIS + If Empty(toClase._Ole) + toClase._Ole = Strconv( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) + Endif + Endwith && THIS - IF NOT EMPTY( toClase._Ole2 ) && Le agrego "OLEObject = " delante + If Not Empty( toClase._Ole2 ) && Le agrego "OLEObject = " delante toClase._Ole2 = 'OLEObject = ' + toClase._Ole2 + CR_LF - ENDIF - ENDIF + Endif + Endif - RELEASE toClase, tcLine, laPropsAndValues, lnPropsAndValues_Count - RETURN llBloqueEncontrado - ENDPROC + Release toClase, tcLine, laPropsAndValues, lnPropsAndValues_Count + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_EXTERNAL_CLASS - *------------------------------------------------------ - *-- Analiza el bloque *< EXTERNAL_CLASS: Name="nombre-clase" Baseclass="clase-base" /> - *------------------------------------------------------ - LPARAMETERS toModulo, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_EXTERNAL_CLASS +*------------------------------------------------------ +*-- Analiza el bloque *< EXTERNAL_CLASS: Name="nombre-clase" Baseclass="clase-base" /> +*------------------------------------------------------ + Lparameters toModulo, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine, C_LEN_EXTERNAL_CLASS_I)) == C_EXTERNAL_CLASS_I - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count + If Upper(Left(tcLine, C_LEN_EXTERNAL_CLASS_I)) == C_EXTERNAL_CLASS_I + Local laPropsAndValues(1,2), lnPropsAndValues_Count llBloqueEncontrado = .T. - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_EXTERNAL_CLASS_I, C_EXTERNAL_CLASS_F ) toModulo._ExternalClasses_Count = toModulo._ExternalClasses_Count + 1 - DIMENSION toModulo._ExternalClasses( toModulo._ExternalClasses_Count, 2 ) + Dimension toModulo._ExternalClasses( toModulo._ExternalClasses_Count, 2 ) toModulo._ExternalClasses( toModulo._ExternalClasses_Count, 1 ) = .get_ValueByName_FromListNamesWithValues( 'Name', 'C', @laPropsAndValues ) toModulo._ExternalClasses( toModulo._ExternalClasses_Count, 2 ) = .get_ValueByName_FromListNamesWithValues( 'Baseclass', 'C', @laPropsAndValues ) ; + '.' + toModulo._ExternalClasses( toModulo._ExternalClasses_Count, 1 ) - ENDWITH && THIS - ENDIF + Endwith && THIS + Endif - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_EXTERNAL_MEMBER - *------------------------------------------------------ - *-- Analiza el bloque *< EXTERNAL_MEMBER: Name="nombre-miembro" Type="tipo-de-miembro" /> - *------------------------------------------------------ - LPARAMETERS toDatabase, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_EXTERNAL_MEMBER +*------------------------------------------------------ +*-- Analiza el bloque *< EXTERNAL_MEMBER: Name="nombre-miembro" Type="tipo-de-miembro" /> +*------------------------------------------------------ + Lparameters toDatabase, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine, C_LEN_EXTERNAL_MEMBER_I)) == C_EXTERNAL_MEMBER_I - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count + If Upper(Left(tcLine, C_LEN_EXTERNAL_MEMBER_I)) == C_EXTERNAL_MEMBER_I + Local laPropsAndValues(1,2), lnPropsAndValues_Count llBloqueEncontrado = .T. - WITH THIS + With This .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_EXTERNAL_MEMBER_I, C_EXTERNAL_MEMBER_F ) toDatabase._ExternalClasses_Count = toDatabase._ExternalClasses_Count + 1 - DIMENSION toDatabase._ExternalClasses( toDatabase._ExternalClasses_Count, 2 ) + Dimension toDatabase._ExternalClasses( toDatabase._ExternalClasses_Count, 2 ) toDatabase._ExternalClasses( toDatabase._ExternalClasses_Count, 1 ) = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues ) ; + '.' + .get_ValueByName_FromListNamesWithValues( 'Name', 'C', @laPropsAndValues ) - *toDatabase._ExternalClasses( toDatabase._ExternalClasses_Count, 2 ) = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues ) - ENDWITH && THIS - ENDIF +*toDatabase._ExternalClasses( toDatabase._ExternalClasses_Count, 2 ) = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues ) + Endwith && THIS + Endif - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_OBJECTMETADATA - LPARAMETERS toClase, tcLine + Procedure analyzeCodeBlock_OBJECTMETADATA + Lparameters toClase, tcLine - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine, C_LEN_OBJECTDATA_I)) == C_OBJECTDATA_I && METADATA del ADD OBJECT - *< OBJECTDATA: ObjName="txtValor" Timestamp="2013/11/19 11:51:04" Uniqueid="_3WF0VSTN1" /> - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' + If Upper(Left(tcLine, C_LEN_OBJECTDATA_I)) == C_OBJECTDATA_I && METADATA del ADD OBJECT +*< OBJECTDATA: ObjName="txtValor" Timestamp="2013/11/19 11:51:04" Uniqueid="_3WF0VSTN1" /> + Local laPropsAndValues(1,2), lnPropsAndValues_Count, loObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' llBloqueEncontrado = .T. toClase.l_ObjectMetadataInHeader = .T. - loObjeto = NULL - loObjeto = CREATEOBJECT('CL_OBJETO') + loObjeto = Null + loObjeto = Createobject('CL_OBJETO') toClase.add_Object( loObjeto ) - WITH THIS + With This .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_OBJECTDATA_I, C_OBJECTDATA_F ) loObjeto._Nombre = .get_ValueByName_FromListNamesWithValues( 'ObjPath', 'C', @laPropsAndValues ) - loObjeto._TimeStamp = INT( .rowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) + loObjeto._TimeStamp = Int( .rowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) loObjeto._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) - ENDWITH && THIS + Endwith && THIS - loObjeto = NULL - RELEASE toClase, tcLine, laPropsAndValues, lnPropsAndValues_Count, loObjeto - ENDIF + loObjeto = Null + Release toClase, tcLine, laPropsAndValues, lnPropsAndValues_Count, loObjeto + Endif - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_OLE_DEF - LPARAMETERS toModulo, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto - LOCAL llBloqueEncontrado + Procedure analyzeCodeBlock_OLE_DEF + Lparameters toModulo, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + Local llBloqueEncontrado - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + #Endif - IF LEFT( tcLine + ' ', C_LEN_OLE_I + 1 ) == C_OLE_I + ' ' + If Left( tcLine + ' ', C_LEN_OLE_I + 1 ) == C_OLE_I + ' ' llBloqueEncontrado = .T. - *-- Se encontró una definición de objeto OLE - *< OLE: Nombre="frm_d.ole_ImageControl2" parent="frm_d" objname="ole_ImageControl2" checksum="4171274922" value="b64-value" /> - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count ; - , loOle AS CL_OLE OF 'FOXBIN2PRG.PRG' - loOle = NULL - loOle = CREATEOBJECT('CL_OLE') +*-- Se encontró una definición de objeto OLE +*< OLE: Nombre="frm_d.ole_ImageControl2" parent="frm_d" objname="ole_ImageControl2" checksum="4171274922" value="b64-value" /> + Local laPropsAndValues(1,2), lnPropsAndValues_Count ; + , loOle As CL_OLE Of 'FOXBIN2PRG.PRG' + loOle = Null + loOle = Createobject('CL_OLE') - WITH THIS + With This .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_OLE_I, C_OLE_F ) loOle._Nombre = .get_ValueByName_FromListNamesWithValues( 'Nombre', 'C', @laPropsAndValues ) loOle._Parent = .get_ValueByName_FromListNamesWithValues( 'Parent', 'C', @laPropsAndValues ) loOle._ObjName = .get_ValueByName_FromListNamesWithValues( 'ObjName', 'C', @laPropsAndValues ) loOle._CheckSum = .get_ValueByName_FromListNamesWithValues( 'CheckSum', 'C', @laPropsAndValues ) - loOle._Value = STRCONV( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) - ENDWITH + loOle._Value = Strconv( .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues ), 14 ) + Endwith toModulo.add_OLE( loOle ) - IF EMPTY( loOle._Value ) - *-- Si el objeto OLE no tiene VALUE, es porque hay otro con el mismo contenido y no se duplicó para preservar espacio. - *-- Busco el VALUE del duplicado que se guardó y lo asigno nuevamente - FOR Z = 1 TO toModulo._Ole_Obj_count - 1 - IF toModulo._Ole_Objs(m.Z)._CheckSum == loOle._CheckSum AND NOT EMPTY( toModulo._Ole_Objs(m.Z)._Value ) + If Empty( loOle._Value ) +*-- Si el objeto OLE no tiene VALUE, es porque hay otro con el mismo contenido y no se duplicó para preservar espacio. +*-- Busco el VALUE del duplicado que se guardó y lo asigno nuevamente + For Z = 1 To toModulo._Ole_Obj_count - 1 + If toModulo._Ole_Objs(m.Z)._CheckSum == loOle._CheckSum And Not Empty( toModulo._Ole_Objs(m.Z)._Value ) loOle._Value = toModulo._Ole_Objs(m.Z)._Value - EXIT - ENDIF - ENDFOR - ENDIF + Exit + Endif + Endfor + Endif - loOle = NULL - RELEASE loOle, laPropsAndValues, lnPropsAndValues_Count - ENDIF + loOle = Null + Release loOle, laPropsAndValues, lnPropsAndValues_Count + Endif - RELEASE toModulo, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto - RETURN llBloqueEncontrado - ENDPROC + Release toModulo, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_PROCEDURE - LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + Procedure analyzeCodeBlock_PROCEDURE + Lparameters toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; , tc_Comentario, taLineasExclusion, tnBloquesExclusion - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - DO CASE - CASE UPPER( LEFT( tcLine, 20 ) ) == 'PROTECTED PROCEDURE ' - *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 21 ) ) - .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) - .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto ) + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + Do Case + Case Upper( Left( tcLine, 20 ) ) == 'PROTECTED PROCEDURE ' +*-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = Alltrim( Substr( tcLine, 21 ) ) + .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) + .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto ) - CASE UPPER( LEFT( tcLine, 17 ) ) == 'HIDDEN PROCEDURE ' - *-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 18 ) ) - .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) - .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto ) + Case Upper( Left( tcLine, 17 ) ) == 'HIDDEN PROCEDURE ' +*-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = Alltrim( Substr( tcLine, 18 ) ) + .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) + .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto ) - CASE UPPER( LEFT( tcLine, 10 ) ) == 'PROCEDURE ' - *-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 11 ) ) - .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) - .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto ) + Case Upper( Left( tcLine, 10 ) ) == 'PROCEDURE ' +*-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = Alltrim( Substr( tcLine, 11 ) ) + .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) + .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto ) - CASE UPPER( LEFT( tcLine, 19 ) ) == 'PROTECTED FUNCTION ' - *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 20 ) ) - .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) - .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto ) + Case Upper( Left( tcLine, 19 ) ) == 'PROTECTED FUNCTION ' +*-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = Alltrim( Substr( tcLine, 20 ) ) + .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) + .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto ) - CASE UPPER( LEFT( tcLine, 16 ) ) == 'HIDDEN FUNCTION ' - *-- Estructura a reconocer: HIDDEN FUNCTION nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 17 ) ) - .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) - .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto ) + Case Upper( Left( tcLine, 16 ) ) == 'HIDDEN FUNCTION ' +*-- Estructura a reconocer: HIDDEN FUNCTION nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = Alltrim( Substr( tcLine, 17 ) ) + .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) + .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto ) - CASE UPPER( LEFT( tcLine, 9 ) ) == 'FUNCTION ' - *-- Estructura a reconocer: FUNCTION [objeto.]nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 10 ) ) - .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) - .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto ) + Case Upper( Left( tcLine, 9 ) ) == 'FUNCTION ' +*-- Estructura a reconocer: FUNCTION [objeto.]nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = Alltrim( Substr( tcLine, 10 ) ) + .getClassMethodComment( @tcProcedureAbierto, @tc_Comentario ) + .evaluateProcedureDefinition( @toClase, m.I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto ) - ENDCASE + Endcase - IF llBloqueEncontrado - *-- Evalúo todo el contenido del PROCEDURE + If llBloqueEncontrado +*-- Evalúo todo el contenido del PROCEDURE .updateProgressbar( 'Analyzing Procedure ' + toClase._Nombre + '.' + tcProcedureAbierto + '...', m.I, tnCodeLines, 1 ) .analyzeProcedureLines( @toClase, @toObjeto, @tcLine, @taCodeLines, @m.I, @tnCodeLines, @tcProcedureAbierto ; , @tc_Comentario, @taLineasExclusion, @tnBloquesExclusion ) - ENDIF - ENDWITH + Endif + Endwith - RELEASE toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + Release toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; , tc_Comentario, taLineasExclusion, tnBloquesExclusion - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_PROTECTED - LPARAMETERS toClase, tcLine + Procedure analyzeCodeBlock_PROTECTED + Lparameters toClase, tcLine - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL llBloqueEncontrado + Local llBloqueEncontrado - IF UPPER(LEFT(tcLine, 10)) == 'PROTECTED ' + If Upper(Left(tcLine, 10)) == 'PROTECTED ' llBloqueEncontrado = .T. - toClase._ProtectedProps = LOWER( ALLTRIM( SUBSTR( tcLine, 11 ) ) ) - ENDIF + toClase._ProtectedProps = Lower( Alltrim( Substr( tcLine, 11 ) ) ) + Endif - RELEASE toClase, tcLine - RETURN llBloqueEncontrado - ENDPROC + Release toClase, tcLine + Return llBloqueEncontrado + Endproc - PROCEDURE evaluateProcedureDefinition - LPARAMETERS toClase, I, tc_Comentario, tcProcName, tcProcType, toObjeto - *-------------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; - , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - #ENDIF + Procedure evaluateProcedureDefinition + Lparameters toClase, I, tc_Comentario, tcProcName, tcProcType, toObjeto +*-------------------------------------------------------------------------------------------------------------- + #If .F. + Local toClase As CL_CLASE Of 'FOXBIN2PRG.PRG' ; + , toObjeto As CL_OBJETO Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lcNombreObjeto, lnObjProc ; - , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' + Try + Local lcNombreObjeto, lnObjProc ; + , loProcedure As CL_PROCEDURE Of 'FOXBIN2PRG.PRG' - IF EMPTY(toClase._Fin_Cab) - toClase._Fin_Cab = m.I-1 - toClase._Ini_Cuerpo = m.I - ENDIF + If Empty(toClase._Fin_Cab) + toClase._Fin_Cab = m.I-1 + toClase._Ini_Cuerpo = m.I + Endif - loProcedure = NULL - loProcedure = CREATEOBJECT("CL_PROCEDURE") - loProcedure._Nombre = tcProcName - loProcedure._ProcType = tcProcType - loProcedure._Comentario = tc_Comentario - loProcedure._Inicio = m.I + loProcedure = Null + loProcedure = Createobject("CL_PROCEDURE") + loProcedure._Nombre = tcProcName + loProcedure._ProcType = tcProcType + loProcedure._Comentario = tc_Comentario + loProcedure._Inicio = m.I - *-- Anoto en HiddenMethods y ProtectedMethods según corresponda - DO CASE - CASE loProcedure._ProcType == 'hidden' - toClase._HiddenMethods = toClase._HiddenMethods + ',' + tcProcName +*-- Anoto en HiddenMethods y ProtectedMethods según corresponda + Do Case + Case loProcedure._ProcType == 'hidden' + toClase._HiddenMethods = toClase._HiddenMethods + ',' + tcProcName - CASE loProcedure._ProcType == 'protected' - toClase._ProtectedMethods = toClase._ProtectedMethods + ',' + tcProcName + Case loProcedure._ProcType == 'protected' + toClase._ProtectedMethods = toClase._ProtectedMethods + ',' + tcProcName - ENDCASE + Endcase - *-- Agrego el objeto Procedimiento a la clase, o a un objeto de la clase. - IF '.' $ tcProcName - *-- Procedimiento de objeto - lcNombreObjeto = LOWER( JUSTSTEM( tcProcName ) ) +*-- Agrego el objeto Procedimiento a la clase, o a un objeto de la clase. + If '.' $ tcProcName +*-- Procedimiento de objeto + lcNombreObjeto = Lower( Juststem( tcProcName ) ) - *-- Busco el objeto al que corresponde el método - lnObjProc = THIS.findMethodsObjectByName( lcNombreObjeto, toClase ) +*-- Busco el objeto al que corresponde el método + lnObjProc = This.findMethodsObjectByName( lcNombreObjeto, toClase ) - IF lnObjProc = 0 - *-- Procedimiento de clase + If lnObjProc = 0 +*-- Procedimiento de clase + toClase.add_Procedure( loProcedure ) + toObjeto = Null + Else +*-- Procedimiento de objeto + toObjeto = toClase._AddObjects( lnObjProc ) + toObjeto.add_Procedure( loProcedure ) + +*-- Paso el log de errores + If Not Empty(toObjeto.c_TextErr) Then + toClase.writeErrorLog(toObjeto.c_TextErr) + toObjeto.c_TextErr = '' + Endif + Endif + Else +*-- Procedimiento de clase toClase.add_Procedure( loProcedure ) - toObjeto = NULL - ELSE - *-- Procedimiento de objeto - toObjeto = toClase._AddObjects( lnObjProc ) - toObjeto.add_Procedure( loProcedure ) + Endif - *-- Paso el log de errores - IF NOT EMPTY(toObjeto.c_TextErr) THEN - toClase.writeErrorLog(toObjeto.c_TextErr) - toObjeto.c_TextErr = '' - ENDIF - ENDIF - ELSE - *-- Procedimiento de clase - toClase.add_Procedure( loProcedure ) - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Throw - THROW + Finally + Store Null To loProcedure + Release loProcedure, I, lcNombreObjeto, lnObjProc ; + , toClase, tc_Comentario, tcProcName, tcProcType, toObjeto + Endtry - FINALLY - STORE NULL TO loProcedure - RELEASE loProcedure, I, lcNombreObjeto, lnObjProc ; - , toClase, tc_Comentario, tcProcName, tcProcType, toObjeto - ENDTRY - - RETURN - ENDPROC + Return + Endproc - PROCEDURE identifyCodeBlocks - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (@! IN ) El array con las líneas del código donde buscar - * tnCodeLines (@! IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión - * toModulo (@? OUT) Objeto con toda la información del módulo analizado - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - * - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo, toFoxBin2Prg + Procedure identifyCodeBlocks +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (@! IN ) El array con las líneas del código donde buscar +* tnCodeLines (@! IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión +* toModulo (@? OUT) Objeto con toda la información del módulo analizado +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +* +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo, toFoxBin2Prg - EXTERNAL ARRAY taCodeLines, taLineasExclusion + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, loEx AS EXCEPTION ; - , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed, llEXTERNAL_CLASS_Completed ; - , lc_Comentario, lcProcedureAbierto, lcLine ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + Try + Local I, loEx As Exception ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed, llEXTERNAL_CLASS_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine ; + , loClase As CL_CLASE Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - STORE '' TO lcProcedureAbierto + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + Store '' To lcProcedureAbierto - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 + If tnCodeLines > 1 - *-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) - FOR I = 1 TO tnCodeLines - STORE '' TO lc_Comentario - .set_Line( @lcLine, @taCodeLines, m.I ) +*-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) + For I = 1 To tnCodeLines + Store '' To lc_Comentario + .set_Line( @lcLine, @taCodeLines, m.I ) - DO CASE - CASE .excludedLine( m.I, tnBloquesExclusion, @taLineasExclusion ) ; - OR .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios + Do Case + Case .excludedLine( m.I, tnBloquesExclusion, @taLineasExclusion ) ; + OR .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - CASE .analyzeCodeBlock_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @m.I, tnCodeLines ; - , @lcProcedureAbierto, @taLineasExclusion, @tnBloquesExclusion, @lc_Comentario, @toFoxBin2Prg ) - *-- Puede haber varias clases definidas - * llEXTERNAL_CLASS_Completed = .T. + Case .analyzeCodeBlock_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @m.I, tnCodeLines ; + , @lcProcedureAbierto, @taLineasExclusion, @tnBloquesExclusion, @lc_Comentario, @toFoxBin2Prg ) +*-- Puede haber varias clases definidas +* llEXTERNAL_CLASS_Completed = .T. - *-- Logueo los errores - IF NOT EMPTY(loClase.c_TextErr) THEN - .writeErrorLog( loClase.c_TextErr ) - ENDIF - ENDCASE +*-- Logueo los errores + If Not Empty(loClase.c_TextErr) Then + .writeErrorLog( loClase.c_TextErr ) + Endif + Endcase - ENDFOR + Endfor - .verify_EXTERNAL_CLASSES( @toModulo, @toFoxBin2Prg ) + .verify_EXTERNAL_CLASSES( @toModulo, @toFoxBin2Prg ) - ENDIF - ENDWITH && THIS + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - STORE NULL TO loClase - RELEASE loClase, I ; - , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed ; - , lc_Comentario, lcProcedureAbierto, lcLine - ENDTRY + Finally + Store Null To loClase + Release loClase, I ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE identifyHeaderBlocks - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (@! IN ) El array con las líneas del código donde buscar - * tnCodeLines (@! IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión - * toModulo (@? OUT) Objeto con toda la información del módulo analizado - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - * - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo, toFoxBin2Prg + Procedure identifyHeaderBlocks +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (@! IN ) El array con las líneas del código donde buscar +* tnCodeLines (@! IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión +* toModulo (@? OUT) Objeto con toda la información del módulo analizado +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +* +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo, toFoxBin2Prg - EXTERNAL ARRAY taCodeLines, taLineasExclusion + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, loEx AS EXCEPTION ; - , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed, llEXTERNAL_CLASS_Completed ; - , lc_Comentario, lcProcedureAbierto, lcLine ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + Try + Local I, loEx As Exception ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed, llEXTERNAL_CLASS_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine ; + , loClase As CL_CLASE Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - STORE '' TO lcProcedureAbierto + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + Store '' To lcProcedureAbierto - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 + If tnCodeLines > 1 - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain - ELSE - llEXTERNAL_CLASS_Completed = .T. - ENDIF - - *-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) - FOR I = 1 TO tnCodeLines - STORE '' TO lc_Comentario - .set_Line( @lcLine, @taCodeLines, m.I ) - - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( @toModulo, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. - - CASE NOT llEXTERNAL_CLASS_Completed AND .analyzeCodeBlock_EXTERNAL_CLASS( @toModulo, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - *-- Puede haber varias clases externas - - CASE NOT llLIBCOMMENT_Completed AND .analyzeCodeBlock_LIBCOMMENT( @toModulo, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llLIBCOMMENT_Completed = .T. + If toFoxBin2Prg.n_UseClassPerFile > 0 And toFoxBin2Prg.l_RedirectClassPerFileToMain + Else llEXTERNAL_CLASS_Completed = .T. + Endif - CASE NOT llOLE_DEF_Completed AND .analyzeCodeBlock_OLE_DEF( @toModulo, @lcLine, @taCodeLines ; - , @m.I, tnCodeLines, @lcProcedureAbierto ) - *-- Puede haber varios objetos OLE +*-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) + For I = 1 To tnCodeLines + Store '' To lc_Comentario + .set_Line( @lcLine, @taCodeLines, m.I ) - CASE NOT llINCLUDE_SCX_Completed AND .c_Type = 'SCX' AND .analyzeCodeBlock_INCLUDE( @toModulo, @loClase, @lcLine ; - , @taCodeLines, @m.I, tnCodeLines, @lcProcedureAbierto ) - * Específico para SCX que lo tiene al inicio - llINCLUDE_SCX_Completed = .T. - llEXTERNAL_CLASS_Completed = .T. + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - ENDCASE + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( @toModulo, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. - ENDFOR + Case Not llEXTERNAL_CLASS_Completed And .analyzeCodeBlock_EXTERNAL_CLASS( @toModulo, @lcLine, @taCodeLines, @m.I, tnCodeLines ) +*-- Puede haber varias clases externas - ENDIF - ENDWITH && THIS + Case Not llLIBCOMMENT_Completed And .analyzeCodeBlock_LIBCOMMENT( @toModulo, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llLIBCOMMENT_Completed = .T. + llEXTERNAL_CLASS_Completed = .T. - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Case Not llOLE_DEF_Completed And .analyzeCodeBlock_OLE_DEF( @toModulo, @lcLine, @taCodeLines ; + , @m.I, tnCodeLines, @lcProcedureAbierto ) +*-- Puede haber varios objetos OLE - THROW + Case Not llINCLUDE_SCX_Completed And .c_Type = 'SCX' And .analyzeCodeBlock_INCLUDE( @toModulo, @loClase, @lcLine ; + , @taCodeLines, @m.I, tnCodeLines, @lcProcedureAbierto ) +* Específico para SCX que lo tiene al inicio + llINCLUDE_SCX_Completed = .T. + llEXTERNAL_CLASS_Completed = .T. - FINALLY - STORE NULL TO loClase - RELEASE taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo, loClase, I ; - , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed ; - , lc_Comentario, lcProcedureAbierto, lcLine - ENDTRY + Endcase - RETURN - ENDPROC + Endfor + + Endif + Endwith && THIS + + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Store Null To loClase + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo, loClase, I ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine + Endtry + + Return + Endproc - PROCEDURE verify_EXTERNAL_CLASSES - *-------------------------------------------------------------------------------- - *-- Compara las clases definidas en la cabecera con las clases encontradas luego - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (@? OUT) Objeto con toda la información del módulo analizado - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toFoxBin2Prg + Procedure verify_EXTERNAL_CLASSES +*-------------------------------------------------------------------------------- +*-- Compara las clases definidas en la cabecera con las clases encontradas luego +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (@? OUT) Objeto con toda la información del módulo analizado +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- + Lparameters toModulo, toFoxBin2Prg - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lnItem, I, X, lcClaseExterna - LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang + Local lnItem, I, X, lcClaseExterna + Local loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang - *-- Verificación de las Clases, si son Externas y se indicó chequearlas - DO CASE - CASE toFoxBin2Prg.n_UseClassPerFile = 1 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) - *-- El ClassPerFile original, con nomenclatura 'Libreria.NombreClase.vc2' - FOR I = 1 TO toModulo._ExternalClasses_Count - lnItem = 0 +*-- Verificación de las Clases, si son Externas y se indicó chequearlas + Do Case + Case toFoxBin2Prg.n_UseClassPerFile = 1 And toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) +*-- El ClassPerFile original, con nomenclatura 'Libreria.NombreClase.vc2' + For I = 1 To toModulo._ExternalClasses_Count + lnItem = 0 - FOR X = 1 TO toModulo._Clases_Count - IF LOWER( toModulo._Clases(m.X)._ObjName ) == LOWER( toModulo._ExternalClasses(m.I,1) ) - lnItem = m.X - EXIT - ENDIF - ENDFOR + For X = 1 To toModulo._Clases_Count + If Lower( toModulo._Clases(m.X)._ObjName ) == Lower( toModulo._ExternalClasses(m.I,1) ) + lnItem = m.X + Exit + Endif + Endfor - IF lnItem = 0 THEN - lcClaseExterna = FORCEPATH( JUSTSTEM(toFoxBin2Prg.c_InputFile) + '.' + toModulo._ExternalClasses(m.I,1) + '.' + JUSTEXT(toFoxBin2Prg.c_InputFile), JUSTPATH(toFoxBin2Prg.c_InputFile) ) - *ERROR 'No se ha encontrado la clase externa [' + toModulo._ExternalClasses(m.I,1) + '] en el archivo [' + toFoxBin2Prg.c_InputFile + ']' - ERROR ( loLang.C_EXTERNAL_CLASS_NAME_WAS_NOT_FOUND_LOC + ' [' + lcClaseExterna + ']' ) - ENDIF + If lnItem = 0 Then + lcClaseExterna = Forcepath( Juststem(toFoxBin2Prg.c_InputFile) + '.' + toModulo._ExternalClasses(m.I,1) + '.' + Justext(toFoxBin2Prg.c_InputFile), Justpath(toFoxBin2Prg.c_InputFile) ) +*ERROR 'No se ha encontrado la clase externa [' + toModulo._ExternalClasses(m.I,1) + '] en el archivo [' + toFoxBin2Prg.c_InputFile + ']' + Error ( loLang.C_EXTERNAL_CLASS_NAME_WAS_NOT_FOUND_LOC + ' [' + lcClaseExterna + ']' ) + Endif - toModulo._Clases(lnItem)._Checked = .T. - ENDFOR + toModulo._Clases(lnItem)._Checked = .T. + Endfor - CASE toFoxBin2Prg.n_UseClassPerFile = 2 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) - *-- El nuevo ClassPerFile, con nomenclatura 'Libreria.ClaseBase.NombreClase.vc2' - FOR I = 1 TO toModulo._ExternalClasses_Count - lnItem = 0 + Case toFoxBin2Prg.n_UseClassPerFile = 2 And toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) +*-- El nuevo ClassPerFile, con nomenclatura 'Libreria.ClaseBase.NombreClase.vc2' + For I = 1 To toModulo._ExternalClasses_Count + lnItem = 0 - FOR X = 1 TO toModulo._Clases_Count - IF LOWER( toModulo._Clases(m.X)._BaseClass + '.' + toModulo._Clases(m.X)._ObjName ) == LOWER( toModulo._ExternalClasses(m.I,2) ) - lnItem = m.X - EXIT - ENDIF - ENDFOR + For X = 1 To toModulo._Clases_Count + If Lower( toModulo._Clases(m.X)._BaseClass + '.' + toModulo._Clases(m.X)._ObjName ) == Lower( toModulo._ExternalClasses(m.I,2) ) + lnItem = m.X + Exit + Endif + Endfor - IF lnItem = 0 THEN - lcClaseExterna = FORCEPATH( JUSTSTEM(toFoxBin2Prg.c_InputFile) + '.' + toModulo._ExternalClasses(m.I,1) + '.' + JUSTEXT(toFoxBin2Prg.c_InputFile), JUSTPATH(toFoxBin2Prg.c_InputFile) ) - *ERROR 'No se ha encontrado la clase externa [' + toModulo._ExternalClasses(m.I,1) + '] en el archivo [' + toFoxBin2Prg.c_InputFile + ']' - ERROR ( loLang.C_EXTERNAL_CLASS_NAME_WAS_NOT_FOUND_LOC + ' [' + lcClaseExterna + ']' ) - ENDIF + If lnItem = 0 Then + lcClaseExterna = Forcepath( Juststem(toFoxBin2Prg.c_InputFile) + '.' + toModulo._ExternalClasses(m.I,1) + '.' + Justext(toFoxBin2Prg.c_InputFile), Justpath(toFoxBin2Prg.c_InputFile) ) +*ERROR 'No se ha encontrado la clase externa [' + toModulo._ExternalClasses(m.I,1) + '] en el archivo [' + toFoxBin2Prg.c_InputFile + ']' + Error ( loLang.C_EXTERNAL_CLASS_NAME_WAS_NOT_FOUND_LOC + ' [' + lcClaseExterna + ']' ) + Endif - toModulo._Clases(lnItem)._Checked = .T. - ENDFOR + toModulo._Clases(lnItem)._Checked = .T. + Endfor - ENDCASE - ENDPROC + Endcase + Endproc -ENDDEFINE +Enddefine -DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' - #ENDIF - *_MEMBERDATA = [] ; - + [] ; - + [] +Define Class c_conversor_prg_a_vcx As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_vcx Of 'FOXBIN2PRG.PRG' + #Endif +*_MEMBERDATA = [] ; ++ [] ; ++ [] c_Type = 'VC2' - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (@! OUT) Objeto generado de clase CL_CLASSLIB con la información leida del texto - * toEx (@! OUT) Objeto con información del error - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxBin2Prg - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - DODEFAULT( @toModulo, @toEx, @toFoxBin2Prg ) + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (@! OUT) Objeto generado de clase CL_CLASSLIB con la información leida del texto +* toEx (@! OUT) Objeto con información del error +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toModulo, toEx As Exception, toFoxBin2Prg + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + DoDefault( @toModulo, @toEx, @toFoxBin2Prg ) - TRY - LOCAL lnCodError, laCodeLines(1), lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles(1,5) ; - , laLineasExclusion(1), lnBloquesExclusion, I, lcClassName, lnIDInputFile, llReplaceClass, lnRow ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - - LOCAL; - lnDots AS NUMBER + Try + Local lnCodError, laCodeLines(1), lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles(1,5) ; + , laLineasExclusion(1), lnBloquesExclusion, I, lcClassName, lnIDInputFile, llReplaceClass, lnRow ; + , loClase As CL_CLASE Of 'FOXBIN2PRG.PRG' ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodError, lnCodeLines - STORE '' TO C_FB2PRG_CODE, lcClassName - STORE NULL TO toModulo + Local; + lnDots As Number - loLang = _SCREEN.o_FoxBin2Prg_Lang - toModulo = CREATEOBJECT('CL_CLASSLIB') - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + With This As c_conversor_prg_a_vcx Of 'FOXBIN2PRG.PRG' + Store 0 To lnCodError, lnCodeLines + Store '' To C_FB2PRG_CODE, lcClassName + Store Null To toModulo - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain ; - AND EMPTY(toFoxBin2Prg.c_ClassToConvert) + loLang = _Screen.o_FoxBin2Prg_Lang + toModulo = Createobject('CL_CLASSLIB') + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - IF toFoxBin2Prg.n_RedirectClassType = 0 && Redireccionar todas las clases - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) + If toFoxBin2Prg.n_UseClassPerFile > 0 And toFoxBin2Prg.l_RedirectClassPerFileToMain ; + AND Empty(toFoxBin2Prg.c_ClassToConvert) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + If toFoxBin2Prg.n_RedirectClassType = 0 && Redireccionar todas las clases + C_FB2PRG_CODE = Filetostr( .c_InputFile ) - .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) - .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) - .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) - ENDIF + .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) + .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) - *-- MÁSCARA DE BÚSQUEDA - IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN - *-- Esto crea la máscara de búsqueda "filename.*.ext" para encontrar las partes - *-- con la sintaxis "Classlib.Classname.ext" o "Database.MemberName.ext" - lcBaseFilename = JUSTSTEM( JUSTSTEM(.c_InputFile) ) - lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.' + JUSTEXT(.c_InputFile) - ELSE && toFoxBin2Prg.n_UseClassPerFile = 2 - *-- Esto crea la máscara de búsqueda "filename.*.*.ext" para encontrar las partes - *-- con la sintaxis "Classlib.ClassType.Classname.ext" o "Database.MemberType.MemberName.ext" - lcBaseFilename = JUSTSTEM( JUSTSTEM( JUSTSTEM(.c_InputFile) ) ) - lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.*.' + JUSTEXT(.c_InputFile) - ENDIF + .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) + Endif - IF toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase - lcInputFile = .c_InputFile - ENDIF +*-- MÁSCARA DE BÚSQUEDA + If toFoxBin2Prg.n_UseClassPerFile = 1 Then +*-- Esto crea la máscara de búsqueda "filename.*.ext" para encontrar las partes +*-- con la sintaxis "Classlib.Classname.ext" o "Database.MemberName.ext" + lcBaseFilename = Juststem( Juststem(.c_InputFile) ) + lcInputFile = Addbs( Justpath(.c_InputFile) ) + lcBaseFilename + '.*.' + Justext(.c_InputFile) + Else && toFoxBin2Prg.n_UseClassPerFile = 2 +*-- Esto crea la máscara de búsqueda "filename.*.*.ext" para encontrar las partes +*-- con la sintaxis "Classlib.ClassType.Classname.ext" o "Database.MemberType.MemberName.ext" + lcBaseFilename = Juststem( Juststem( Juststem(.c_InputFile) ) ) + lcInputFile = Addbs( Justpath(.c_InputFile) ) + lcBaseFilename + '.*.*.' + Justext(.c_InputFile) + Endif + + If toFoxBin2Prg.n_RedirectClassType = 1 && Redireccionar solo esta clase + lcInputFile = .c_InputFile + Endif *!* Changed by: Lutz Scheffler 15.2.2021 *!* change date="{^2021-02-15,16:09:00}" @@ -10437,336 +10449,753 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin * creates multiple classes in VCX * the problem is ADIR(laFiles,Name+".*.ext") will return files with AT LEAST 2 dots * so we simply remove files with to many dots - lnDots = OCCURS('.',m.lcInputFile) + lnDots = Occurs('.',m.lcInputFile) - lnFileCount = ADIR( laFiles, lcInputFile, "", 1 ) + lnFileCount = Adir( laFiles, lcInputFile, "", 1 ) - IF lnFileCount > 1 - FOR i = m.lnFileCount TO 1 STEP -1 - IF OCCURS('.',laFiles(i,1))>m.lnDots THEN - ADEL(laFiles,i) - lnFileCount = m.lnFileCount-1 - ENDIF &&OCCURS('.',laFiles(i,1))>m.lnDots - NEXT - DIMENSION; - laFiles(EVL(lnFileCount,1),ALEN(laFiles,2)) + If lnFileCount > 1 + For I = m.lnFileCount To 1 Step -1 + If Occurs('.',laFiles(I,1))>m.lnDots Then + Adel(laFiles,I) + lnFileCount = m.lnFileCount-1 + Endif &&OCCURS('.',laFiles(i,1))>m.lnDots + Next + Dimension; + laFiles(Evl(lnFileCount,1),Alen(laFiles,2)) *!* /Changed by: Lutz Scheffler 15.2.2021 - ASORT( laFiles, 1, 0, 0, 1) - ENDIF + Asort( laFiles, 1, 0, 0, 1) + Endif - FOR I = 1 TO lnFileCount - IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN - lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(m.I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile ) - lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) ) + For I = 1 To lnFileCount + If toFoxBin2Prg.n_UseClassPerFile = 1 Then + lcInputFile_Class = Forcepath( Juststem( laFiles(m.I,1) ), Justpath( .c_InputFile ) ) + '.' + Justext( .c_InputFile ) + lcClassName = Lower( Getwordnum( Justfname( lcInputFile_Class ), 2, '.' ) ) - *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; - AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 - .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas - ENDIF - ELSE && toFoxBin2Prg.n_UseClassPerFile = 2 - lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(m.I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile ) - lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) + '.' + GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) ) +*-- Verificación de las Clases, si son Externas y se indicó chequearlas + If toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) ; + AND Ascan( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 + .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + Loop && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas + Endif + Else && toFoxBin2Prg.n_UseClassPerFile = 2 + lcInputFile_Class = Forcepath( Juststem( laFiles(m.I,1) ), Justpath( .c_InputFile ) ) + '.' + Justext( .c_InputFile ) + lcClassName = Lower( Getwordnum( Justfname( lcInputFile_Class ), 2, '.' ) + '.' + Getwordnum( Justfname( lcInputFile_Class ), 3, '.' ) ) - *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; - AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 - .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas - ENDIF - ENDIF +*-- Verificación de las Clases, si son Externas y se indicó chequearlas + If toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) ; + AND Ascan( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 + .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + Loop && Salteo esta clase porque se indicó chequear y no concuerda con las anotadas + Endif + Endif - .writeLog( C_TAB + C_TAB + '+ ' + loLang.C_INCLUDING_CLASS_LOC + ' ' + JUSTFNAME( lcInputFile_Class ) ) + .writeLog( C_TAB + C_TAB + '+ ' + loLang.C_INCLUDING_CLASS_LOC + ' ' + Justfname( lcInputFile_Class ) ) - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( lcInputFile_Class, 'I', 'P1', 'E0', 'S1', 'X1' ) THEN +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( lcInputFile_Class, 'I', 'P1', 'E0', 'S1', 'X1' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + If toFoxBin2Prg.l_ProcessFiles Then + toFoxBin2Prg.normalizeFileCapitalization( .T., lcInputFile_Class ) + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + Filetostr( lcInputFile_Class ) + Endif + Endfor + + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + Else +*-- No es clase por archivo, o no se quiere redireccionar a Main, o se usó +*-- la sintaxis "classlib.vcx::classname::import" + If toFoxBin2Prg.l_ProcessFiles Then + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + + .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) + .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) + Endif + + Endif + + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then toFoxBin2Prg.updateProcessedFile() - ENDIF + Endif - IF toFoxBin2Prg.l_ProcessFiles THEN - toFoxBin2Prg.normalizeFileCapitalization( .T., lcInputFile_Class ) - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + FILETOSTR( lcInputFile_Class ) - ENDIF - ENDFOR + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - ELSE - *-- No es clase por archivo, o no se quiere redireccionar a Main, o se usó - *-- la sintaxis "classlib.vcx::classname::import" - IF toFoxBin2Prg.l_ProcessFiles THEN - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) +*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF + .updateProgressbar( 'Identifying Excluded Blocks...', 3, lnCodeLines, 1 ) + .identifyExclusionBlocks( @laCodeLines, lnCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) + +*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase + + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif + + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .updateProgressbar( loLang.C_GENERATING_BINARY_LOC + '...', 0, lnCodeLines, 1 ) + + If toFoxBin2Prg.n_RedirectClassType = 1 Or Not Empty(toFoxBin2Prg.c_ClassToConvert) && Redireccionar solo esta clase a main + llReplaceClass = .T. + + If Empty(toFoxBin2Prg.c_ClassToConvert) + toFoxBin2Prg.c_OutputFile = Fullpath( Forceext( lcBaseFilename, 'VCX' ), .c_InputFile) + Else + loClase = toModulo._Clases(1) +* Ajusto el nombre interno de la clase al indicado en el nombre del archivo + loClase._Nombre = toFoxBin2Prg.c_ClassToConvert + loClase._ObjName = toFoxBin2Prg.c_ClassToConvert +* Reemplazo la propiedad Name + lnRow = Ascan(loClase._Props, 'Name', 1, -1, 1, 2+4+8) + If lnRow > 0 + loClase._Props(lnRow,2) = ["] + toFoxBin2Prg.c_ClassToConvert + ["] + Endif +* Y finalmente actualizo el memo + loClase._PROPERTIES = .classProps2Memo( @loClase, @toFoxBin2Prg ) + Endif + + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + + If Adir( laFiles, toFoxBin2Prg.c_OutputFile, "", 1 ) = 1 + Use (toFoxBin2Prg.c_OutputFile) Alias TABLABIN Again Shared + Else + .createClasslib() + Endif + Else + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + .createClasslib() + Endif + + .writeBinaryFile( @toModulo, @toFoxBin2Prg, llReplaceClass ) + Endwith && THIS + + + Catch To toEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Store Null To loClase + Release lnCodError, laCodeLines, lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles ; + , laLineasExclusion, lnBloquesExclusion, I + Endtry + + Return + Endproc + + + + + Procedure writeBinaryFile + Lparameters toModulo, toFoxBin2Prg, tlReplaceClass +*-- Estructura del objeto toModulo generado: +*-- ----------------------------------------------------------------------------------------------------------- +*-- Version Versión usada para generar la versión PRG analizada +*-- SourceFile Nombre original del archivo fuente de la conversión +*-- Ole_Obj_Count Cantidad de objetos definidos en el array ole_objs[] +*-- Ole_Objs[1] Array de objetos OLE definidos como clases +*-- ObjName Nombre del objeto OLE (OLE2) +*-- Parent Nombre del objeto Padre +*-- CheckSum Suma de verificación +*-- Value Valor del campo OLE +*-- Clases_Count Array con las posiciones de los addobjects, definicion y propiedades +*-- Clases[1] Array con los datos de las clases, definicion, propiedades y métodos +*-- Nombre El nombre de la clase (ej: "miClase") +*-- ObjName Nombre del objeto +*-- Parent Nombre del objeto Padre +*-- Class Clase de la que hereda la definición +*-- Classloc Librería donde está la definición de la clase +*-- Ole Información campo ole +*-- Ole2 Información campo ole2 +*-- OlePublic Indica si la clase es OLEPublic o no (.T. / .F.) +*-- Uniqueid ID único +*-- Comentario El comentario de la clase (ej: "&& Mis comentarios") +*-- MetaData Información de metadata de la clase (baseclass, timestamp, scale) +*-- BaseClass Clase de base de la clase +*-- TimeStamp Timestamp de la clase +*-- Scale Scale de la clase (pixels, foxels) +*-- Definicion La definición de la clase (ej: "AS Custom OF LIBRERIA.VCX") +*-- Inicio/Fin Línea de inicio/fin de la clase (DEFINE CLASS/ENDDEFINE) +*-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PAM) +*-- Ini_Cuerpo/Fin_Cuerpo Línea de inicio/fin del cuerpo (ADD OBJECTs y PROCEDURES) +*-- HiddenProps Propiedades definidas como HIDDEN (ocultas) +*-- ProtectedProps Propiedades definidas como PROTECTED (protegidas) +*-- Defined_PAM Propiedades, eventos o métodos definidos por el usuario +*-- IncludeFile Nombre del archivo de inclusión +*-- Props_Count Cantidad de propiedades de la clase definicas en el array props[] +*-- Props[1,2] Array con todas las propiedades de la clase y sus valores. (col.1=Nombre, col.2=Comentario) +*-- AddObject_Count Cantidad de objetos definidos en el array addobjects[] +*-- AddObjects[1] Array con las posiciones de los addobjects, definicion y propiedades +*-- Nombre Nombre del objeto +*-- ObjName Nombre del objeto +*-- Parent Nombre del objeto Padre +*-- Clase Clase del objeto +*-- ClassLib Librería de clases de la que deriva la clase +*-- Baseclass Clase de base del objeto +*-- Uniqueid ID único +*-- Ole Información campo ole +*-- Ole2 Información campo ole2 +*-- ZOrder Orden Z del objeto +*-- Props_Count Cantidad de propiedades del objeto +*-- Props[1] Array con todas las propiedades del objeto y sus valores +*-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] +*-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios +*-- Nombre Nombre del procedure +*-- ProcType Tipo de procedimiento (normal, hidden, protected) +*-- Comentario Comentario el procedure +*-- ProcLine_Count Cantidad de líneas del procedimiento +*-- ProcLines[1] Líneas del procedimiento +*-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] +*-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios +*-- Nombre Nombre del procedure +*-- ProcType Tipo de procedimiento (normal, hidden, protected) +*-- Comentario Comentario el procedure +*-- ProcLine_Count Cantidad de líneas del procedimiento +*-- ProcLines[1] Líneas del procedimiento +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local lcObjName, lnCodError, I, X, llReplace, laUniqueID(1,1), loEx As Exception ; + , loClase As CL_CLASE Of 'FOXBIN2PRG.PRG' ; + , loFSO As Scripting.FileSystemObject + + With This As c_conversor_prg_a_vcx Of 'FOXBIN2PRG.PRG' + Store Null To loFSO, loClase + loFSO = .oFSO + +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) + + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase + + If tlReplaceClass + I = 1 + loClase = toModulo._Clases(m.I) + Locate For PLATFORM == Padr('WINDOWS', Fsize('PLATFORM')) And Lower(OBJNAME) == loClase._ObjName + llReplace = Found() + Endif + + If llReplace +*-- Reemplazar los campos del registro actual + If Empty(loClase._TimeStamp) + loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + Endif + If Empty(loClase._UniqueID) + loClase._UniqueID = toFoxBin2Prg.unique_ID() + Endif + + Replace ; + PLATFORM With 'WINDOWS' ; + , Timestamp With loClase._TimeStamp ; + , Class With loClase._Class ; + , CLASSLOC With loClase._ClassLoc ; + , BaseClass With loClase._BaseClass ; + , OBJNAME With loClase._ObjName ; + , Parent With loClase._Parent ; + , PROPERTIES With loClase._PROPERTIES ; + , Protected With loClase._PROTECTED ; + , METHODS With loClase._METHODS ; + , OLE With loClase._Ole ; + , OLE2 With loClase._Ole2 ; + , RESERVED1 With loClase._RESERVED1 ; + , RESERVED2 With loClase._RESERVED2 ; + , RESERVED3 With loClase._RESERVED3 ; + , RESERVED4 With loClase._RESERVED4 ; + , RESERVED5 With loClase._RESERVED5 ; + , RESERVED6 With loClase._RESERVED6 ; + , RESERVED7 With loClase._RESERVED7 ; + , RESERVED8 With loClase._RESERVED8 ; + , User With loClase._User + +* Si tiene objetos asociados, antes debo eliminar los existentes para no duplicarlos + Delete All For PLATFORM == Padr('WINDOWS', Fsize('PLATFORM')) And Lower(Parent) == loClase._ObjName + + .insert_AllObjects( @loClase, @toFoxBin2Prg ) + + Else +*-- Creo el registro de cabecera + If tlReplaceClass And Reccount() > 0 + Select Max(Val(Substr(UNIQUEID,2))) From TABLABIN Into Array laUniqueID + toFoxBin2Prg.n_ID = laUniqueID(1) + Else + .createClasslib_RecordHeader( toModulo ) + Endif + +*-- Recorro las CLASES + For X = 1 To 2 + For I = 1 To toModulo._Clases_Count + loClase = Null + loClase = toModulo._Clases(m.I) + +*-- El dataenvironment debe estar primero, luego lo demás. + If m.X = 1 And Not loClase._BaseClass == 'dataenvironment' ; + OR m.X = 2 And loClase._BaseClass == 'dataenvironment' + Loop + Endif + + If Empty(loClase._TimeStamp) + loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + Endif + If Empty(loClase._UniqueID) + loClase._UniqueID = toFoxBin2Prg.unique_ID() + Endif + +*-- Inserto la clase + Insert Into TABLABIN ; + ( PLATFORM ; + , UNIQUEID ; + , Timestamp ; + , Class ; + , CLASSLOC ; + , BaseClass ; + , OBJNAME ; + , Parent ; + , PROPERTIES ; + , Protected ; + , METHODS ; + , OLE ; + , OLE2 ; + , RESERVED1 ; + , RESERVED2 ; + , RESERVED3 ; + , RESERVED4 ; + , RESERVED5 ; + , RESERVED6 ; + , RESERVED7 ; + , RESERVED8 ; + , User) ; + VALUES ; + ( 'WINDOWS' ; + , loClase._UniqueID ; + , loClase._TimeStamp ; + , loClase._Class ; + , loClase._ClassLoc ; + , loClase._BaseClass ; + , loClase._ObjName ; + , loClase._Parent ; + , loClase._PROPERTIES ; + , loClase._PROTECTED ; + , loClase._METHODS ; + , loClase._Ole ; + , loClase._Ole2 ; + , loClase._RESERVED1 ; + , loClase._RESERVED2 ; + , loClase._RESERVED3 ; + , loClase._ClassIcon ; + , loClase._ProjectClassIcon ; + , loClase._Scale ; + , loClase._Comentario ; + , loClase._includeFile ; + , loClase._User ) + + + .insert_AllObjects( @loClase, @toFoxBin2Prg ) + + +*-- Inserto el COMMENT + Insert Into TABLABIN ; + ( PLATFORM ; + , UNIQUEID ; + , Timestamp ; + , Class ; + , CLASSLOC ; + , BaseClass ; + , OBJNAME ; + , Parent ; + , PROPERTIES ; + , Protected ; + , METHODS ; + , OLE ; + , OLE2 ; + , RESERVED1 ; + , RESERVED2 ; + , RESERVED3 ; + , RESERVED4 ; + , RESERVED5 ; + , RESERVED6 ; + , RESERVED7 ; + , RESERVED8 ; + , User) ; + VALUES ; + ( 'COMMENT' ; + , 'RESERVED' ; + , 0 ; + , '' ; + , '' ; + , '' ; + , loClase._ObjName ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , Iif(loClase._OlePublic, 'OLEPublic', '') ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ) + + Endfor && I = 1 TO toModulo._Clases_Count + Endfor && X = 1 TO 2 + Endif + + Use In (Select("TABLABIN")) + + If toFoxBin2Prg.l_Recompile + toFoxBin2Prg.compileFoxProBinary() + Endif + + toFoxBin2Prg.updateProcessedFile() + Endwith && THIS + + + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Store Null To loFSO, loClase + Release lcObjName, I, X, loClase, loFSO + + Endtry + + Return lnCodError + + Endproc +Enddefine + + + + +Define Class c_conversor_prg_a_scx As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_scx Of 'FOXBIN2PRG.PRG' + #Endif +*_MEMBERDATA = [] ; ++ [] ; ++ [] + c_Type = 'SC2' + + + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (@! OUT) Objeto generado de clase CL_CLASSLIB con la información leida del texto +* toEx (@! OUT) Objeto con información del error +* toFoxBin2Prg (@! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toModulo, toEx As Exception, toFoxBin2Prg + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + DoDefault( @toModulo, @toEx, @toFoxBin2Prg ) + + Try + Local lnCodError, laCodeLines(1), lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles(1,5) ; + , laLineasExclusion(1), lnBloquesExclusion, I, lnIDInputFile ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + + With This As c_conversor_prg_a_vcx Of 'FOXBIN2PRG.PRG' + Store 0 To lnCodError, lnCodeLines + Store '' To C_FB2PRG_CODE + Store Null To toModulo + + loLang = _Screen.o_FoxBin2Prg_Lang + toModulo = Createobject('CL_CLASSLIB') + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + + If toFoxBin2Prg.n_UseClassPerFile > 0 And toFoxBin2Prg.l_RedirectClassPerFileToMain + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) - ENDIF - ENDIF + .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF +*-- MÁSCARA DE BÚSQUEDA + If toFoxBin2Prg.n_UseClassPerFile = 1 Then +*-- Esto crea la máscara de búsqueda "filename.*.ext" para encontrar las partes + lcBaseFilename = Juststem( Juststem(.c_InputFile) ) + lcInputFile = Addbs( Justpath(.c_InputFile) ) + lcBaseFilename + '.*.' + Justext(.c_InputFile) + Else && toFoxBin2Prg.n_UseClassPerFile = 2 +*-- Esto crea la máscara de búsqueda "Database.*.*.ext" para encontrar las partes +*-- con la sintaxis "Database.MemberType.MemberName.ext" + lcBaseFilename = Juststem( Juststem( Juststem(.c_InputFile) ) ) + lcInputFile = Addbs( Justpath(.c_InputFile) ) + lcBaseFilename + '.*.*.' + Justext(.c_InputFile) + Endif - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF + lnFileCount = Adir( laFiles, lcInputFile, "", 1 ) + Asort( laFiles, 1, 0, 0, 1) - *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - .updateProgressbar( 'Identifying Excluded Blocks...', 3, lnCodeLines, 1 ) - .identifyExclusionBlocks( @laCodeLines, lnCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) + For I = 1 To lnFileCount + If toFoxBin2Prg.n_UseClassPerFile = 1 Then + lcInputFile_Class = Forcepath( Juststem( laFiles(m.I,1) ), Justpath( .c_InputFile ) ) + '.' + Justext( .c_InputFile ) + lcClassName = Lower( Getwordnum( Justfname( lcInputFile_Class ), 2, '.' ) ) - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) +*-- Verificación de las Clases, si son Externas y se indicó chequearlas + If toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) ; + AND Ascan( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 + .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + Loop && Salteo esta clase + Endif + Else && toFoxBin2Prg.n_UseClassPerFile = 2 + lcInputFile_Class = Forcepath( Juststem( laFiles(m.I,1) ), Justpath( .c_InputFile ) ) + '.' + Justext( .c_InputFile ) + lcClassName = Lower( Getwordnum( Justfname( lcInputFile_Class ), 2, '.' ) + '.' + Getwordnum( Justfname( lcInputFile_Class ), 3, '.' ) ) - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE +*-- Verificación de las Clases, si son Externas y se indicó chequearlas + If toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) ; + AND Ascan( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 + .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) + Loop && Salteo esta clase + Endif + Endif - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF + .writeLog( C_TAB + C_TAB + '+ ' + loLang.C_INCLUDING_CLASS_LOC + ' ' + Justfname( lcInputFile_Class ) ) - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .updateProgressbar( loLang.C_GENERATING_BINARY_LOC + '...', 0, lnCodeLines, 1 ) +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( lcInputFile_Class, 'I', 'P1', 'E0', 'S1', 'X1' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif - IF toFoxBin2Prg.n_RedirectClassType = 1 OR NOT EMPTY(toFoxBin2Prg.c_ClassToConvert) && Redireccionar solo esta clase a main - llReplaceClass = .T. + toFoxBin2Prg.normalizeFileCapitalization( .T., lcInputFile_Class ) + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + Filetostr( lcInputFile_Class ) + Endfor - IF EMPTY(toFoxBin2Prg.c_ClassToConvert) - toFoxBin2Prg.c_OutputFile = FULLPATH( FORCEEXT( lcBaseFilename, 'VCX' ), .c_InputFile) - ELSE - loClase = toModulo._Clases(1) - * Ajusto el nombre interno de la clase al indicado en el nombre del archivo - loClase._Nombre = toFoxBin2Prg.c_ClassToConvert - loClase._ObjName = toFoxBin2Prg.c_ClassToConvert - * Reemplazo la propiedad Name - lnRow = ASCAN(loClase._Props, 'Name', 1, -1, 1, 2+4+8) - IF lnRow > 0 - loClase._Props(lnRow,2) = ["] + toFoxBin2Prg.c_ClassToConvert + ["] - ENDIF - * Y finalmente actualizo el memo - loClase._PROPERTIES = .classProps2Memo( @loClase, @toFoxBin2Prg ) - ENDIF + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + Else +*-- No es clase por archivo, o no se quiere redireccionar a Main. + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) + .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) + + Endif + + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif + +*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF + .updateProgressbar( 'Identifying Excluded Blocks...', 3, lnCodeLines, 1 ) + .identifyExclusionBlocks( @laCodeLines, lnCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) + +*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase + + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif + + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .updateProgressbar( 'Generating Binary...', 0, lnCodeLines, 1 ) toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - - IF ADIR( laFiles, toFoxBin2Prg.c_OutputFile, "", 1 ) = 1 - USE (toFoxBin2Prg.c_OutputFile) ALIAS TABLABIN AGAIN SHARED - ELSE - .createClasslib() - ENDIF - ELSE - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - .createClasslib() - ENDIF - - .writeBinaryFile( @toModulo, @toFoxBin2Prg, llReplaceClass ) - ENDWITH && THIS + .createForm() + .writeBinaryFile( @toModulo, @toFoxBin2Prg ) + Endwith && THIS - CATCH TO toEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To toEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - USE IN (SELECT("TABLABIN")) - STORE NULL TO loClase - RELEASE lnCodError, laCodeLines, lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles ; - , laLineasExclusion, lnBloquesExclusion, I - ENDTRY + Finally + Use In (Select("TABLABIN")) + Release lnCodError, laCodeLines, lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles ; + , laLineasExclusion, lnBloquesExclusion, I + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE writeBinaryFile - LPARAMETERS toModulo, toFoxBin2Prg, tlReplaceClass - *-- Estructura del objeto toModulo generado: - *-- ----------------------------------------------------------------------------------------------------------- - *-- Version Versión usada para generar la versión PRG analizada - *-- SourceFile Nombre original del archivo fuente de la conversión - *-- Ole_Obj_Count Cantidad de objetos definidos en el array ole_objs[] - *-- Ole_Objs[1] Array de objetos OLE definidos como clases - *-- ObjName Nombre del objeto OLE (OLE2) - *-- Parent Nombre del objeto Padre - *-- CheckSum Suma de verificación - *-- Value Valor del campo OLE - *-- Clases_Count Array con las posiciones de los addobjects, definicion y propiedades - *-- Clases[1] Array con los datos de las clases, definicion, propiedades y métodos - *-- Nombre El nombre de la clase (ej: "miClase") - *-- ObjName Nombre del objeto - *-- Parent Nombre del objeto Padre - *-- Class Clase de la que hereda la definición - *-- Classloc Librería donde está la definición de la clase - *-- Ole Información campo ole - *-- Ole2 Información campo ole2 - *-- OlePublic Indica si la clase es OLEPublic o no (.T. / .F.) - *-- Uniqueid ID único - *-- Comentario El comentario de la clase (ej: "&& Mis comentarios") - *-- MetaData Información de metadata de la clase (baseclass, timestamp, scale) - *-- BaseClass Clase de base de la clase - *-- TimeStamp Timestamp de la clase - *-- Scale Scale de la clase (pixels, foxels) - *-- Definicion La definición de la clase (ej: "AS Custom OF LIBRERIA.VCX") - *-- Inicio/Fin Línea de inicio/fin de la clase (DEFINE CLASS/ENDDEFINE) - *-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PAM) - *-- Ini_Cuerpo/Fin_Cuerpo Línea de inicio/fin del cuerpo (ADD OBJECTs y PROCEDURES) - *-- HiddenProps Propiedades definidas como HIDDEN (ocultas) - *-- ProtectedProps Propiedades definidas como PROTECTED (protegidas) - *-- Defined_PAM Propiedades, eventos o métodos definidos por el usuario - *-- IncludeFile Nombre del archivo de inclusión - *-- Props_Count Cantidad de propiedades de la clase definicas en el array props[] - *-- Props[1,2] Array con todas las propiedades de la clase y sus valores. (col.1=Nombre, col.2=Comentario) - *-- AddObject_Count Cantidad de objetos definidos en el array addobjects[] - *-- AddObjects[1] Array con las posiciones de los addobjects, definicion y propiedades - *-- Nombre Nombre del objeto - *-- ObjName Nombre del objeto - *-- Parent Nombre del objeto Padre - *-- Clase Clase del objeto - *-- ClassLib Librería de clases de la que deriva la clase - *-- Baseclass Clase de base del objeto - *-- Uniqueid ID único - *-- Ole Información campo ole - *-- Ole2 Información campo ole2 - *-- ZOrder Orden Z del objeto - *-- Props_Count Cantidad de propiedades del objeto - *-- Props[1] Array con todas las propiedades del objeto y sus valores - *-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] - *-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios - *-- Nombre Nombre del procedure - *-- ProcType Tipo de procedimiento (normal, hidden, protected) - *-- Comentario Comentario el procedure - *-- ProcLine_Count Cantidad de líneas del procedimiento - *-- ProcLines[1] Líneas del procedimiento - *-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] - *-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios - *-- Nombre Nombre del procedure - *-- ProcType Tipo de procedimiento (normal, hidden, protected) - *-- Comentario Comentario el procedure - *-- ProcLine_Count Cantidad de líneas del procedimiento - *-- ProcLines[1] Líneas del procedimiento - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + Procedure writeBinaryFile + Lparameters toModulo, toFoxBin2Prg +*-- Estructura del objeto toModulo generado: +*-- ----------------------------------------------------------------------------------------------------------- +*-- Version Versión usada para generar la versión PRG analizada +*-- SourceFile Nombre original del archivo fuente de la conversión +*-- Ole_Obj_Count Cantidad de objetos definidos en el array ole_objs[] +*-- Ole_Objs[1] Array de objetos OLE definidos como clases +*-- ObjName Nombre del objeto OLE (OLE2) +*-- Parent Nombre del objeto Padre +*-- CheckSum Suma de verificación +*-- Value Valor del campo OLE +*-- Clases_Count Array con las posiciones de los addobjects, definicion y propiedades +*-- Clases[1] Array con los datos de las clases, definicion, propiedades y métodos +*-- Nombre El nombre de la clase (ej: "miClase") +*-- ObjName Nombre del objeto +*-- Parent Nombre del objeto Padre +*-- Class Clase de la que hereda la definición +*-- Classloc Librería donde está la definición de la clase +*-- Ole Información campo ole +*-- Ole2 Información campo ole2 +*-- OlePublic Indica si la clase es OLEPublic o no (.T. / .F.) +*-- Uniqueid ID único +*-- Comentario El comentario de la clase (ej: "&& Mis comentarios") +*-- MetaData Información de metadata de la clase (baseclass, timestamp, scale) +*-- BaseClass Clase de base de la clase +*-- TimeStamp Timestamp de la clase +*-- Scale Scale de la clase (pixels, foxels) +*-- Definicion La definición de la clase (ej: "AS Custom OF LIBRERIA.VCX") +*-- Inicio/Fin Línea de inicio/fin de la clase (DEFINE CLASS/ENDDEFINE) +*-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PAM) +*-- Ini_Cuerpo/Fin_Cuerpo Línea de inicio/fin del cuerpo (ADD OBJECTs y PROCEDURES) +*-- HiddenProps Propiedades definidas como HIDDEN (ocultas) +*-- ProtectedProps Propiedades definidas como PROTECTED (protegidas) +*-- Defined_PAM Propiedades, eventos o métodos definidos por el usuario +*-- IncludeFile Nombre del archivo de inclusión +*-- Props_Count Cantidad de propiedades de la clase definicas en el array props[] +*-- Props[1,2] Array con todas las propiedades de la clase y sus valores. (col.1=Nombre, col.2=Comentario) +*-- AddObject_Count Cantidad de objetos definidos en el array addobjects[] +*-- AddObjects[1] Array con las posiciones de los addobjects, definicion y propiedades +*-- Nombre Nombre del objeto +*-- ObjName Nombre del objeto +*-- Parent Nombre del objeto Padre +*-- Clase Clase del objeto +*-- ClassLib Librería de clases de la que deriva la clase +*-- Baseclass Clase de base del objeto +*-- Uniqueid ID único +*-- Ole Información campo ole +*-- Ole2 Información campo ole2 +*-- ZOrder Orden Z del objeto +*-- Props_Count Cantidad de propiedades del objeto +*-- Props[1] Array con todas las propiedades del objeto y sus valores +*-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] +*-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios +*-- Nombre Nombre del procedure +*-- ProcType Tipo de procedimiento (normal, hidden, protected) +*-- Comentario Comentario el procedure +*-- ProcLine_Count Cantidad de líneas del procedimiento +*-- ProcLines[1] Líneas del procedimiento +*-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] +*-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios +*-- Nombre Nombre del procedure +*-- ProcType Tipo de procedimiento (normal, hidden, protected) +*-- Comentario Comentario el procedure +*-- ProcLine_Count Cantidad de líneas del procedimiento +*-- ProcLines[1] Líneas del procedimiento +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toModulo As CL_CLASSLIB Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lcObjName, lnCodError, I, X, llReplace, laUniqueID(1,1), loEx AS EXCEPTION ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; - , loFSO AS Scripting.FileSystemObject + Try + Local lcObjName, lnCodError, I, X, loEx As Exception ; + , loClase As CL_CLASE Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' - STORE NULL TO loFSO, loClase - loFSO = .oFSO + With This As c_conversor_prg_a_scx Of 'FOXBIN2PRG.PRG' +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase + +*-- Creo el registro de cabecera + .createForm_RecordHeader( toModulo ) + +*-- El SCX tiene el INCLUDE en el primer registro + If Not Empty(toModulo._includeFile) + Replace RESERVED8 With toModulo._includeFile + Endif - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE - - IF tlReplaceClass - I = 1 - loClase = toModulo._Clases(m.I) - LOCATE FOR PLATFORM == PADR('WINDOWS', FSIZE('PLATFORM')) AND LOWER(OBJNAME) == loClase._ObjName - llReplace = FOUND() - ENDIF - - IF llReplace - *-- Reemplazar los campos del registro actual - IF EMPTY(loClase._TimeStamp) - loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loClase._UniqueID) - loClase._UniqueID = toFoxBin2Prg.unique_ID() - ENDIF - - REPLACE ; - PLATFORM WITH 'WINDOWS' ; - , TIMESTAMP WITH loClase._TimeStamp ; - , CLASS WITH loClase._Class ; - , CLASSLOC WITH loClase._ClassLoc ; - , BASECLASS WITH loClase._BaseClass ; - , OBJNAME WITH loClase._ObjName ; - , PARENT WITH loClase._Parent ; - , PROPERTIES WITH loClase._PROPERTIES ; - , PROTECTED WITH loClase._PROTECTED ; - , METHODS WITH loClase._METHODS ; - , OLE WITH loClase._Ole ; - , OLE2 WITH loClase._Ole2 ; - , RESERVED1 WITH loClase._RESERVED1 ; - , RESERVED2 WITH loClase._RESERVED2 ; - , RESERVED3 WITH loClase._RESERVED3 ; - , RESERVED4 WITH loClase._RESERVED4 ; - , RESERVED5 WITH loClase._RESERVED5 ; - , RESERVED6 WITH loClase._RESERVED6 ; - , RESERVED7 WITH loClase._RESERVED7 ; - , RESERVED8 WITH loClase._RESERVED8 ; - , USER WITH loClase._User - - * Si tiene objetos asociados, antes debo eliminar los existentes para no duplicarlos - DELETE ALL FOR PLATFORM == PADR('WINDOWS', FSIZE('PLATFORM')) AND LOWER(PARENT) == loClase._ObjName - - .insert_AllObjects( @loClase, @toFoxBin2Prg ) - - ELSE - *-- Creo el registro de cabecera - IF tlReplaceClass AND RECCOUNT() > 0 - SELECT MAX(VAL(SUBSTR(UNIQUEID,2))) FROM TABLABIN INTO ARRAY laUniqueID - toFoxBin2Prg.n_ID = laUniqueID(1) - ELSE - .createClasslib_RecordHeader( toModulo ) - ENDIF - - *-- Recorro las CLASES - FOR X = 1 TO 2 - FOR I = 1 TO toModulo._Clases_Count - loClase = NULL +*-- Recorro las CLASES + For X = 1 To 2 + For I = 1 To toModulo._Clases_Count + loClase = Null loClase = toModulo._Clases(m.I) - *-- El dataenvironment debe estar primero, luego lo demás. - IF m.X = 1 AND NOT loClase._BaseClass == 'dataenvironment' ; - OR m.X = 2 AND loClase._BaseClass == 'dataenvironment' - LOOP - ENDIF +*-- El dataenvironment debe estar primero, luego lo demás. + If m.X = 1 And Not loClase._BaseClass == 'dataenvironment' ; + OR m.X = 2 And loClase._BaseClass == 'dataenvironment' + Loop + Endif - IF EMPTY(loClase._TimeStamp) + If Empty(loClase._TimeStamp) loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loClase._UniqueID) + Endif + If Empty(loClase._UniqueID) loClase._UniqueID = toFoxBin2Prg.unique_ID() - ENDIF + Endif - *-- Inserto la clase - INSERT INTO TABLABIN ; +*-- Inserto la clase + Insert Into TABLABIN ; ( PLATFORM ; , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; + , Timestamp ; + , Class ; , CLASSLOC ; - , BASECLASS ; + , BaseClass ; , OBJNAME ; - , PARENT ; + , Parent ; , PROPERTIES ; - , PROTECTED ; + , Protected ; , METHODS ; , OLE ; , OLE2 ; @@ -10778,7 +11207,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER) ; + , User) ; VALUES ; ( 'WINDOWS' ; , loClase._UniqueID ; @@ -10806,512 +11235,95 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin .insert_AllObjects( @loClase, @toFoxBin2Prg ) - - *-- Inserto el COMMENT - INSERT INTO TABLABIN ; - ( PLATFORM ; - , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; - , CLASSLOC ; - , BASECLASS ; - , OBJNAME ; - , PARENT ; - , PROPERTIES ; - , PROTECTED ; - , METHODS ; - , OLE ; - , OLE2 ; - , RESERVED1 ; - , RESERVED2 ; - , RESERVED3 ; - , RESERVED4 ; - , RESERVED5 ; - , RESERVED6 ; - , RESERVED7 ; - , RESERVED8 ; - , USER) ; - VALUES ; - ( 'COMMENT' ; - , 'RESERVED' ; - , 0 ; - , '' ; - , '' ; - , '' ; - , loClase._ObjName ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , IIF(loClase._OlePublic, 'OLEPublic', '') ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ) - - ENDFOR && I = 1 TO toModulo._Clases_Count - ENDFOR && X = 1 TO 2 - ENDIF - - USE IN (SELECT("TABLABIN")) - - IF toFoxBin2Prg.l_Recompile - toFoxBin2Prg.compileFoxProBinary() - ENDIF - - toFoxBin2Prg.updateProcessedFile() - ENDWITH && THIS - - - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - STORE NULL TO loFSO, loClase - RELEASE lcObjName, I, X, loClase, loFSO - - ENDTRY - - RETURN lnCodError - - ENDPROC -ENDDEFINE - - - - -DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_scx OF 'FOXBIN2PRG.PRG' - #ENDIF - *_MEMBERDATA = [] ; - + [] ; - + [] - c_Type = 'SC2' - - - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (@! OUT) Objeto generado de clase CL_CLASSLIB con la información leida del texto - * toEx (@! OUT) Objeto con información del error - * toFoxBin2Prg (@! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxBin2Prg - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - DODEFAULT( @toModulo, @toEx, @toFoxBin2Prg ) - - TRY - LOCAL lnCodError, laCodeLines(1), lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles(1,5) ; - , laLineasExclusion(1), lnBloquesExclusion, I, lnIDInputFile ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - - WITH THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodError, lnCodeLines - STORE '' TO C_FB2PRG_CODE - STORE NULL TO toModulo - - loLang = _SCREEN.o_FoxBin2Prg_Lang - toModulo = CREATEOBJECT('CL_CLASSLIB') - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - - .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) - .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) - - .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) - - *-- MÁSCARA DE BÚSQUEDA - IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN - *-- Esto crea la máscara de búsqueda "filename.*.ext" para encontrar las partes - lcBaseFilename = JUSTSTEM( JUSTSTEM(.c_InputFile) ) - lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.' + JUSTEXT(.c_InputFile) - ELSE && toFoxBin2Prg.n_UseClassPerFile = 2 - *-- Esto crea la máscara de búsqueda "Database.*.*.ext" para encontrar las partes - *-- con la sintaxis "Database.MemberType.MemberName.ext" - lcBaseFilename = JUSTSTEM( JUSTSTEM( JUSTSTEM(.c_InputFile) ) ) - lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.*.' + JUSTEXT(.c_InputFile) - ENDIF - - lnFileCount = ADIR( laFiles, lcInputFile, "", 1 ) - ASORT( laFiles, 1, 0, 0, 1) - - FOR I = 1 TO lnFileCount - IF toFoxBin2Prg.n_UseClassPerFile = 1 THEN - lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(m.I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile ) - lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) ) - - *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; - AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 1, 1+2+4 ) = 0 - .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo esta clase - ENDIF - ELSE && toFoxBin2Prg.n_UseClassPerFile = 2 - lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(m.I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile ) - lcClassName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) + '.' + GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) ) - - *-- Verificación de las Clases, si son Externas y se indicó chequearlas - IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; - AND ASCAN( toModulo._ExternalClasses , lcClassName, 1, 0, 2, 1+2+4 ) = 0 - .writeLog( C_TAB + '- ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_CLASS_DOES_NOT_MATCH_INNER_CLASSES_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo esta clase - ENDIF - ENDIF - - .writeLog( C_TAB + C_TAB + '+ ' + loLang.C_INCLUDING_CLASS_LOC + ' ' + JUSTFNAME( lcInputFile_Class ) ) - - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( lcInputFile_Class, 'I', 'P1', 'E0', 'S1', 'X1' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - toFoxBin2Prg.normalizeFileCapitalization( .T., lcInputFile_Class ) - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + FILETOSTR( lcInputFile_Class ) - ENDFOR - - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - ELSE - *-- No es clase por archivo, o no se quiere redireccionar a Main. - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - - .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) - .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) - - ENDIF - - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF - - *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - .updateProgressbar( 'Identifying Excluded Blocks...', 3, lnCodeLines, 1 ) - .identifyExclusionBlocks( @laCodeLines, lnCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) - - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo, @toFoxBin2Prg ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE - - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF - - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .updateProgressbar( 'Generating Binary...', 0, lnCodeLines, 1 ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - .createForm() - .writeBinaryFile( @toModulo, @toFoxBin2Prg ) - ENDWITH && THIS - - - CATCH TO toEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - RELEASE lnCodError, laCodeLines, lnCodeLines, lcInputFile, lcInputFile_Class, lnFileCount, laFiles ; - , laLineasExclusion, lnBloquesExclusion, I - ENDTRY - - RETURN - ENDPROC - - - - - PROCEDURE writeBinaryFile - LPARAMETERS toModulo, toFoxBin2Prg - *-- Estructura del objeto toModulo generado: - *-- ----------------------------------------------------------------------------------------------------------- - *-- Version Versión usada para generar la versión PRG analizada - *-- SourceFile Nombre original del archivo fuente de la conversión - *-- Ole_Obj_Count Cantidad de objetos definidos en el array ole_objs[] - *-- Ole_Objs[1] Array de objetos OLE definidos como clases - *-- ObjName Nombre del objeto OLE (OLE2) - *-- Parent Nombre del objeto Padre - *-- CheckSum Suma de verificación - *-- Value Valor del campo OLE - *-- Clases_Count Array con las posiciones de los addobjects, definicion y propiedades - *-- Clases[1] Array con los datos de las clases, definicion, propiedades y métodos - *-- Nombre El nombre de la clase (ej: "miClase") - *-- ObjName Nombre del objeto - *-- Parent Nombre del objeto Padre - *-- Class Clase de la que hereda la definición - *-- Classloc Librería donde está la definición de la clase - *-- Ole Información campo ole - *-- Ole2 Información campo ole2 - *-- OlePublic Indica si la clase es OLEPublic o no (.T. / .F.) - *-- Uniqueid ID único - *-- Comentario El comentario de la clase (ej: "&& Mis comentarios") - *-- MetaData Información de metadata de la clase (baseclass, timestamp, scale) - *-- BaseClass Clase de base de la clase - *-- TimeStamp Timestamp de la clase - *-- Scale Scale de la clase (pixels, foxels) - *-- Definicion La definición de la clase (ej: "AS Custom OF LIBRERIA.VCX") - *-- Inicio/Fin Línea de inicio/fin de la clase (DEFINE CLASS/ENDDEFINE) - *-- Ini_Cab/Fin_Cab Línea de inicio/fin de la cabecera (def.propiedades, Hidden, Protected, #Include, CLASSDATA, DEFINED_PAM) - *-- Ini_Cuerpo/Fin_Cuerpo Línea de inicio/fin del cuerpo (ADD OBJECTs y PROCEDURES) - *-- HiddenProps Propiedades definidas como HIDDEN (ocultas) - *-- ProtectedProps Propiedades definidas como PROTECTED (protegidas) - *-- Defined_PAM Propiedades, eventos o métodos definidos por el usuario - *-- IncludeFile Nombre del archivo de inclusión - *-- Props_Count Cantidad de propiedades de la clase definicas en el array props[] - *-- Props[1,2] Array con todas las propiedades de la clase y sus valores. (col.1=Nombre, col.2=Comentario) - *-- AddObject_Count Cantidad de objetos definidos en el array addobjects[] - *-- AddObjects[1] Array con las posiciones de los addobjects, definicion y propiedades - *-- Nombre Nombre del objeto - *-- ObjName Nombre del objeto - *-- Parent Nombre del objeto Padre - *-- Clase Clase del objeto - *-- ClassLib Librería de clases de la que deriva la clase - *-- Baseclass Clase de base del objeto - *-- Uniqueid ID único - *-- Ole Información campo ole - *-- Ole2 Información campo ole2 - *-- ZOrder Orden Z del objeto - *-- Props_Count Cantidad de propiedades del objeto - *-- Props[1] Array con todas las propiedades del objeto y sus valores - *-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] - *-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios - *-- Nombre Nombre del procedure - *-- ProcType Tipo de procedimiento (normal, hidden, protected) - *-- Comentario Comentario el procedure - *-- ProcLine_Count Cantidad de líneas del procedimiento - *-- ProcLines[1] Líneas del procedimiento - *-- Procedure_count Cantidad de procedimientos definidos en el array procedures[] - *-- Procedures[1] Array con las posiciones de los procedures, definicion y comentarios - *-- Nombre Nombre del procedure - *-- ProcType Tipo de procedimiento (normal, hidden, protected) - *-- Comentario Comentario el procedure - *-- ProcLine_Count Cantidad de líneas del procedimiento - *-- ProcLines[1] Líneas del procedimiento - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toModulo AS CL_CLASSLIB OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL lcObjName, lnCodError, I, X, loEx AS EXCEPTION ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - - WITH THIS AS c_conversor_prg_a_scx OF 'FOXBIN2PRG.PRG' - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE - - *-- Creo el registro de cabecera - .createForm_RecordHeader( toModulo ) - - *-- El SCX tiene el INCLUDE en el primer registro - IF NOT EMPTY(toModulo._includeFile) - REPLACE RESERVED8 WITH toModulo._includeFile - ENDIF - - - *-- Recorro las CLASES - FOR X = 1 TO 2 - FOR I = 1 TO toModulo._Clases_Count - loClase = NULL - loClase = toModulo._Clases(m.I) - - *-- El dataenvironment debe estar primero, luego lo demás. - IF m.X = 1 AND NOT loClase._BaseClass == 'dataenvironment' ; - OR m.X = 2 AND loClase._BaseClass == 'dataenvironment' - LOOP - ENDIF - - IF EMPTY(loClase._TimeStamp) - loClase._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loClase._UniqueID) - loClase._UniqueID = toFoxBin2Prg.unique_ID() - ENDIF - - *-- Inserto la clase - INSERT INTO TABLABIN ; - ( PLATFORM ; - , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; - , CLASSLOC ; - , BASECLASS ; - , OBJNAME ; - , PARENT ; - , PROPERTIES ; - , PROTECTED ; - , METHODS ; - , OLE ; - , OLE2 ; - , RESERVED1 ; - , RESERVED2 ; - , RESERVED3 ; - , RESERVED4 ; - , RESERVED5 ; - , RESERVED6 ; - , RESERVED7 ; - , RESERVED8 ; - , USER) ; - VALUES ; - ( 'WINDOWS' ; - , loClase._UniqueID ; - , loClase._TimeStamp ; - , loClase._Class ; - , loClase._ClassLoc ; - , loClase._BaseClass ; - , loClase._ObjName ; - , loClase._Parent ; - , loClase._PROPERTIES ; - , loClase._PROTECTED ; - , loClase._METHODS ; - , loClase._Ole ; - , loClase._Ole2 ; - , loClase._RESERVED1 ; - , loClase._RESERVED2 ; - , loClase._RESERVED3 ; - , loClase._ClassIcon ; - , loClase._ProjectClassIcon ; - , loClase._Scale ; - , loClase._Comentario ; - , loClase._includeFile ; - , loClase._User ) - - - .insert_AllObjects( @loClase, @toFoxBin2Prg ) - - ENDFOR && I = 1 TO toModulo._Clases_Count - ENDFOR && m.X = 1 TO 2 - - *-- Inserto el COMMENT final - INSERT INTO TABLABIN ; - ( PLATFORM ; - , UNIQUEID ; - , TIMESTAMP ; - , CLASS ; - , CLASSLOC ; - , BASECLASS ; - , OBJNAME ; - , PARENT ; - , PROPERTIES ; - , PROTECTED ; - , METHODS ; - , OLE ; - , OLE2 ; - , RESERVED1 ; - , RESERVED2 ; - , RESERVED3 ; - , RESERVED4 ; - , RESERVED5 ; - , RESERVED6 ; - , RESERVED7 ; - , RESERVED8 ; - , USER) ; - VALUES ; - ( 'COMMENT' ; - , 'RESERVED' ; - , 0 ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ; - , '' ) - - USE IN (SELECT("TABLABIN")) - - IF toFoxBin2Prg.l_Recompile - toFoxBin2Prg.compileFoxProBinary() - ENDIF - - toFoxBin2Prg.updateProcessedFile() - ENDWITH && THIS - - - CATCH TO loEx - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - STORE NULL TO loClase, loEx - RELEASE lcObjName, lnCodError, I, X, loClase - ENDTRY - - RETURN - - ENDPROC -ENDDEFINE - - - - -DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - #ENDIF - _MEMBERDATA = [] ; + Endfor && I = 1 TO toModulo._Clases_Count + Endfor && m.X = 1 TO 2 + +*-- Inserto el COMMENT final + Insert Into TABLABIN ; + ( PLATFORM ; + , UNIQUEID ; + , Timestamp ; + , Class ; + , CLASSLOC ; + , BaseClass ; + , OBJNAME ; + , Parent ; + , PROPERTIES ; + , Protected ; + , METHODS ; + , OLE ; + , OLE2 ; + , RESERVED1 ; + , RESERVED2 ; + , RESERVED3 ; + , RESERVED4 ; + , RESERVED5 ; + , RESERVED6 ; + , RESERVED7 ; + , RESERVED8 ; + , User) ; + VALUES ; + ( 'COMMENT' ; + , 'RESERVED' ; + , 0 ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ; + , '' ) + + Use In (Select("TABLABIN")) + + If toFoxBin2Prg.l_Recompile + toFoxBin2Prg.compileFoxProBinary() + Endif + + toFoxBin2Prg.updateProcessedFile() + Endwith && THIS + + + Catch To loEx + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Store Null To loClase, loEx + Release lcObjName, lnCodError, I, X, loClase + Endtry + + Return + + Endproc +Enddefine + + + + +Define Class c_conversor_prg_a_pjx As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + #Endif + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -11325,844 +11337,844 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toProject (!@ OUT) Objeto generado de clase CL_PROJECT con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toProject, toEx AS EXCEPTION, toFoxBin2Prg - DODEFAULT( @toProject, @toEx, @toFoxBin2Prg ) - - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I, lnIDInputFile - - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodeLines - STORE NULL TO toModulo - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF - - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - - *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - *.identifyExclusionBlocks( @laCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) - - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toProject, @toFoxBin2Prg ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE - - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF - - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .updateProgressbar( 'Generating Binary...', 2, 2, 1 ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - .createProject() - .writeBinaryFile( @toProject, @toFoxBin2Prg ) - ENDWITH && THIS - - - CATCH TO toEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - RELEASE laCodeLines, lnCodeLines, laLineasExclusion, lnBloquesExclusion, I - ENDTRY - - RETURN - ENDPROC - - - - PROCEDURE writeBinaryFile - LPARAMETERS toProject, toFoxBin2Prg - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL lnCodError, lcMainProg, loEx AS EXCEPTION ; - , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ; - , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' - - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - STORE NULL TO loFile, loServerHead - toProject._HomeDir = CHRTRAN( toProject._HomeDir, ['], [] ) - toProject._SccData = CHR(3) + CHR(0) + CHR(1) + REPLICATE( CHR(0), 651 ) - - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE - - *-- Creo solo el registro de cabecera del proyecto - .createProject_RecordHeader( toProject ) - - lcMainProg = '' - - IF NOT EMPTY(toProject._MainProg) - lcMainProg = LOWER( SYS(2014, toProject._MainProg, ADDBS(toProject._HomeDir) ) ) - ENDIF - - IF EMPTY(toProject._TimeStamp) - toProject._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(toProject._ID) - toProject._ID = toFoxBin2Prg.unique_ID('N') - ENDIF - - *-- Si hay ProjectHook de proyecto, lo inserto - IF NOT EMPTY(toProject._ProjectHookLibrary) - INSERT INTO TABLABIN ; - ( NAME ; - , TYPE ; - , EXCLUDE ; - , KEY ; - , RESERVED1 ) ; - VALUES ; - ( toProject._ProjectHookLibrary + CHR(0) ; - , 'W' ; - , .T. ; - , UPPER(JUSTSTEM(toProject._ProjectHookLibrary)) ; - , toProject._ProjectHookClass + CHR(0) ) - ENDIF - - *-- Si hay ICONO de proyecto, lo inserto - IF NOT EMPTY(toProject._Icon) - INSERT INTO TABLABIN ; - ( NAME ; - , TYPE ; - , LOCAL ; - , KEY ) ; - VALUES ; - ( SYS(2014, toProject._Icon, ADDBS(JUSTPATH(ADDBS(toProject._HomeDir)))) + CHR(0) ; - , 'i' ; - , .T. ; - , UPPER(JUSTSTEM(toProject._Icon)) ) - ENDIF - - *-- Agrego los ARCHIVOS - FOR EACH loFile IN toProject FOXOBJECT - - IF EMPTY(loFile._TimeStamp) - loFile._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loFile._ID) - loFile._ID = toFoxBin2Prg.unique_ID('N') - ENDIF - - INSERT INTO TABLABIN ; - ( NAME ; - , TYPE ; - , EXCLUDE ; - , MAINPROG ; - , COMMENTS ; - , LOCAL ; - , CPID ; - , ID ; - , TIMESTAMP ; - , OBJREV ; - , USER ; - , DEVINFO ; - , KEY ) ; - VALUES ; - ( loFile._Name + CHR(0) ; - , .fileTypeCode(JUSTEXT(loFile._Name), loFile._Type) ; - , loFile._Exclude ; - , (loFile._Name == lcMainProg) ; - , loFile._Comments ; - , .T. ; - , loFile._CPID ; - , loFile._ID ; - , loFile._TimeStamp ; - , loFile._ObjRev ; - , STRCONV(loFile._User,14) ; - , STRCONV(loFile._DevInfo,14) ; - , UPPER(JUSTSTEM(loFile._Name)) ) - ENDFOR - - USE IN (SELECT("TABLABIN")) - toFoxBin2Prg.updateProcessedFile() - ENDWITH && THIS - - - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - STORE NULL TO loFile, loServerHead - RELEASE loFile, loServerHead - - ENDTRY - - RETURN lnCodError - ENDPROC - - - - PROCEDURE identifyCodeBlocks - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toProject, toFoxBin2Prg - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (@! IN ) El array con las líneas del código donde buscar - * tnCodeLines (@! IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión - * toProject (@? OUT) Objeto con toda la información del proyecto analizado - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - * - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY taCodeLines, taLineasExclusion - - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL I, lc_Comentario, lcLine, llBuildProj_Completed, llDevInfo_Completed ; - , llServerHead_Completed, llFileComments_Completed, llFoxBin2Prg_Completed ; - , llExcludedFiles_Completed, llTextFiles_Completed, llProjectProperties_Completed - - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - STORE 0 TO I - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) - - IF tnCodeLines > 1 - toProject = CREATEOBJECT('CL_PROJECT') - *toProject._HomeDir = ADDBS(JUSTPATH(.c_OutputFile)) - - FOR I = 1 TO tnCodeLines - .set_Line( @lcLine, @taCodeLines, m.I ) - - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios - LOOP - - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. - - CASE NOT llDevInfo_Completed AND .analyzeCodeBlock_DevInfo( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llDevInfo_Completed = .T. - - CASE NOT llServerHead_Completed AND .analyzeCodeBlock_ServerHead( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llServerHead_Completed = .T. - - CASE .analyzeCodeBlock_ServerData( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - *-- Puede haber varios servidores, por eso se siguen valuando - - CASE NOT llBuildProj_Completed AND .analyzeCodeBlock_BuildProj( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines, @toFoxBin2Prg ) - llBuildProj_Completed = .T. - - CASE NOT llFileComments_Completed AND .analyzeCodeBlock_FileComments( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFileComments_Completed = .T. - - CASE NOT llExcludedFiles_Completed AND .analyzeCodeBlock_ExcludedFiles( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llExcludedFiles_Completed = .T. - - CASE NOT llTextFiles_Completed AND .analyzeCodeBlock_TextFiles( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llTextFiles_Completed = .T. - - CASE NOT llProjectProperties_Completed AND .analyzeCodeBlock_ProjectProperties( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llProjectProperties_Completed = .T. + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toProject (!@ OUT) Objeto generado de clase CL_PROJECT con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toProject, toEx As Exception, toFoxBin2Prg + DoDefault( @toProject, @toEx, @toFoxBin2Prg ) + + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I, lnIDInputFile + + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + Store 0 To lnCodeLines + Store Null To toModulo + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif + + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + +*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF +*.identifyExclusionBlocks( @laCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) + +*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase + .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toProject, @toFoxBin2Prg ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase + + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif + + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .updateProgressbar( 'Generating Binary...', 2, 2, 1 ) + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + .createProject() + .writeBinaryFile( @toProject, @toFoxBin2Prg ) + Endwith && THIS + + + Catch To toEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Release laCodeLines, lnCodeLines, laLineasExclusion, lnBloquesExclusion, I + Endtry + + Return + Endproc + + + + Procedure writeBinaryFile + Lparameters toProject, toFoxBin2Prg +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local lnCodError, lcMainProg, loEx As Exception ; + , loServerHead As CL_PROJ_SRV_HEAD Of 'FOXBIN2PRG.PRG' ; + , loFile As CL_PROJ_FILE Of 'FOXBIN2PRG.PRG' + + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + Store Null To loFile, loServerHead + toProject._HomeDir = Chrtran( toProject._HomeDir, ['], [] ) + toProject._SccData = Chr(3) + Chr(0) + Chr(1) + Replicate( Chr(0), 651 ) + +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase + +*-- Creo solo el registro de cabecera del proyecto + .createProject_RecordHeader( toProject ) + + lcMainProg = '' + + If Not Empty(toProject._MainProg) + lcMainProg = Lower( Sys(2014, toProject._MainProg, Addbs(toProject._HomeDir) ) ) + Endif + + If Empty(toProject._TimeStamp) + toProject._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + Endif + If Empty(toProject._ID) + toProject._ID = toFoxBin2Prg.unique_ID('N') + Endif + +*-- Si hay ProjectHook de proyecto, lo inserto + If Not Empty(toProject._ProjectHookLibrary) + Insert Into TABLABIN ; + ( Name ; + , Type ; + , EXCLUDE ; + , Key ; + , RESERVED1 ) ; + VALUES ; + ( toProject._ProjectHookLibrary + Chr(0) ; + , 'W' ; + , .T. ; + , Upper(Juststem(toProject._ProjectHookLibrary)) ; + , toProject._ProjectHookClass + Chr(0) ) + Endif + +*-- Si hay ICONO de proyecto, lo inserto + If Not Empty(toProject._Icon) + Insert Into TABLABIN ; + ( Name ; + , Type ; + , Local ; + , Key ) ; + VALUES ; + ( Sys(2014, toProject._Icon, Addbs(Justpath(Addbs(toProject._HomeDir)))) + Chr(0) ; + , 'i' ; + , .T. ; + , Upper(Juststem(toProject._Icon)) ) + Endif + +*-- Agrego los ARCHIVOS + For Each loFile In toProject FoxObject + + If Empty(loFile._TimeStamp) + loFile._TimeStamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + Endif + If Empty(loFile._ID) + loFile._ID = toFoxBin2Prg.unique_ID('N') + Endif + + Insert Into TABLABIN ; + ( Name ; + , Type ; + , EXCLUDE ; + , MAINPROG ; + , COMMENTS ; + , Local ; + , CPID ; + , Id ; + , Timestamp ; + , OBJREV ; + , User ; + , DEVINFO ; + , Key ) ; + VALUES ; + ( loFile._Name + Chr(0) ; + , .fileTypeCode(Justext(loFile._Name), loFile._Type) ; + , loFile._Exclude ; + , (loFile._Name == lcMainProg) ; + , loFile._Comments ; + , .T. ; + , loFile._CPID ; + , loFile._ID ; + , loFile._TimeStamp ; + , loFile._ObjRev ; + , Strconv(loFile._User,14) ; + , Strconv(loFile._DevInfo,14) ; + , Upper(Juststem(loFile._Name)) ) + Endfor + + Use In (Select("TABLABIN")) + toFoxBin2Prg.updateProcessedFile() + Endwith && THIS + + + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Store Null To loFile, loServerHead + Release loFile, loServerHead + + Endtry + + Return lnCodError + Endproc + + + + Procedure identifyCodeBlocks + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toProject, toFoxBin2Prg +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (@! IN ) El array con las líneas del código donde buscar +* tnCodeLines (@! IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión +* toProject (@? OUT) Objeto con toda la información del proyecto analizado +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +* +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + External Array taCodeLines, taLineasExclusion + + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local I, lc_Comentario, lcLine, llBuildProj_Completed, llDevInfo_Completed ; + , llServerHead_Completed, llFileComments_Completed, llFoxBin2Prg_Completed ; + , llExcludedFiles_Completed, llTextFiles_Completed, llProjectProperties_Completed + + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + Store 0 To I + .c_Type = Upper(Justext(.c_OutputFile)) + + If tnCodeLines > 1 + toProject = Createobject('CL_PROJECT') +*toProject._HomeDir = ADDBS(JUSTPATH(.c_OutputFile)) + + For I = 1 To tnCodeLines + .set_Line( @lcLine, @taCodeLines, m.I ) + + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + Loop + + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. + + Case Not llDevInfo_Completed And .analyzeCodeBlock_DevInfo( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llDevInfo_Completed = .T. + + Case Not llServerHead_Completed And .analyzeCodeBlock_ServerHead( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llServerHead_Completed = .T. + + Case .analyzeCodeBlock_ServerData( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) +*-- Puede haber varios servidores, por eso se siguen valuando + + Case Not llBuildProj_Completed And .analyzeCodeBlock_BuildProj( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines, @toFoxBin2Prg ) + llBuildProj_Completed = .T. + + Case Not llFileComments_Completed And .analyzeCodeBlock_FileComments( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFileComments_Completed = .T. + + Case Not llExcludedFiles_Completed And .analyzeCodeBlock_ExcludedFiles( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llExcludedFiles_Completed = .T. + + Case Not llTextFiles_Completed And .analyzeCodeBlock_TextFiles( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llTextFiles_Completed = .T. + + Case Not llProjectProperties_Completed And .analyzeCodeBlock_ProjectProperties( toProject, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llProjectProperties_Completed = .T. - ENDCASE + Endcase - ENDFOR - ENDIF - ENDWITH && THIS + Endfor + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toProject ; - , I, lc_Comentario, lcLine, llBuildProj_Completed, llDevInfo_Completed ; - , llServerHead_Completed, llFileComments_Completed, llFoxBin2Prg_Completed ; - , llExcludedFiles_Completed, llTextFiles_Completed, llProjectProperties_Completed - ENDTRY + Finally + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toProject ; + , I, lc_Comentario, lcLine, llBuildProj_Completed, llDevInfo_Completed ; + , llServerHead_Completed, llFileComments_Completed, llFoxBin2Prg_Completed ; + , llExcludedFiles_Completed, llTextFiles_Completed, llProjectProperties_Completed + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE analyzeCodeBlock_BuildProj - *-------------------------------------------------------------------------------------------------------------- - * Analiza el bloque - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toProject (@? OUT) Objeto con toda la información del proyecto analizado - * tcLine (@! IN ) Línea de datos en evaluación - * taCodeLines (@! IN ) El array con las líneas del código donde buscar - * tnCodeLines (@! IN ) Cantidad de líneas de código - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines, toFoxBin2Prg + Procedure analyzeCodeBlock_BuildProj +*-------------------------------------------------------------------------------------------------------------- +* Analiza el bloque +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toProject (@? OUT) Objeto con toda la información del proyecto analizado +* tcLine (@! IN ) Línea de datos en evaluación +* taCodeLines (@! IN ) El array con las líneas del código donde buscar +* tnCodeLines (@! IN ) Cantidad de líneas de código +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines, toFoxBin2Prg - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcComment, lcMetadatos, luValor ; - , laPropsAndValues(1,2), lnPropsAndValues_Count ; - , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' + Try + Local llBloqueEncontrado, lcComment, lcMetadatos, luValor ; + , laPropsAndValues(1,2), lnPropsAndValues_Count ; + , loFile As CL_PROJ_FILE Of 'FOXBIN2PRG.PRG' - IF LEFT( tcLine, LEN(C_BUILDPROJ_I) ) == C_BUILDPROJ_I - llBloqueEncontrado = .T. + If Left( tcLine, Len(C_BUILDPROJ_I) ) == C_BUILDPROJ_I + llBloqueEncontrado = .T. - WITH THIS - FOR I = m.I + 1 TO tnCodeLines - lcComment = '' - .set_Line( @tcLine, @taCodeLines, m.I ) + With This + For I = m.I + 1 To tnCodeLines + lcComment = '' + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE LEFT( tcLine, LEN(C_BUILDPROJ_F) ) == C_BUILDPROJ_F - I = m.I + 1 - EXIT + Do Case + Case Left( tcLine, Len(C_BUILDPROJ_F) ) == C_BUILDPROJ_F + I = m.I + 1 + Exit - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) - LOOP && Saltear comentarios + Case .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) + Loop && Saltear comentarios - CASE UPPER( LEFT( tcLine, 14 ) ) == 'BUILD PROJECT ' - LOOP + Case Upper( Left( tcLine, 14 ) ) == 'BUILD PROJECT ' + Loop - CASE UPPER( LEFT( tcLine, 5 ) ) == '.ADD(' - * loFile: NAME,TYPE,EXCLUDE,COMMENTS - tcLine = CHRTRAN( tcLine, ["] + '[]', "'''" ) && Convierto "[] en ' - STORE NULL TO loFile - loFile = CREATEOBJECT('CL_PROJ_FILE') - loFile._Name = ALLTRIM( STREXTRACT( tcLine, ['], ['] ) ) + Case Upper( Left( tcLine, 5 ) ) == '.ADD(' +* loFile: NAME,TYPE,EXCLUDE,COMMENTS + tcLine = Chrtran( tcLine, ["] + '[]', "'''" ) && Convierto "[] en ' + Store Null To loFile + loFile = Createobject('CL_PROJ_FILE') + loFile._Name = Alltrim( Strextract( tcLine, ['], ['] ) ) - *-- Obtengo metadatos de los comentarios de FileMetadata: - *< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcComment, @laPropsAndValues ; - , @lnPropsAndValues_Count, C_FILE_META_I, C_FILE_META_F ) +*-- Obtengo metadatos de los comentarios de FileMetadata: +*< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> + .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcComment, @laPropsAndValues ; + , @lnPropsAndValues_Count, C_FILE_META_I, C_FILE_META_F ) - loFile._Type = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues ) - loFile._CPID = .get_ValueByName_FromListNamesWithValues( 'CPID', 'I', @laPropsAndValues ) - loFile._TimeStamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues ) - loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues ) - loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues ) - loFile._User = .get_ValueByName_FromListNamesWithValues( 'User', 'C', @laPropsAndValues ) + loFile._Type = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues ) + loFile._CPID = .get_ValueByName_FromListNamesWithValues( 'CPID', 'I', @laPropsAndValues ) + loFile._TimeStamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues ) + loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues ) + loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues ) + loFile._User = .get_ValueByName_FromListNamesWithValues( 'User', 'C', @laPropsAndValues ) - IF toFoxBin2Prg.n_BodyDevInfo = 1 - loFile._DevInfo = .get_ValueByName_FromListNamesWithValues( 'DevInfo', 'C', @laPropsAndValues ) - ENDIF + If toFoxBin2Prg.n_BodyDevInfo = 1 + loFile._DevInfo = .get_ValueByName_FromListNamesWithValues( 'DevInfo', 'C', @laPropsAndValues ) + Endif - toProject.ADD( loFile, loFile._Name ) + toProject.Add( loFile, loFile._Name ) - CASE UPPER( LEFT( tcLine, 10 ) ) == UPPER( '*<.HomeDir' ) - toProject._HomeDir = STREXTRACT( tcLine, "'", "'" ) + Case Upper( Left( tcLine, 10 ) ) == Upper( '*<.HomeDir' ) + toProject._HomeDir = Strextract( tcLine, "'", "'" ) - ENDCASE - ENDFOR - ENDWITH && THIS + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - STORE NULL TO loFile - RELEASE toProject, tcLine, taCodeLines, I, tnCodeLines ; - , lcComment, lcMetadatos, luValor, laPropsAndValues, lnPropsAndValues_Count, loFile - ENDTRY + Finally + Store Null To loFile + Release toProject, tcLine, taCodeLines, I, tnCodeLines ; + , lcComment, lcMetadatos, luValor, laPropsAndValues, lnPropsAndValues_Count, loFile + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_DevInfo - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_DevInfo +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado + Try + Local llBloqueEncontrado - IF LEFT( tcLine, LEN(C_DEVINFO_I) ) == C_DEVINFO_I - llBloqueEncontrado = .T. + If Left( tcLine, Len(C_DEVINFO_I) ) == C_DEVINFO_I + llBloqueEncontrado = .T. - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE LEFT( tcLine, LEN(C_DEVINFO_F) ) == C_DEVINFO_F - I = m.I + 1 - EXIT + Do Case + Case Left( tcLine, Len(C_DEVINFO_F) ) == C_DEVINFO_F + I = m.I + 1 + Exit - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - OTHERWISE - toProject.setParsedProjInfoLine( @tcLine ) - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + toProject.setParsedProjInfoLine( @tcLine ) + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_ServerHead - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_ServerHead +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado ; - , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' + Try + Local llBloqueEncontrado ; + , loServerHead As CL_PROJ_SRV_HEAD Of 'FOXBIN2PRG.PRG' - IF LEFT( tcLine, LEN(C_SRV_HEAD_I) ) == C_SRV_HEAD_I - llBloqueEncontrado = .T. + If Left( tcLine, Len(C_SRV_HEAD_I) ) == C_SRV_HEAD_I + llBloqueEncontrado = .T. - STORE NULL TO loServerHead - loServerHead = toProject._ServerHead + Store Null To loServerHead + loServerHead = toProject._ServerHead - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - CASE LEFT( tcLine, LEN(C_SRV_HEAD_F) ) == C_SRV_HEAD_F - I = m.I + 1 - EXIT + Case Left( tcLine, Len(C_SRV_HEAD_F) ) == C_SRV_HEAD_F + I = m.I + 1 + Exit - OTHERWISE - loServerHead.setParsedHeadInfoLine( @tcLine ) - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + loServerHead.setParsedHeadInfoLine( @tcLine ) + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - STORE NULL TO loServerHead - RELEASE loServerHead + Finally + Store Null To loServerHead + Release loServerHead - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_ServerData - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_ServerData +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado ; - , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ; - , loServerData AS CL_PROJ_SRV_DATA OF 'FOXBIN2PRG.PRG' + Try + Local llBloqueEncontrado ; + , loServerHead As CL_PROJ_SRV_HEAD Of 'FOXBIN2PRG.PRG' ; + , loServerData As CL_PROJ_SRV_DATA Of 'FOXBIN2PRG.PRG' - IF LEFT( tcLine, LEN(C_SRV_DATA_I) ) == C_SRV_DATA_I - llBloqueEncontrado = .T. + If Left( tcLine, Len(C_SRV_DATA_I) ) == C_SRV_DATA_I + llBloqueEncontrado = .T. - STORE NULL TO loServerData, loServerHead - loServerHead = toProject._ServerHead - loServerData = loServerHead.getServerDataObject() + Store Null To loServerData, loServerHead + loServerHead = toProject._ServerHead + loServerData = loServerHead.getServerDataObject() - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - CASE LEFT( tcLine, LEN(C_SRV_DATA_F) ) == C_SRV_DATA_F - I = m.I + 1 - EXIT + Case Left( tcLine, Len(C_SRV_DATA_F) ) == C_SRV_DATA_F + I = m.I + 1 + Exit - OTHERWISE - loServerHead.setParsedInfoLine( loServerData, @tcLine ) - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + loServerHead.setParsedInfoLine( loServerData, @tcLine ) + Endcase + Endfor + Endwith && THIS - loServerHead.add_Server( loServerData ) - I = m.I - 1 - ENDIF + loServerHead.add_Server( loServerData ) + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - STORE NULL TO loServerData, loServerHead - RELEASE loServerHead, loServerData + Finally + Store Null To loServerData, loServerHead + Release loServerHead, loServerData - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_FileComments - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_FileComments +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - EXTERNAL ARRAY toProject + External Array toProject - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcFile, lcComment ; - , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' + Try + Local llBloqueEncontrado, lcFile, lcComment ; + , loFile As CL_PROJ_FILE Of 'FOXBIN2PRG.PRG' - IF LEFT( tcLine, LEN(C_FILE_CMTS_I) ) == C_FILE_CMTS_I - llBloqueEncontrado = .T. - loFile = NULL + If Left( tcLine, Len(C_FILE_CMTS_I) ) == C_FILE_CMTS_I + llBloqueEncontrado = .T. + loFile = Null - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - CASE LEFT( tcLine, LEN(C_FILE_CMTS_F) ) == C_FILE_CMTS_F - I = m.I + 1 - EXIT + Case Left( tcLine, Len(C_FILE_CMTS_F) ) == C_FILE_CMTS_F + I = m.I + 1 + Exit - OTHERWISE - lcFile = LOWER( ALLTRIM( STRTRAN( CHRTRAN( NORMALIZE( STREXTRACT( tcLine, ".ITEM(", ").Description", 1, 1 ) ), ["], [] ), 'lcCurDir+', '', 1, 1, 1) ) ) - lcComment = ALLTRIM( CHRTRAN( STREXTRACT( tcLine, "=", "", 1, 2 ), ['], [] ) ) - loFile = toProject( lcFile ) - loFile._Comments = lcComment - loFile = NULL - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + lcFile = Lower( Alltrim( Strtran( Chrtran( Normalize( Strextract( tcLine, ".ITEM(", ").Description", 1, 1 ) ), ["], [] ), 'lcCurDir+', '', 1, 1, 1) ) ) + lcComment = Alltrim( Chrtran( Strextract( tcLine, "=", "", 1, 2 ), ['], [] ) ) + loFile = toProject( lcFile ) + loFile._Comments = lcComment + loFile = Null + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - loFile = NULL - RELEASE lcFile, lcComment, loFile + Finally + loFile = Null + Release lcFile, lcComment, loFile - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_ExcludedFiles - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_ExcludedFiles +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - EXTERNAL ARRAY toProject + External Array toProject - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcFile, llExclude ; - , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' + Try + Local llBloqueEncontrado, lcFile, llExclude ; + , loFile As CL_PROJ_FILE Of 'FOXBIN2PRG.PRG' - IF LEFT( tcLine, LEN(C_FILE_EXCL_I) ) == C_FILE_EXCL_I - llBloqueEncontrado = .T. - loFile = NULL + If Left( tcLine, Len(C_FILE_EXCL_I) ) == C_FILE_EXCL_I + llBloqueEncontrado = .T. + loFile = Null - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - CASE LEFT( tcLine, LEN(C_FILE_EXCL_F) ) == C_FILE_EXCL_F - I = m.I + 1 - EXIT + Case Left( tcLine, Len(C_FILE_EXCL_F) ) == C_FILE_EXCL_F + I = m.I + 1 + Exit - OTHERWISE - lcFile = LOWER( ALLTRIM( STRTRAN( CHRTRAN( NORMALIZE( STREXTRACT( tcLine, ".ITEM(", ").Exclude", 1, 1 ) ), ["], [] ), 'lcCurDir+', '', 1, 1, 1) ) ) - llExclude = EVALUATE( ALLTRIM( CHRTRAN( STREXTRACT( tcLine, "=", "", 1, 2 ), ['], [] ) ) ) - loFile = toProject( lcFile ) - loFile._Exclude = llExclude - loFile = NULL - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + lcFile = Lower( Alltrim( Strtran( Chrtran( Normalize( Strextract( tcLine, ".ITEM(", ").Exclude", 1, 1 ) ), ["], [] ), 'lcCurDir+', '', 1, 1, 1) ) ) + llExclude = Evaluate( Alltrim( Chrtran( Strextract( tcLine, "=", "", 1, 2 ), ['], [] ) ) ) + loFile = toProject( lcFile ) + loFile._Exclude = llExclude + loFile = Null + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - loFile = NULL - RELEASE lcFile, llExclude, loFile + Finally + loFile = Null + Release lcFile, llExclude, loFile - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_TextFiles - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_TextFiles +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - EXTERNAL ARRAY toProject + External Array toProject - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcFile, lcType ; - , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' + Try + Local llBloqueEncontrado, lcFile, lcType ; + , loFile As CL_PROJ_FILE Of 'FOXBIN2PRG.PRG' - IF LEFT( tcLine, LEN(C_FILE_TXT_I) ) == C_FILE_TXT_I - llBloqueEncontrado = .T. - loFile = NULL + If Left( tcLine, Len(C_FILE_TXT_I) ) == C_FILE_TXT_I + llBloqueEncontrado = .T. + loFile = Null - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - CASE LEFT( tcLine, LEN(C_FILE_TXT_F) ) == C_FILE_TXT_F - I = m.I + 1 - EXIT + Case Left( tcLine, Len(C_FILE_TXT_F) ) == C_FILE_TXT_F + I = m.I + 1 + Exit - OTHERWISE - lcFile = LOWER( ALLTRIM( STRTRAN( CHRTRAN( NORMALIZE( STREXTRACT( tcLine, ".ITEM(", ").Type", 1, 1 ) ), ["], [] ), 'lcCurDir+', '', 1, 1, 1) ) ) - lcType = ALLTRIM( CHRTRAN( STREXTRACT( tcLine, "=", "", 1, 2 ), ['], [] ) ) - loFile = toProject( lcFile ) - loFile._Type = lcType - loFile = NULL - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise + lcFile = Lower( Alltrim( Strtran( Chrtran( Normalize( Strextract( tcLine, ".ITEM(", ").Type", 1, 1 ) ), ["], [] ), 'lcCurDir+', '', 1, 1, 1) ) ) + lcType = Alltrim( Chrtran( Strextract( tcLine, "=", "", 1, 2 ), ['], [] ) ) + loFile = toProject( lcFile ) + loFile._Type = lcType + loFile = Null + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - loFile = NULL - RELEASE lcFile, lcType, loFile + Finally + loFile = Null + Release lcFile, lcType, loFile - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_ProjectProperties - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toProject, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_ProjectProperties +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toProject, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toProject As CL_PROJECT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcLine + Try + Local llBloqueEncontrado, lcLine - IF LEFT( tcLine, LEN(C_PROJPROPS_I) ) == C_PROJPROPS_I - llBloqueEncontrado = .T. + If Left( tcLine, Len(C_PROJPROPS_I) ) == C_PROJPROPS_I + llBloqueEncontrado = .T. - WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' - FOR I = m.I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, m.I ) + With This As c_conversor_prg_a_pjx Of 'FOXBIN2PRG.PRG' + For I = m.I + 1 To tnCodeLines + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - LOOP && Saltear comentarios + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @tcLine ) + Loop && Saltear comentarios - CASE LEFT( tcLine, LEN(C_PROJPROPS_F) ) == C_PROJPROPS_F - I = m.I + 1 - EXIT + Case Left( tcLine, Len(C_PROJPROPS_F) ) == C_PROJPROPS_F + I = m.I + 1 + Exit - CASE LEFT( tcLine ,2 ) == '*<' - *--- Se asigna con EVALUATE() tal cual está en el PJ2, pero quitando el marcador *< /> - lcLine = STUFF( ALLTRIM( STREXTRACT( tcLine, '*<', '/>' ) ), 2, 0, '_' ) - toProject.setParsedProjInfoLine( lcLine ) + Case Left( tcLine ,2 ) == '*<' +*--- Se asigna con EVALUATE() tal cual está en el PJ2, pero quitando el marcador *< /> + lcLine = Stuff( Alltrim( Strextract( tcLine, '*<', '/>' ) ), 2, 0, '_' ) + toProject.setParsedProjInfoLine( lcLine ) - CASE UPPER( LEFT( tcLine, 9 ) ) == '.SETMAIN(' - *-- Cambio "SetMain()" por "_MainProg =" - lcLine = '._MainProg = ' + LOWER( STREXTRACT( ALLTRIM( tcLine), '.SetMain(', ')', 1, 1 ) ) - toProject.setParsedProjInfoLine( lcLine ) + Case Upper( Left( tcLine, 9 ) ) == '.SETMAIN(' +*-- Cambio "SetMain()" por "_MainProg =" + lcLine = '._MainProg = ' + Lower( Strextract( Alltrim( tcLine), '.SetMain(', ')', 1, 1 ) ) + toProject.setParsedProjInfoLine( lcLine ) - OTHERWISE - *--- Se asigna con EVALUATE() tal cual está en el PJ2 - lcLine = STUFF( ALLTRIM( tcLine), 2, 0, '_' ) - toProject.setParsedProjInfoLine( lcLine ) - ENDCASE - ENDFOR - ENDWITH && THIS + Otherwise +*--- Se asigna con EVALUATE() tal cual está en el PJ2 + lcLine = Stuff( Alltrim( tcLine), 2, 0, '_' ) + toProject.setParsedProjInfoLine( lcLine ) + Endcase + Endfor + Endwith && THIS - I = m.I - 1 - ENDIF + I = m.I - 1 + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc -ENDDEFINE +Enddefine -DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' - #ENDIF - _MEMBERDATA = [] ; +Define Class c_conversor_prg_a_frx As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_frx Of 'FOXBIN2PRG.PRG' + #Endif + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -12170,477 +12182,477 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin c_Type = 'FR2' - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toReport (!@ OUT) Objeto generado de clase CL_REPORT con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toReport, toEx AS EXCEPTION, toFoxBin2Prg - DODEFAULT( @toReport, @toEx, @toFoxBin2Prg ) - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL lnCodError, loEx AS EXCEPTION, laCodeLines(1), lnCodeLines ; - , laLineasExclusion(1), lnBloquesExclusion, I, lnIDInputFile - - WITH THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodError, lnCodeLines - STORE NULL TO toReport - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF - - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - - .createReport('CURSOR') - - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toReport ) - USE IN (SELECT('TABLABIN')) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE - - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF - - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .updateProgressbar( 'Generating Binary...', 2, 2, 1 ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - .createReport() - .writeBinaryFile( @toReport, @toFoxBin2Prg ) - ENDWITH && THIS - - - CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - ENDTRY - - RETURN lnCodError - ENDPROC + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toReport (!@ OUT) Objeto generado de clase CL_REPORT con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toReport, toEx As Exception, toFoxBin2Prg + DoDefault( @toReport, @toEx, @toFoxBin2Prg ) + + #If .F. + Local toReport As CL_REPORT Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local lnCodError, loEx As Exception, laCodeLines(1), lnCodeLines ; + , laLineasExclusion(1), lnBloquesExclusion, I, lnIDInputFile + + With This As c_conversor_prg_a_frx Of 'FOXBIN2PRG.PRG' + Store 0 To lnCodError, lnCodeLines + Store Null To toReport + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif + + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + + .createReport('CURSOR') + +*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toReport ) + Use In (Select('TABLABIN')) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase + + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif + + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .updateProgressbar( 'Generating Binary...', 2, 2, 1 ) + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + .createReport() + .writeBinaryFile( @toReport, @toFoxBin2Prg ) + Endwith && THIS + + + Catch To loEx + lnCodError = loEx.ErrorNo + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Endtry + + Return lnCodError + Endproc - PROCEDURE writeBinaryFile - LPARAMETERS toReport, toFoxBin2Prg - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL loReg, I, lcFieldType, lnFieldLen, lnFieldDec, lnNumCampo, laFieldTypes(1,18) ; - , luValor, lnCodError, loEx AS EXCEPTION ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - - loLang = _SCREEN.o_FoxBin2Prg_Lang - SELECT TABLABIN - AFIELDS( laFieldTypes ) - loReg = NULL + Procedure writeBinaryFile + Lparameters toReport, toFoxBin2Prg +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toReport As CL_REPORT Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local loReg, I, lcFieldType, lnFieldLen, lnFieldDec, lnNumCampo, laFieldTypes(1,18) ; + , luValor, lnCodError, loEx As Exception ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + + loLang = _Screen.o_FoxBin2Prg_Lang + Select TABLABIN + Afields( laFieldTypes ) + loReg = Null - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( THIS.c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( This.c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase - *-- Agrego los registros - FOR EACH loReg IN toReport FOXOBJECT +*-- Agrego los registros + For Each loReg In toReport FoxObject - *IF toFoxBin2Prg.l_NoTimestamps - * loReg.TIMESTAMP = 0 - *ENDIF - *IF toFoxBin2Prg.l_ClearUniqueID - * loReg.UNIQUEID = '' - *ENDIF - IF EMPTY(loReg.TIMESTAMP) - loReg.TIMESTAMP = .rowTimeStamp( {^2013/11/04 20:00:00} ) - ENDIF - IF EMPTY(loReg.UNIQUEID) OR ALLTRIM(loReg.UNIQUEID) = '0' - loReg.UNIQUEID = toFoxBin2Prg.unique_ID() - ENDIF +*IF toFoxBin2Prg.l_NoTimestamps +* loReg.TIMESTAMP = 0 +*ENDIF +*IF toFoxBin2Prg.l_ClearUniqueID +* loReg.UNIQUEID = '' +*ENDIF + If Empty(loReg.Timestamp) + loReg.Timestamp = .rowTimeStamp( {^2013/11/04 20:00:00} ) + Endif + If Empty(loReg.UNIQUEID) Or Alltrim(loReg.UNIQUEID) = '0' + loReg.UNIQUEID = toFoxBin2Prg.unique_ID() + Endif - *-- Ajuste de los tipos de dato - FOR I = 1 TO AMEMBERS(laProps, loReg, 0) - lnNumCampo = ASCAN( laFieldTypes, laProps(m.I), 1, -1, 1, 1+2+4+8 ) +*-- Ajuste de los tipos de dato + For I = 1 To Amembers(laProps, loReg, 0) + lnNumCampo = Ascan( laFieldTypes, laProps(m.I), 1, -1, 1, 1+2+4+8 ) - IF lnNumCampo = 0 - *ERROR 'No se encontró el campo [' + laProps(m.I) + '] en la estructura del archivo ' + DBF("TABLABIN") - ERROR (TEXTMERGE(loLang.C_FIELD_NOT_FOUND_ON_FILE_STRUCTURE_LOC)) - ENDIF + If lnNumCampo = 0 +*ERROR 'No se encontró el campo [' + laProps(m.I) + '] en la estructura del archivo ' + DBF("TABLABIN") + Error (Textmerge(loLang.C_FIELD_NOT_FOUND_ON_FILE_STRUCTURE_LOC)) + Endif - lcFieldType = laFieldTypes(lnNumCampo,2) - lnFieldLen = laFieldTypes(lnNumCampo,3) - lnFieldDec = laFieldTypes(lnNumCampo,4) - luValor = EVALUATE('loReg.' + laProps(m.I)) + lcFieldType = laFieldTypes(lnNumCampo,2) + lnFieldLen = laFieldTypes(lnNumCampo,3) + lnFieldDec = laFieldTypes(lnNumCampo,4) + luValor = Evaluate('loReg.' + laProps(m.I)) - DO CASE - CASE INLIST(lcFieldType, 'B') && Double - ADDPROPERTY( loReg, laProps(m.I), CAST( luValor AS &lcFieldType. (lnFieldPrec) ) ) + Do Case + Case Inlist(lcFieldType, 'B') && Double + AddProperty( loReg, laProps(m.I), Cast( luValor As &lcFieldType. (lnFieldPrec) ) ) - CASE INLIST(lcFieldType, 'F', 'N', 'Y') && Float, Numeric, Currency - ADDPROPERTY( loReg, laProps(m.I), CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) ) + Case Inlist(lcFieldType, 'F', 'N', 'Y') && Float, Numeric, Currency + AddProperty( loReg, laProps(m.I), Cast( luValor As &lcFieldType. (lnFieldLen, lnFieldDec) ) ) - CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V', 'C') && Blob, General, Memo, Varbinary, Varchar, Character - ADDPROPERTY( loReg, laProps(m.I), luValor ) + Case Inlist(lcFieldType, 'W', 'G', 'M', 'Q', 'V', 'C') && Blob, General, Memo, Varbinary, Varchar, Character + AddProperty( loReg, laProps(m.I), luValor ) - OTHERWISE && Demás tipos - ADDPROPERTY( loReg, laProps(m.I), CAST( luValor AS &lcFieldType. (lnFieldLen) ) ) + Otherwise && Demás tipos + AddProperty( loReg, laProps(m.I), Cast( luValor As &lcFieldType. (lnFieldLen) ) ) - ENDCASE + Endcase - ENDFOR + Endfor - INSERT INTO TABLABIN FROM NAME loReg - loReg = NULL - ENDFOR + Insert Into TABLABIN From Name loReg + loReg = Null + Endfor - USE IN (SELECT("TABLABIN")) + Use In (Select("TABLABIN")) - IF toFoxBin2Prg.l_Recompile - toFoxBin2Prg.compileFoxProBinary() - ENDIF + If toFoxBin2Prg.l_Recompile + toFoxBin2Prg.compileFoxProBinary() + Endif - toFoxBin2Prg.updateProcessedFile() + toFoxBin2Prg.updateProcessedFile() - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - USE IN (SELECT("TABLABIN")) - loReg = NULL - RELEASE loReg, I, lcFieldType, lnFieldLen, lnFieldDec, lnNumCampo, laFieldTypes, luValor + Finally + Use In (Select("TABLABIN")) + loReg = Null + Release loReg, I, lcFieldType, lnFieldLen, lnFieldDec, lnNumCampo, laFieldTypes, luValor - ENDTRY + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc - PROCEDURE identifyCodeBlocks - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toReport - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@? IN ) Cantidad de bloques de exclusion - * toReport (@? OUT) Objeto con toda la información del reporte analizado - * - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY taCodeLines, taLineasExclusion + Procedure identifyCodeBlocks + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toReport +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (!@ IN ) El array con las líneas del código donde buscar +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@? IN ) Cantidad de bloques de exclusion +* toReport (@? OUT) Objeto con toda la información del reporte analizado +* +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toReport As CL_REPORT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed - STORE 0 TO I + Try + Local I, lc_Comentario, lcLine, llFoxBin2Prg_Completed + Store 0 To I - WITH THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + With This As c_conversor_prg_a_frx Of 'FOXBIN2PRG.PRG' + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 - toReport = NULL - toReport = CREATEOBJECT('CL_REPORT') + If tnCodeLines > 1 + toReport = Null + toReport = Createobject('CL_REPORT') - FOR I = 1 TO tnCodeLines - .set_Line( @lcLine, @taCodeLines, m.I ) + For I = 1 To tnCodeLines + .set_Line( @lcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios - LOOP + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + Loop - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( toReport, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( toReport, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. - CASE .analyzeCodeBlock_Reportes( toReport, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + Case .analyzeCodeBlock_Reportes( toReport, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - ENDCASE - ENDFOR - ENDIF - ENDWITH && THIS + Endcase + Endfor + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - ENDTRY + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE analyzeCodeBlock_CDATA_inline - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName + Procedure analyzeCodeBlock_CDATA_inline +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toReport As CL_REPORT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION + Try + Local llBloqueEncontrado, lcValue, loEx As Exception - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. + If Left(tcLine, 1 + Len(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I + llBloqueEncontrado = .T. - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF + If C_DATA_F $ tcLine + lcValue = Strextract( tcLine, C_DATA_I, C_DATA_F ) + AddProperty( toReg, tcPropName, lcValue ) + Exit + Endif - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) +*-- Tomo la primera parte del valor + lcValue = Strextract( tcLine, C_DATA_I ) - *-- Recorro las fracciones del valor - FOR I = m.I + 1 TO tnCodeLines - tcLine = taCodeLines(m.I) +*-- Recorro las fracciones del valor + For I = m.I + 1 To tnCodeLines + tcLine = taCodeLines(m.I) - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) + If C_DATA_F $ tcLine && Fin del valor + lcValue = lcValue + CR_LF + Strextract( tcLine, '', C_DATA_F ) - *-- Ajustes: En los labels, no se usa CR+LF, sino que se usa solo CR - IF toReg.ObjType = "5" THEN - lcValue = STRTRAN(lcValue, CR_LF, C_CR) - ENDIF +*-- Ajustes: En los labels, no se usa CR+LF, sino que se usa solo CR + If toReg.ObjType = "5" Then + lcValue = Strtran(lcValue, CR_LF, C_CR) + Endif - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT + AddProperty( toReg, tcPropName, lcValue ) + Exit - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR + Else && Otra fracción del valor + lcValue = lcValue + CR_LF + tcLine + Endif + Endfor - ENDIF + Endif - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF + Catch To loEx + If loEx.ErrorNo = 1470 && Incorrect property name. + loEx.UserValue = 'PropName=[' + Transform(tcPropName) + '], Value=[' + Transform(lcValue) + ']' + Endif - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName ; - , lcValue, loEx - ENDTRY + Finally + Release toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName ; + , lcValue, loEx + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_platform - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg + Procedure analyzeCodeBlock_platform +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toReport, tcLine, taCodeLines, I, tnCodeLines, toReg - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toReport As CL_REPORT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, X, lnPos, lnPos2, lcValue, lnLenPropName, laProps(1) + Try + Local llBloqueEncontrado, X, lnPos, lnPos2, lcValue, lnLenPropName, laProps(1) - IF LOWER( LEFT(tcLine, 10) ) == 'platform="' - llBloqueEncontrado = .T. - lnLastPos = 1 - tcLine = ' ' + tcLine + If Lower( Left(tcLine, 10) ) == 'platform="' + llBloqueEncontrado = .T. + lnLastPos = 1 + tcLine = ' ' + tcLine - FOR X = 1 TO AMEMBERS( laProps, toReg, 0 ) - laProps(m.X) = ' ' + laProps(m.X) - lnPos = AT( LOWER(laProps(m.X)) + '="', tcLine ) + For X = 1 To Amembers( laProps, toReg, 0 ) + laProps(m.X) = ' ' + laProps(m.X) + lnPos = At( Lower(laProps(m.X)) + '="', tcLine ) - IF lnPos > 0 - lnLenPropName = LEN(laProps(m.X)) - lnPos2 = AT( '"', SUBSTR( tcLine, lnPos + lnLenPropName + 2 ) ) - lcValue = SUBSTR( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 ) + If lnPos > 0 + lnLenPropName = Len(laProps(m.X)) + lnPos2 = At( '"', Substr( tcLine, lnPos + lnLenPropName + 2 ) ) + lcValue = Substr( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 ) - IF laProps(m.X) == ' NAME' AND NOT EMPTY(lcValue) - lcValue = THIS.denormalizeXMLValue(lcValue) - ENDIF + If laProps(m.X) == ' NAME' And Not Empty(lcValue) + lcValue = This.denormalizeXMLValue(lcValue) + Endif - ADDPROPERTY( toReg, laProps(m.X), lcValue ) - ENDIF - ENDFOR + AddProperty( toReg, laProps(m.X), lcValue ) + Endif + Endfor - ENDIF + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE toReport, tcLine, taCodeLines, I, tnCodeLines, toReg ; - , X, lnPos, lnPos2, lcValue, lnLenPropName, laProps - ENDTRY + Finally + Release toReport, tcLine, taCodeLines, I, tnCodeLines, toReg ; + , X, lnPos, lnPos2, lcValue, lnLenPropName, laProps + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc - PROCEDURE analyzeCodeBlock_Reportes - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines + Procedure analyzeCodeBlock_Reportes +*------------------------------------------------------ +*-- Analiza el bloque +*------------------------------------------------------ + Lparameters toReport, tcLine, taCodeLines, I, tnCodeLines - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toReport As CL_REPORT Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL llBloqueEncontrado, lcComment, lcMetadatos, luValor ; - , laPropsAndValues(1,2), lnPropsAndValues_Count ; - , loReg + Try + Local llBloqueEncontrado, lcComment, lcMetadatos, luValor ; + , laPropsAndValues(1,2), lnPropsAndValues_Count ; + , loReg - IF LEFT( tcLine, LEN(C_TAG_REPORTE) + 1 ) == '<' + C_TAG_REPORTE + '' - llBloqueEncontrado = .T. - loReg = NULL + If Left( tcLine, Len(C_TAG_REPORTE) + 1 ) == '<' + C_TAG_REPORTE + '' + llBloqueEncontrado = .T. + loReg = Null - WITH THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' - SCATTER MEMO BLANK NAME loReg + With This As c_conversor_prg_a_frx Of 'FOXBIN2PRG.PRG' + Scatter Memo Blank Name loReg - FOR I = m.I + 1 TO tnCodeLines - lcComment = '' - .set_Line( @tcLine, @taCodeLines, m.I ) + For I = m.I + 1 To tnCodeLines + lcComment = '' + .set_Line( @tcLine, @taCodeLines, m.I ) - DO CASE - CASE LEFT( tcLine, LEN(C_TAG_REPORTE_F) ) == C_TAG_REPORTE_F - I = m.I + 1 - EXIT + Do Case + Case Left( tcLine, Len(C_TAG_REPORTE_F) ) == C_TAG_REPORTE_F + I = m.I + 1 + Exit - CASE .analyzeCodeBlock_platform( toReport, @tcLine, @taCodeLines, @m.I, @tnCodeLines, @loReg ) + Case .analyzeCodeBlock_platform( toReport, @tcLine, @taCodeLines, @m.I, @tnCodeLines, @loReg ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'picture' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'picture' ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'tag' ) - *-- ARREGLO ALGUNOS VALORES CAMBIADOS AL TEXTUALIZAR - DO CASE - CASE loReg.ObjType == "1" - loReg.TAG = .decode_SpecialCodes_1_31( loReg.TAG ) - CASE INLIST(loReg.ObjType, "25", "26") && Dataenvironment, cursors and relations - loReg.TAG = IIF( EMPTY( CHRTRAN( loReg.TAG, CR_LF+C_TAB, '') ), '', SUBSTR(loReg.TAG,3) ) && Quito el ENTER agregado antes - OTHERWISE - loReg.TAG = .decode_SpecialCodes_1_31( loReg.TAG ) - ENDCASE + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'tag' ) +*-- ARREGLO ALGUNOS VALORES CAMBIADOS AL TEXTUALIZAR + Do Case + Case loReg.ObjType == "1" + loReg.Tag = .decode_SpecialCodes_1_31( loReg.Tag ) + Case Inlist(loReg.ObjType, "25", "26") && Dataenvironment, cursors and relations + loReg.Tag = Iif( Empty( Chrtran( loReg.Tag, CR_LF+C_TAB, '') ), '', Substr(loReg.Tag,3) ) && Quito el ENTER agregado antes + Otherwise + loReg.Tag = .decode_SpecialCodes_1_31( loReg.Tag ) + Endcase - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'tag2' ) - *-- ARREGLO ALGUNOS VALORES CAMBIADOS AL TEXTUALIZAR - IF NOT INLIST(loReg.ObjType,"5","6","8") - loReg.TAG2 = STRCONV( loReg.TAG2,14 ) - ENDIF + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'tag2' ) +*-- ARREGLO ALGUNOS VALORES CAMBIADOS AL TEXTUALIZAR + If Not Inlist(loReg.ObjType,"5","6","8") + loReg.TAG2 = Strconv( loReg.TAG2,14 ) + Endif - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'penred' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'penred' ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'style' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'style' ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'expr' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'expr' ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'supexpr' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'supexpr' ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'comment' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'comment' ) - CASE .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'user' ) + Case .analyzeCodeBlock_CDATA_inline( toReport, @tcLine, @taCodeLines, @m.I, tnCodeLines, @loReg, 'user' ) - ENDCASE + Endcase - ENDFOR - ENDWITH && THIS + Endfor + Endwith && THIS - I = m.I - 1 - toReport.ADD( loReg ) - ENDIF + I = m.I - 1 + toReport.Add( loReg ) + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - loReg = NULL - RELEASE lcComment, lcMetadatos, luValor, laPropsAndValues, lnPropsAndValues_Count, loReg + Finally + loReg = Null + Release lcComment, lcMetadatos, luValor, laPropsAndValues, lnPropsAndValues_Count, loReg - ENDTRY + Endtry - RETURN llBloqueEncontrado - ENDPROC + Return llBloqueEncontrado + Endproc -ENDDEFINE && CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin +Enddefine && CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin -DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' - #ENDIF - _MEMBERDATA = [] ; +Define Class c_conversor_prg_a_dbf As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_dbf Of 'FOXBIN2PRG.PRG' + #Endif + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -12650,429 +12662,432 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin c_Type = 'DB2' - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toTable (!@ OUT) Objeto generado de clase CL_TABLE con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toTable, toEx AS EXCEPTION, toFoxBin2Prg - DODEFAULT( @toTable, @toEx, @toFoxBin2Prg ) + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toTable (!@ OUT) Objeto generado de clase CL_TABLE con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toTable, toEx As Exception, toFoxBin2Prg + DoDefault( @toTable, @toEx, @toFoxBin2Prg ) - #IF .F. - LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toTable As CL_DBF_TABLE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lnCodError, loEx AS EXCEPTION, laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I ; - , lnIDInputFile, lnFileCount, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support, lcAlterTable ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' ; - , lcTempDBC, llImportData ; - , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodError, lnCodeLines + Try + Local lnCodError, loEx As Exception, laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I ; + , lnIDInputFile, lnFileCount, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support, lcAlterTable ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' ; + , lcTempDBC, llImportData ; + , loDBF_CFG As CL_DBF_CFG Of 'FOXBIN2PRG.PRG' + Store 0 To lnCodError, lnCodeLines - WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - loLang = _SCREEN.o_FoxBin2Prg_Lang + With This As c_conversor_prg_a_dbf Of 'FOXBIN2PRG.PRG' + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + loLang = _Screen.o_FoxBin2Prg_Lang - *-- If table CFG exists, use it for DBF-specific configuration. FDBOZZO. 2014/06/15 - lnFileCount = toFoxBin2Prg.get_DBF_Configuration( FORCEEXT(.c_InputFile, 'DBF'), @loDBF_CFG, .T. ) - lcTempDBC = FORCEPATH( '_FB2P', JUSTPATH(.c_OutputFile) ) +*-- If table CFG exists, use it for DBF-specific configuration. FDBOZZO. 2014/06/15 + lnFileCount = toFoxBin2Prg.get_DBF_Configuration( Forceext(.c_InputFile, 'DBF'), @loDBF_CFG, .T. ) + lcTempDBC = Forcepath( '_FB2P', Justpath(.c_OutputFile) ) - DO CASE - CASE lnFileCount = 1 AND loDBF_CFG.DBF_Conversion_Support > 0 AND NOT INLIST(loDBF_CFG.DBF_Conversion_Support, 2, 8) - WITH toFoxBin2Prg - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDWITH + Do Case + Case lnFileCount = 1 And loDBF_CFG.DBF_Conversion_Support > 0 And Not Inlist(loDBF_CFG.DBF_Conversion_Support, 2, 8) + With toFoxBin2Prg + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endwith - CASE lnFileCount = 1 AND loDBF_CFG.DBF_Conversion_Support > 0 && Implica 2 u 8 - llImportData = (loDBF_CFG.DBF_Conversion_Support = 8) + Case lnFileCount = 1 And loDBF_CFG.DBF_Conversion_Support > 0 && Implica 2 u 8 + llImportData = (loDBF_CFG.DBF_Conversion_Support = 8) - CASE toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT) - llImportData = .T. + Case toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT) + llImportData = .T. - CASE toFoxBin2Prg.DBF_Conversion_Support <> 2 - WITH toFoxBin2Prg - ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) - ENDWITH + Case toFoxBin2Prg.DBF_Conversion_Support <> 2 + With toFoxBin2Prg + Error (Textmerge(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) + Endwith - OTHERWISE - * Asume llImportData = .F. + Otherwise +* Asume llImportData = .F. - ENDCASE + Endcase - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - *-- Identifico el inicio/fin de bloque, campos e índices de la tabla - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toTable ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE - - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF +*-- Identifico el inicio/fin de bloque, campos e índices de la tabla + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toTable ) - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .writeBinaryFile_STRUCTURE( @toTable, @toFoxBin2Prg, @lcAlterTable ) + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase - IF llImportData AND lnCodeLines > 1 AND toTable._I > 1 THEN - *-- Identifico los registros de la tabla y los agrego - I = toTable._I - 1 - toTable.analyzeCodeBlock( C_TABLE_I, @laCodeLines, @m.I, lnCodeLines, @toFoxBin2Prg ) - ENDIF + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif - IF NOT EMPTY(lcAlterTable) - EXECSCRIPT(lcAlterTable) - ENDIF - - .writeBinaryFile_INDEXES( @toTable, @toFoxBin2Prg ) - - ENDWITH && THIS - - - CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .writeBinaryFile_STRUCTURE( @toTable, @toFoxBin2Prg, @lcAlterTable ) - THROW + If llImportData And lnCodeLines > 1 And toTable._I > 1 Then +*-- Identifico los registros de la tabla y los agrego + I = toTable._I - 1 + toTable.analyzeCodeBlock( C_TABLE_I, @laCodeLines, @m.I, lnCodeLines, @toFoxBin2Prg ) - FINALLY - USE IN (SELECT("TABLABIN")) - USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + Endif - IF NOT EMPTY(lcTempDBC) - CLOSE DATABASES - ERASE (FORCEEXT(lcTempDBC,'DBC')) - ERASE (FORCEEXT(lcTempDBC,'DCT')) - ERASE (FORCEEXT(lcTempDBC,'DCX')) - ENDIF + If Not Empty(lcAlterTable) + Execscript(lcAlterTable) + Endif + + .writeBinaryFile_INDEXES( @toTable, @toFoxBin2Prg ) + + Endwith && THIS + + + Catch To loEx + lnCodError = loEx.ErrorNo + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - STORE NULL TO loDBF_CFG - RELEASE loDBF_CFG + Throw - ENDTRY + Finally + Use In (Select("TABLABIN")) + Use In (Select(Juststem(This.c_OutputFile))) - RETURN lnCodError - ENDPROC + If Not Empty(lcTempDBC) + Close Databases + Erase (Forceext(lcTempDBC,'DBC')) + Erase (Forceext(lcTempDBC,'DCT')) + Erase (Forceext(lcTempDBC,'DCX')) + Endif + Store Null To loDBF_CFG + Release loDBF_CFG + Endtry - PROCEDURE writeBinaryFile_STRUCTURE - LPARAMETERS toTable, toFoxBin2Prg, tcAlterTable - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + Return lnCodError + Endproc - TRY - LOCAL I, lnCodError, loEx AS EXCEPTION ; - , loField AS CL_DBF_FIELD OF 'FOXBIN2PRG.PRG' ; - , loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' ; - , lcCreateTable, lcLongDec, lcFieldDef, lcIndex, lcTempDBC, lnDataSessionID, lnSelect - - WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' - STORE NULL TO loField, loIndex, loDBFUtils - loDBFUtils = CREATEOBJECT('CL_DBF_UTILS') - STORE 0 TO lnCodError - STORE '' TO lcIndex, lcFieldDef, tcAlterTable - lnDataSessionID = toFoxBin2Prg.DATASESSIONID - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE + Procedure writeBinaryFile_STRUCTURE + Lparameters toTable, toFoxBin2Prg, tcAlterTable +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toTable As CL_DBF_TABLE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - ERASE (FORCEEXT(.c_OutputFile, 'DBF')) - ERASE (FORCEEXT(.c_OutputFile, 'FPT')) - ERASE (FORCEEXT(.c_OutputFile, 'CDX')) + Try + Local I, lnCodError, loEx As Exception ; + , loField As CL_DBF_FIELD Of 'FOXBIN2PRG.PRG' ; + , loDBFUtils As CL_DBF_UTILS Of 'FOXBIN2PRG.PRG' ; + , lcCreateTable, lcLongDec, lcFieldDef, lcIndex, lcTempDBC, lnDataSessionID, lnSelect - IF EMPTY(toTable._Database) - lcCreateTable = 'CREATE TABLE "' + .c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' ;' + CR_LF + ' (' - ELSE - lcTempDBC = FORCEPATH( '_FB2P', JUSTPATH(.c_OutputFile) ) - CREATE DATABASE ( lcTempDBC ) - lcCreateTable = 'CREATE TABLE "' + .c_OutputFile + '" CodePage=' + toTable._CodePage + ' ;' + CR_LF + ' (' - ENDIF + With This As c_conversor_prg_a_dbf Of 'FOXBIN2PRG.PRG' + Store Null To loField, loIndex, loDBFUtils + loDBFUtils = Createobject('CL_DBF_UTILS') - toTable._TableName = .c_OutputFile + Store 0 To lnCodError + Store '' To lcIndex, lcFieldDef, tcAlterTable + lnDataSessionID = toFoxBin2Prg.DataSessionId - *-- Conformo los campos - FOR EACH loField IN toTable._Fields FOXOBJECT - lcLongDec = '' +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - IF NOT EMPTY(lcFieldDef) - lcFieldDef = lcFieldDef + ';' + CR_LF + ', ' - ENDIF + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase - *-- Nombre, Tipo - lcFieldDef = lcFieldDef + '"' + loField._Name + '" ' + loField._Type + Erase (Forceext(.c_OutputFile, 'DBF')) + Erase (Forceext(.c_OutputFile, 'FPT')) + Erase (Forceext(.c_OutputFile, 'CDX')) - *-- Longitud - IF INLIST( loField._Type, 'C', 'N', 'F', 'Q', 'V' ) - lcLongDec = lcLongDec + '(' + loField._Width - ENDIF + If Empty(toTable._Database) + lcCreateTable = 'CREATE TABLE "' + .c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' ;' + CR_LF + ' (' + Else + lcTempDBC = Forcepath( '_FB2P', Justpath(.c_OutputFile) ) + Create Database ( lcTempDBC ) + lcCreateTable = 'CREATE TABLE "' + .c_OutputFile + '" CodePage=' + toTable._CodePage + ' ;' + CR_LF + ' (' + Endif - *-- Decimales - IF INLIST( loField._Type, 'N', 'F' ) AND loField._Decimals > '0' OR loField._Type = 'B' - IF EMPTY(lcLongDec) - lcLongDec = lcLongDec + '(' - ELSE - lcLongDec = lcLongDec + ',' - ENDIF - lcLongDec = lcLongDec + loField._Decimals - ENDIF - - IF NOT EMPTY(lcLongDec) - lcLongDec = lcLongDec + ')' - ENDIF - - lcFieldDef = lcFieldDef + lcLongDec - - *-- Null - lcFieldDef = lcFieldDef + IIF( loField._Null = '.T.', ' NULL', ' NOT NULL' ) - - *-- NoCPTran - IF loField._NoCPTran = '.T.' - lcFieldDef = lcFieldDef + ' NOCPTRANS' - ENDIF - - *-- AutoInc - IF loField._AutoInc_NextVal <> '0' - IF toFoxBin2Prg.n_ExcludeDBFAutoincNextval = 1 - *-- If AutoIncNextVal is excluded from text, then assign 1 for allowing regeneration - *-- of DBF with this field. - tcAlterTable = tcAlterTable + ' ;' + CR_LF + ' ALTER ' + loField._Name + ' ' + loField._Type + ' AUTOINC NEXTVAL 1 STEP ' + loField._AutoInc_Step - ELSE - tcAlterTable = tcAlterTable + ' ;' + CR_LF + ' ALTER ' + loField._Name + ' ' + loField._Type + ' AUTOINC NEXTVAL ' + loField._AutoInc_NextVal + ' STEP ' + loField._AutoInc_Step - ENDIF - ENDIF - - loField = NULL - ENDFOR - - lcCreateTable = lcCreateTable + lcFieldDef + ')' - EXECSCRIPT(lcCreateTable) - - IF NOT EMPTY(tcAlterTable) - tcAlterTable = 'ALTER TABLE "' + .c_OutputFile + '" ' + tcAlterTable - ENDIF - - *-- Hook para permitir ejecución externa (por ejemplo, para rellenar la tabla con datos) - IF NOT EMPTY(toFoxBin2Prg.run_AfterCreateTable) - lnSelect = SELECT() - DO (toFoxBin2Prg.run_AfterCreateTable) WITH (lnDataSessionID), (.c_OutputFile), (toTable) - SET DATASESSION TO (lnDataSessionID) && Por las dudas externamente se cambie - SELECT (lnSelect) - ENDIF + toTable._TableName = .c_OutputFile - ENDWITH && THIS +*-- Conformo los campos + For Each loField In toTable._Fields FoxObject + lcLongDec = '' + If Not Empty(lcFieldDef) + lcFieldDef = lcFieldDef + ';' + CR_LF + ', ' + Endif - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - loEx.USERVALUE = 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ; - + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"' +*-- Nombre, Tipo + lcFieldDef = lcFieldDef + '"' + loField._Name + '" ' + loField._Type - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF +*-- Longitud + If Inlist( loField._Type, 'C', 'N', 'F', 'Q', 'V' ) + lcLongDec = lcLongDec + '(' + loField._Width + Endif - THROW +*-- Decimales + If Inlist( loField._Type, 'N', 'F' ) And loField._Decimals > '0' Or loField._Type = 'B' + If Empty(lcLongDec) + lcLongDec = lcLongDec + '(' + Else + lcLongDec = lcLongDec + ',' + Endif + lcLongDec = lcLongDec + loField._Decimals + Endif + + If Not Empty(lcLongDec) + lcLongDec = lcLongDec + ')' + Endif + + lcFieldDef = lcFieldDef + lcLongDec + +*-- Null + lcFieldDef = lcFieldDef + Iif( loField._Null = '.T.', ' NULL', ' NOT NULL' ) + +*-- NoCPTran + If loField._NoCPTran = '.T.' + lcFieldDef = lcFieldDef + ' NOCPTRANS' + Endif + +*-- AutoInc + If loField._AutoInc_NextVal <> '0' + If toFoxBin2Prg.n_ExcludeDBFAutoincNextval = 1 +*-- If AutoIncNextVal is excluded from text, then assign 1 for allowing regeneration +*-- of DBF with this field. + tcAlterTable = tcAlterTable + ' ;' + CR_LF + ' ALTER ' + loField._Name + ' ' + loField._Type + ' AUTOINC NEXTVAL 1 STEP ' + loField._AutoInc_Step + Else + tcAlterTable = tcAlterTable + ' ;' + CR_LF + ' ALTER ' + loField._Name + ' ' + loField._Type + ' AUTOINC NEXTVAL ' + loField._AutoInc_NextVal + ' STEP ' + loField._AutoInc_Step + Endif + Endif - FINALLY - STORE NULL TO loField, loDBFUtils - RELEASE I, loField, loDBFUtils ; - , lcCreateTable, lcLongDec, lcFieldDef, lcTempDBC, lnDataSessionID, lnSelect + loField = Null + Endfor - ENDTRY + lcCreateTable = lcCreateTable + lcFieldDef + ')' + Execscript(lcCreateTable) + + If Not Empty(tcAlterTable) + tcAlterTable = 'ALTER TABLE "' + .c_OutputFile + '" ' + tcAlterTable + Endif + +*-- Hook para permitir ejecución externa (por ejemplo, para rellenar la tabla con datos) + If Not Empty(toFoxBin2Prg.run_AfterCreateTable) + lnSelect = Select() + Do (toFoxBin2Prg.run_AfterCreateTable) With (lnDataSessionID), (.c_OutputFile), (toTable) + Set DataSession To (lnDataSessionID) && Por las dudas externamente se cambie + Select (lnSelect) + Endif - RETURN lnCodError - ENDPROC + Endwith && THIS + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + loEx.UserValue = 'lcFieldDef="' + Transform(lcFieldDef) + '"' + CR_LF ; + + 'lcCreateTable="' + Transform(lcCreateTable) + '"' - PROCEDURE writeBinaryFile_INDEXES - LPARAMETERS toTable, toFoxBin2Prg - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - TRY - LOCAL I, lnCodError, loEx AS EXCEPTION ; - , loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG' ; - , loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' ; - , ldLastUpdate + Throw - WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' - STORE NULL TO loIndex - STORE 0 TO lnCodError - STORE '' TO lcIndex - loDBFUtils = CREATEOBJECT('CL_DBF_UTILS') + Finally + Store Null To loField, loDBFUtils + Release I, loField, loDBFUtils ; + , lcCreateTable, lcLongDec, lcFieldDef, lcTempDBC, lnDataSessionID, lnSelect - *-- Regenero los índices - FOR EACH loIndex IN toTable._Indexes FOXOBJECT - lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName + Endtry - IF loIndex._TagType = 'BINARY' - lcIndex = lcIndex + ' BINARY' - ELSE - lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"' + Return lnCodError + Endproc - IF NOT EMPTY(loIndex._Filter) - lcIndex = lcIndex + ' FOR ' + loIndex._Filter - ENDIF - lcIndex = lcIndex + ' ' + loIndex._Order - IF NOT INLIST(loIndex._TagType, 'NORMAL', 'REGULAR') - *-- Si es PRIMARY lo cambio a CANDIDATE y luego lo recodifico - lcIndex = lcIndex + ' ' + STRTRAN( loIndex._TagType, 'PRIMARY', 'CANDIDATE' ) - ENDIF - ENDIF + Procedure writeBinaryFile_INDEXES + Lparameters toTable, toFoxBin2Prg +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toTable As CL_DBF_TABLE Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - &lcIndex. - ENDFOR + Try + Local I, lnCodError, loEx As Exception ; + , loIndex As CL_DBF_INDEX Of 'FOXBIN2PRG.PRG' ; + , loDBFUtils As CL_DBF_UTILS Of 'FOXBIN2PRG.PRG' ; + , ldLastUpdate + With This As c_conversor_prg_a_dbf Of 'FOXBIN2PRG.PRG' + Store Null To loIndex + Store 0 To lnCodError + Store '' To lcIndex + loDBFUtils = Createobject('CL_DBF_UTILS') - USE IN (SELECT(JUSTSTEM(.c_OutputFile))) +*-- Regenero los índices + For Each loIndex In toTable._Indexes FoxObject + lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName - *-- La actualización de la fecha sirve para evitar diferencias al regenerar el DBF - IF toFoxBin2Prg.l_ClearDBFLastUpdate THEN - ldLastUpdate = EVALUATE( '{^2013/11/04}' ) - ELSE - ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) - ENDIF + If loIndex._TagType = 'BINARY' + lcIndex = lcIndex + ' BINARY' + Else + lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"' - loDBFUtils.write_DBC_BackLink( .c_OutputFile, toTable._Database, ldLastUpdate ) + If Not Empty(loIndex._Filter) + lcIndex = lcIndex + ' FOR ' + loIndex._Filter + Endif - toFoxBin2Prg.updateProcessedFile() - ENDWITH && THIS + lcIndex = lcIndex + ' ' + loIndex._Order + If Not Inlist(loIndex._TagType, 'NORMAL', 'REGULAR') +*-- Si es PRIMARY lo cambio a CANDIDATE y luego lo recodifico + lcIndex = lcIndex + ' ' + Strtran( loIndex._TagType, 'PRIMARY', 'CANDIDATE' ) + Endif + Endif - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - loEx.USERVALUE = 'lcIndex="' + TRANSFORM(lcIndex) + '"' - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + &lcIndex. + Endfor - THROW - FINALLY - STORE NULL TO loIndex - RELEASE I, loIndex, lcIndex, ldLastUpdate + Use In (Select(Juststem(.c_OutputFile))) - ENDTRY +*-- La actualización de la fecha sirve para evitar diferencias al regenerar el DBF + If toFoxBin2Prg.l_ClearDBFLastUpdate Then + ldLastUpdate = Evaluate( '{^2013/11/04}' ) + Else + ldLastUpdate = Evaluate( '{^' + toTable._LastUpdate + '}' ) + Endif - RETURN lnCodError - ENDPROC + loDBFUtils.write_DBC_BackLink( .c_OutputFile, toTable._Database, ldLastUpdate ) + toFoxBin2Prg.updateProcessedFile() + Endwith && THIS - PROCEDURE identifyCodeBlocks - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@? IN ) Sin uso - * toTable (@? OUT) Objeto con toda la información de la tabla analizada - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + loEx.UserValue = 'lcIndex="' + Transform(lcIndex) + '"' - EXTERNAL ARRAY taCodeLines, taLineasExclusion + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - #IF .F. - LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' - #ENDIF + Throw - TRY - LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed - STORE 0 TO I + Finally + Store Null To loIndex + Release I, loIndex, lcIndex, ldLastUpdate - WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + Endtry - IF tnCodeLines > 1 - toTable = NULL - toTable = CREATEOBJECT('CL_DBF_TABLE') + Return lnCodError + Endproc - FOR I = 1 TO tnCodeLines - .set_Line( @lcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios - LOOP - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( toTable, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. + Procedure identifyCodeBlocks +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (!@ IN ) El array con las líneas del código donde buscar +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@? IN ) Sin uso +* toTable (@? OUT) Objeto con toda la información de la tabla analizada +*-------------------------------------------------------------------------------------------------------------- + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable - CASE NOT llBloqueTable_Completed AND toTable.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llBloqueTable_Completed = .T. - EXIT + External Array taCodeLines, taLineasExclusion - ENDCASE - ENDFOR - ENDIF - ENDWITH && THIS + #If .F. + Local toTable As CL_DBF_TABLE Of 'FOXBIN2PRG.PRG' + #Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Try + Local I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed + Store 0 To I - THROW + With This As c_conversor_prg_a_dbf Of 'FOXBIN2PRG.PRG' + .c_Type = Upper(Justext(.c_OutputFile)) - FINALLY - RELEASE taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable ; - , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed - ENDTRY + If tnCodeLines > 1 + toTable = Null + toTable = Createobject('CL_DBF_TABLE') - RETURN - ENDPROC + For I = 1 To tnCodeLines + .set_Line( @lcLine, @taCodeLines, m.I ) + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + Loop -ENDDEFINE && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( toTable, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. + Case Not llBloqueTable_Completed And toTable.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llBloqueTable_Completed = .T. + Exit -DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_dbc OF 'FOXBIN2PRG.PRG' - #ENDIF - _MEMBERDATA = [] ; + Endcase + Endfor + Endif + Endwith && THIS + + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable ; + , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed + Endtry + + Return + Endproc + + +Enddefine && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin + + +* SF, Analyse, just locate +Define Class c_conversor_prg_a_dbc As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_dbc Of 'FOXBIN2PRG.PRG' + #Endif + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -13085,501 +13100,501 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin c_Type = 'DC2' - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toDatabase (!@ OUT) Objeto generado de clase CL_DBC con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toDatabase, toEx AS EXCEPTION, toFoxBin2Prg - DODEFAULT( @toDatabase, @toEx, @toFoxBin2Prg ) - - #IF .F. - LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lcBaseFilename, lcInputFile ; - , lcMemberType, lcMemberName, lcLastMemberType, lnIDInputFile ; - , laLineasExclusion(1), lnBloquesExclusion, I, X, Y, laFiles(1,5), lnFileCount, lcTempTxt, laLines(1) ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodError, lnCodeLines, lnFileCount - STORE '' TO lcLine, laLines, laCodeLines, lcBaseFilename, lcMemberType, lcLastMemberType, lcMemberName, lcInputFile - STORE NULL TO loReg, toDatabase - - WITH THIS AS c_conversor_prg_a_dbc OF 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - toDatabase = CREATEOBJECT('CL_DBC') - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - C_FB2PRG_CODE = '' - - *-- Quito la última parte del cierre de para anexar lo intermedio - FOR X = 1 TO lnCodeLines - IF C_DATABASE_F $ laCodeLines(m.X) THEN - EXIT - ENDIF - C_FB2PRG_CODE = C_FB2PRG_CODE + laCodeLines(m.X) + CR_LF - ENDFOR - - .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) - .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase, @toFoxBin2Prg ) - - .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) - - *-- Esto crea la máscara de búsqueda "Database.*.*.ext" para encontrar las partes - *-- con la sintaxis "Database.MemberType.MemberName.ext" - lcBaseFilename = JUSTSTEM( JUSTSTEM( JUSTSTEM(.c_InputFile) ) ) - lcInputFile = ADDBS( JUSTPATH(.c_InputFile) ) + lcBaseFilename + '.*.*.' + JUSTEXT(.c_InputFile) - lnFileCount = ADIR( laFiles, lcInputFile, "", 1 ) - - *-- Busco "storedprocedures" y le pongo "z" al inicio - FOR I = 1 TO lnFileCount - IF LOWER( laFiles(m.I,1)) == lcBaseFilename + '.database.storedproceduressource.' + JUSTEXT(.c_InputFile) THEN - laFiles(m.I,1) = lcBaseFilename + '.zdatabase.storedproceduressource.' + JUSTEXT(.c_InputFile) - EXIT - ENDIF - ENDFOR - - ASORT( laFiles, 1, -1, 0, 1) && "zstoredprocedures" quedará al final - - *-- Busco "zstoredprocedures" y le quito la "z" del inicio - FOR I = 1 TO lnFileCount - IF LOWER( laFiles(m.I,1)) == lcBaseFilename + '.zdatabase.storedproceduressource.' + JUSTEXT(.c_InputFile) THEN - laFiles(m.I,1) = lcBaseFilename + '.database.storedproceduressource.' + JUSTEXT(.c_InputFile) - EXIT - ENDIF - ENDFOR - - FOR I = 1 TO lnFileCount - lcInputFile_Class = FORCEPATH( JUSTSTEM( laFiles(m.I,1) ), JUSTPATH( .c_InputFile ) ) + '.' + JUSTEXT( .c_InputFile ) - lcMemberType = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 2, '.' ) ) - lcMemberName = LOWER( GETWORDNUM( JUSTFNAME( lcInputFile_Class ), 3, '.' ) ) - - IF toFoxBin2Prg.l_ProcessFiles THEN - IF NOT lcMemberType == lcLastMemberType THEN - IF NOT EMPTY(lcLastMemberType) THEN - *-- Cambio de tipo de miembro, fin del anterior (connection, table, view, storedprocedures) - DO CASE - CASE lcLastMemberType == 'connection' - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_CONNECTIONS_F + CR_LF - CASE lcLastMemberType == 'table' - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_TABLES_F + CR_LF - CASE lcLastMemberType == 'view' - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_VIEWS_F + CR_LF - CASE lcLastMemberType == 'database' - *C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF - ENDCASE - - lcLastMemberType = '' - ENDIF - - *-- Cambio de tipo de miembro, inicio del actual (connection, table, view, storedprocedures) - DO CASE - CASE lcMemberType == 'connection' - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + C_TAB + C_CONNECTIONS_I + CR_LF - CASE lcMemberType == 'table' - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + C_TAB + C_TABLES_I + CR_LF - CASE lcMemberType == 'view' - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + C_TAB + C_VIEWS_I + CR_LF - CASE lcMemberType == 'database' - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF - ENDCASE - ENDIF - ENDIF - - *-- Verificación de los Miembros, si son Externos y se indicó chequearlos - IF toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) ; - AND ASCAN( toDatabase._ExternalClasses, lcMemberType + '.' + lcMemberName, 1, 0, 1, 1+2+4 ) = 0 - .writeLog( C_TAB + '- ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' ) - .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' ) - LOOP && Salteo este miembro porque no concuerda con los anotados - ENDIF - - .writeLog( C_TAB + C_TAB + '+ ' + loLang.C_INCLUDING_MEMBER_LOC + ' ' + JUSTFNAME( lcInputFile_Class ) ) - - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( lcInputFile_Class, 'I', 'P1', 'E0', 'S1', 'X1' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - IF toFoxBin2Prg.l_ProcessFiles THEN - toFoxBin2Prg.normalizeFileCapitalization( .T., lcInputFile_Class ) - lcTempTxt = FILETOSTR( lcInputFile_Class ) - - FOR Y = 7 TO ALINES( laLines, lcTempTxt ) - C_FB2PRG_CODE = C_FB2PRG_CODE + laLines(m.Y) + CR_LF - ENDFOR - - lcLastMemberType = lcMemberType - ENDIF - ENDFOR - - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF - - IF NOT EMPTY(lcLastMemberType) THEN - *-- Cambio de tipo de miembro, fin del anterior (connection, table, view, storedprocedures) - DO CASE - CASE lcLastMemberType == 'connection' - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_CONNECTIONS_F + CR_LF - CASE lcLastMemberType == 'table' - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_TABLES_F + CR_LF - CASE lcLastMemberType == 'view' - C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_VIEWS_F + CR_LF - CASE lcLastMemberType == 'database' - *C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF - ENDCASE - ENDIF - - *-- Agrego la última parte con el cierre de - FOR X = m.X TO lnCodeLines - C_FB2PRG_CODE = C_FB2PRG_CODE + laCodeLines(m.X) + CR_LF - ENDFOR - - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - ELSE - *-- No es clase por archivo, o no se quiere redireccionar a Main. - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF - - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF - - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) - - .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) - .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase, @toFoxBin2Prg ) - - ENDIF - - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase, @toFoxBin2Prg ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE - - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF - - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .updateProgressbar( 'Generating Binary...', 2, 2, 1 ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - *.createTable() - .writeBinaryFile( @toDatabase, @toFoxBin2Prg ) - ENDWITH && THIS - - - CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - USE IN (SELECT("TABLABIN")) - ENDTRY - - RETURN lnCodError - ENDPROC - - - - PROCEDURE writeBinaryFile - LPARAMETERS toDatabase, toFoxBin2Prg - *-- ----------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL lnCodError, lcEventsFile - lnCodError = 0 - - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( THIS.c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE - - IF NOT EMPTY(toDatabase._DBCEventFilename) - IF LEFT(toDatabase._DBCEventFilename,1) = '.' THEN - lcEventsFile = ADDBS( JUSTPATH(.c_InputFile) ) + toDatabase._DBCEventFilename - ELSE - lcEventsFile = toDatabase._DBCEventFilename - ENDIF - IF FILE(lcEventsFile) THEN - lcEventsFile = '' - ELSE - STRTOFILE( '', lcEventsFile ) - ENDIF + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toDatabase (!@ OUT) Objeto generado de clase CL_DBC con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toDatabase, toEx As Exception, toFoxBin2Prg + DoDefault( @toDatabase, @toEx, @toFoxBin2Prg ) + + #If .F. + Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local lnCodError, loEx As Exception, loReg, lcLine, laCodeLines(1), lnCodeLines, lcBaseFilename, lcInputFile ; + , lcMemberType, lcMemberName, lcLastMemberType, lnIDInputFile ; + , laLineasExclusion(1), lnBloquesExclusion, I, X, Y, laFiles(1,5), lnFileCount, lcTempTxt, laLines(1) ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' + Store 0 To lnCodError, lnCodeLines, lnFileCount + Store '' To lcLine, laLines, laCodeLines, lcBaseFilename, lcMemberType, lcLastMemberType, lcMemberName, lcInputFile + Store Null To loReg, toDatabase + + With This As c_conversor_prg_a_dbc Of 'FOXBIN2PRG.PRG' + loLang = _Screen.o_FoxBin2Prg_Lang + toDatabase = Createobject('CL_DBC') + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + + If toFoxBin2Prg.n_UseClassPerFile > 0 And toFoxBin2Prg.l_RedirectClassPerFileToMain + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + C_FB2PRG_CODE = '' + +*-- Quito la última parte del cierre de para anexar lo intermedio + For X = 1 To lnCodeLines + If C_DATABASE_F $ laCodeLines(m.X) Then + Exit + Endif + C_FB2PRG_CODE = C_FB2PRG_CODE + laCodeLines(m.X) + CR_LF + Endfor + + .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) + .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase, @toFoxBin2Prg ) + + .updateProgressbar( 'Loading Code...', 2, lnCodeLines, 1 ) + +*-- Esto crea la máscara de búsqueda "Database.*.*.ext" para encontrar las partes +*-- con la sintaxis "Database.MemberType.MemberName.ext" + lcBaseFilename = Juststem( Juststem( Juststem(.c_InputFile) ) ) + lcInputFile = Addbs( Justpath(.c_InputFile) ) + lcBaseFilename + '.*.*.' + Justext(.c_InputFile) + lnFileCount = Adir( laFiles, lcInputFile, "", 1 ) + +*-- Busco "storedprocedures" y le pongo "z" al inicio + For I = 1 To lnFileCount + If Lower( laFiles(m.I,1)) == lcBaseFilename + '.database.storedproceduressource.' + Justext(.c_InputFile) Then + laFiles(m.I,1) = lcBaseFilename + '.zdatabase.storedproceduressource.' + Justext(.c_InputFile) + Exit + Endif + Endfor + + Asort( laFiles, 1, -1, 0, 1) && "zstoredprocedures" quedará al final + +*-- Busco "zstoredprocedures" y le quito la "z" del inicio + For I = 1 To lnFileCount + If Lower( laFiles(m.I,1)) == lcBaseFilename + '.zdatabase.storedproceduressource.' + Justext(.c_InputFile) Then + laFiles(m.I,1) = lcBaseFilename + '.database.storedproceduressource.' + Justext(.c_InputFile) + Exit + Endif + Endfor + + For I = 1 To lnFileCount + lcInputFile_Class = Forcepath( Juststem( laFiles(m.I,1) ), Justpath( .c_InputFile ) ) + '.' + Justext( .c_InputFile ) + lcMemberType = Lower( Getwordnum( Justfname( lcInputFile_Class ), 2, '.' ) ) + lcMemberName = Lower( Getwordnum( Justfname( lcInputFile_Class ), 3, '.' ) ) + + If toFoxBin2Prg.l_ProcessFiles Then + If Not lcMemberType == lcLastMemberType Then + If Not Empty(lcLastMemberType) Then +*-- Cambio de tipo de miembro, fin del anterior (connection, table, view, storedprocedures) + Do Case + Case lcLastMemberType == 'connection' + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_CONNECTIONS_F + CR_LF + Case lcLastMemberType == 'table' + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_TABLES_F + CR_LF + Case lcLastMemberType == 'view' + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_VIEWS_F + CR_LF + Case lcLastMemberType == 'database' +*C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + Endcase + + lcLastMemberType = '' + Endif + +*-- Cambio de tipo de miembro, inicio del actual (connection, table, view, storedprocedures) + Do Case + Case lcMemberType == 'connection' + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + C_TAB + C_CONNECTIONS_I + CR_LF + Case lcMemberType == 'table' + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + C_TAB + C_TABLES_I + CR_LF + Case lcMemberType == 'view' + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + C_TAB + C_VIEWS_I + CR_LF + Case lcMemberType == 'database' + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + Endcase + Endif + Endif + +*-- Verificación de los Miembros, si son Externos y se indicó chequearlos + If toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) ; + AND Ascan( toDatabase._ExternalClasses, lcMemberType + '.' + lcMemberName, 1, 0, 1, 1+2+4 ) = 0 + .writeLog( C_TAB + '- ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' ) + .writeErrorLog( C_TAB + '- ' + loLang.C_WARNING_LOC + ' ' + loLang.C_OUTER_MEMBER_DOES_NOT_MATCH_INNER_MEMBERS_LOC + ' [' + lcInputFile_Class + ']' ) + Loop && Salteo este miembro porque no concuerda con los anotados + Endif + + .writeLog( C_TAB + C_TAB + '+ ' + loLang.C_INCLUDING_MEMBER_LOC + ' ' + Justfname( lcInputFile_Class ) ) + +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( lcInputFile_Class, 'I', 'P1', 'E0', 'S1', 'X1' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + If toFoxBin2Prg.l_ProcessFiles Then + toFoxBin2Prg.normalizeFileCapitalization( .T., lcInputFile_Class ) + lcTempTxt = Filetostr( lcInputFile_Class ) + + For Y = 7 To Alines( laLines, lcTempTxt ) + C_FB2PRG_CODE = C_FB2PRG_CODE + laLines(m.Y) + CR_LF + Endfor + + lcLastMemberType = lcMemberType + Endif + Endfor + + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif + + If Not Empty(lcLastMemberType) Then +*-- Cambio de tipo de miembro, fin del anterior (connection, table, view, storedprocedures) + Do Case + Case lcLastMemberType == 'connection' + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_CONNECTIONS_F + CR_LF + Case lcLastMemberType == 'table' + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_TABLES_F + CR_LF + Case lcLastMemberType == 'view' + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + C_VIEWS_F + CR_LF + Case lcLastMemberType == 'database' +*C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + CR_LF + Endcase + Endif + +*-- Agrego la última parte con el cierre de + For X = m.X To lnCodeLines + C_FB2PRG_CODE = C_FB2PRG_CODE + laCodeLines(m.X) + CR_LF + Endfor + + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + Else +*-- No es clase por archivo, o no se quiere redireccionar a Main. + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif + + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif + + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) + + .updateProgressbar( 'Identifying Header Blocks...', 1, lnCodeLines, 1 ) + .identifyHeaderBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase, @toFoxBin2Prg ) + + Endif + +*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase, @toFoxBin2Prg ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase + + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif + + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .updateProgressbar( 'Generating Binary...', 2, 2, 1 ) + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) +*.createTable() + .writeBinaryFile( @toDatabase, @toFoxBin2Prg ) + Endwith && THIS + + + Catch To loEx + lnCodError = loEx.ErrorNo + + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Use In (Select("TABLABIN")) + Endtry + + Return lnCodError + Endproc + + + + Procedure writeBinaryFile + Lparameters toDatabase, toFoxBin2Prg +*-- ----------------------------------------------------------------------------------------------------------- + #If .F. + Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + + Try + Local lnCodError, lcEventsFile + lnCodError = 0 + +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( This.c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) + + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase + + If Not Empty(toDatabase._DBCEventFilename) + If Left(toDatabase._DBCEventFilename,1) = '.' Then + lcEventsFile = Addbs( Justpath(.c_InputFile) ) + toDatabase._DBCEventFilename + Else + lcEventsFile = toDatabase._DBCEventFilename + Endif + If File(lcEventsFile) Then + lcEventsFile = '' + Else + Strtofile( '', lcEventsFile ) + Endif - *-- Si no recompilo el EventFilename.prg, el EXE dará un error (aunque el PRG no) - COMPILE ( ADDBS( JUSTPATH( THIS.c_OutputFile ) ) + toDatabase._DBCEventFilename ) - ENDIF +*-- Si no recompilo el EventFilename.prg, el EXE dará un error (aunque el PRG no) + Compile ( Addbs( Justpath( This.c_OutputFile ) ) + toDatabase._DBCEventFilename ) + Endif - toDatabase.updateDBC( THIS.c_OutputFile ) + toDatabase.updateDBC( This.c_OutputFile ) - IF toFoxBin2Prg.l_Recompile - toFoxBin2Prg.compileFoxProBinary() - ENDIF + If toFoxBin2Prg.l_Recompile + toFoxBin2Prg.compileFoxProBinary() + Endif - toFoxBin2Prg.updateProcessedFile() + toFoxBin2Prg.updateProcessedFile() - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - IF NOT EMPTY(lcEventsFile) THEN - ERASE (lcEventsFile) - ERASE (FORCEEXT(lcEventsFile,'FXP')) - ENDIF + Finally + If Not Empty(lcEventsFile) Then + Erase (lcEventsFile) + Erase (Forceext(lcEventsFile,'FXP')) + Endif - ENDTRY + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc - PROCEDURE identifyHeaderBlocks - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (@! IN ) El array con las líneas del código donde buscar - * tnCodeLines (@! IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión - * toDatabase (@? OUT) Objeto con toda la información del módulo analizado - * toFoxBin2Prg (@? IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase, toFoxBin2Prg + Procedure identifyHeaderBlocks +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (@! IN ) El array con las líneas del código donde buscar +* tnCodeLines (@! IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión +* toDatabase (@? OUT) Objeto con toda la información del módulo analizado +* toFoxBin2Prg (@? IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase, toFoxBin2Prg - EXTERNAL ARRAY taCodeLines, taLineasExclusion + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, loEx AS EXCEPTION ; - , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed, llEXTERNAL_MEMBER_Completed ; - , lc_Comentario, lcProcedureAbierto, lcLine ; - , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + Try + Local I, loEx As Exception ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed, llEXTERNAL_MEMBER_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine ; + , loClase As CL_CLASE Of 'FOXBIN2PRG.PRG' - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - STORE '' TO lcProcedureAbierto + With This As c_conversor_prg_a_bin Of 'FOXBIN2PRG.PRG' + Store '' To lcProcedureAbierto - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 + If tnCodeLines > 1 - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_RedirectClassPerFileToMain - ELSE - llEXTERNAL_MEMBER_Completed = .T. - ENDIF + If toFoxBin2Prg.n_UseClassPerFile > 0 And toFoxBin2Prg.l_RedirectClassPerFileToMain + Else + llEXTERNAL_MEMBER_Completed = .T. + Endif - *-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) - FOR I = 1 TO tnCodeLines - STORE '' TO lc_Comentario - .set_Line( @lcLine, @taCodeLines, m.I ) +*-- Búsqueda del ID de inicio de bloque (DEFINE CLASS / PROCEDURE) + For I = 1 To tnCodeLines + Store '' To lc_Comentario + .set_Line( @lcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - LOOP + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios + Loop - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( @toDatabase, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( @toDatabase, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. - CASE NOT llEXTERNAL_MEMBER_Completed AND .analyzeCodeBlock_EXTERNAL_MEMBER( @toDatabase, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - *-- Puede haber varias clases externas + Case Not llEXTERNAL_MEMBER_Completed And .analyzeCodeBlock_EXTERNAL_MEMBER( @toDatabase, @lcLine, @taCodeLines, @m.I, tnCodeLines ) +*-- Puede haber varias clases externas - ENDCASE + Endcase - ENDFOR + Endfor - ENDIF - ENDWITH && THIS + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - STORE NULL TO loClase - RELEASE taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase, loClase, I ; - , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed ; - , lc_Comentario, lcProcedureAbierto, lcLine - ENDTRY + Finally + Store Null To loClase + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase, loClase, I ; + , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed, llLIBCOMMENT_Completed ; + , lc_Comentario, lcProcedureAbierto, lcLine + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE identifyCodeBlocks - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@? IN ) Sin uso - * toDatabase (@! IN ) Objeto con toda la información de la base de datos analizada - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase, toFoxBin2Prg + Procedure identifyCodeBlocks +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (!@ IN ) El array con las líneas del código donde buscar +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@? IN ) Sin uso +* toDatabase (@! IN ) Objeto con toda la información de la base de datos analizada +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase, toFoxBin2Prg - EXTERNAL ARRAY taCodeLines, taLineasExclusion + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed - STORE 0 TO I + Try + Local I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed + Store 0 To I - WITH THIS AS c_conversor_prg_a_dbc OF 'FOXBIN2PRG.PRG' - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + With This As c_conversor_prg_a_dbc Of 'FOXBIN2PRG.PRG' + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 + If tnCodeLines > 1 - FOR I = 1 TO tnCodeLines - .set_Line( @lcLine, @taCodeLines, m.I ) + For I = 1 To tnCodeLines + .set_Line( @lcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios - LOOP + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + Loop - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( toDatabase, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( toDatabase, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. - CASE NOT llBloqueDatabase_Completed AND toDatabase.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines, @toFoxBin2Prg ) - llBloqueDatabase_Completed = .T. + Case Not llBloqueDatabase_Completed And toDatabase.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines, @toFoxBin2Prg ) + llBloqueDatabase_Completed = .T. - ENDCASE - ENDFOR + Endcase + Endfor - .verify_EXTERNAL_MEMBERS( @toDatabase, @toFoxBin2Prg ) - ENDIF - ENDWITH && THIS + .verify_EXTERNAL_MEMBERS( @toDatabase, @toFoxBin2Prg ) + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase ; - , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed - ENDTRY + Finally + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase ; + , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE verify_EXTERNAL_MEMBERS - *-------------------------------------------------------------------------------- - * Compara los miembros definidos en la cabecera con los miembros encontrados luego - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toDatabase (@! IN ) Objeto con toda la información del módulo analizado - * toFoxBin2Prg (@! IN ) Referencia al objeto principal - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS toDatabase, toFoxBin2Prg + Procedure verify_EXTERNAL_MEMBERS +*-------------------------------------------------------------------------------- +* Compara los miembros definidos en la cabecera con los miembros encontrados luego +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toDatabase (@! IN ) Objeto con toda la información del módulo analizado +* toFoxBin2Prg (@! IN ) Referencia al objeto principal +*-------------------------------------------------------------------------------------------------------------- + Lparameters toDatabase, toFoxBin2Prg - #IF .F. - LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toDatabase As CL_DBC Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - LOCAL lnItem, I, X, lcClaseExterna ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Local lnItem, I, X, lcClaseExterna ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang + loLang = _Screen.o_FoxBin2Prg_Lang - *-- Verificación de los Miembros, si son Externos y se indicó chequearlos - IF toFoxBin2Prg.n_UseClassPerFile > 0 AND toFoxBin2Prg.l_ClassPerFileCheck AND EMPTY(toFoxBin2Prg.c_ClassOperationType) - FOR I = 1 TO toDatabase._ExternalClasses_Count +*-- Verificación de los Miembros, si son Externos y se indicó chequearlos + If toFoxBin2Prg.n_UseClassPerFile > 0 And toFoxBin2Prg.l_ClassPerFileCheck And Empty(toFoxBin2Prg.c_ClassOperationType) + For I = 1 To toDatabase._ExternalClasses_Count lnItem = 0 - FOR X = 1 TO toDatabase._Members_Count - IF LOWER( toDatabase._Members(m.X,1) ) == LOWER( toDatabase._ExternalClasses(m.I,1) ) + For X = 1 To toDatabase._Members_Count + If Lower( toDatabase._Members(m.X,1) ) == Lower( toDatabase._ExternalClasses(m.I,1) ) lnItem = m.X - EXIT - ENDIF - ENDFOR + Exit + Endif + Endfor - IF lnItem = 0 THEN - lcClaseExterna = FORCEPATH( JUSTSTEM(toFoxBin2Prg.c_InputFile) + '.' + toDatabase._ExternalClasses(m.I,1) + '.' + JUSTEXT(toFoxBin2Prg.c_InputFile), JUSTPATH(toFoxBin2Prg.c_InputFile) ) - *ERROR 'No se ha encontrado la clase externa [' + toDatabase._ExternalClasses(m.I,1) + '] en el archivo [' + toFoxBin2Prg.c_InputFile + ']' - ERROR ( loLang.C_EXTERNAL_MEMBER_NAME_WAS_NOT_FOUND_LOC + ' [' + lcClaseExterna + ']' ) - ENDIF + If lnItem = 0 Then + lcClaseExterna = Forcepath( Juststem(toFoxBin2Prg.c_InputFile) + '.' + toDatabase._ExternalClasses(m.I,1) + '.' + Justext(toFoxBin2Prg.c_InputFile), Justpath(toFoxBin2Prg.c_InputFile) ) +*ERROR 'No se ha encontrado la clase externa [' + toDatabase._ExternalClasses(m.I,1) + '] en el archivo [' + toFoxBin2Prg.c_InputFile + ']' + Error ( loLang.C_EXTERNAL_MEMBER_NAME_WAS_NOT_FOUND_LOC + ' [' + lcClaseExterna + ']' ) + Endif toDatabase._Members(lnItem,2) = .T. && Checked - ENDFOR - ENDIF - ENDPROC + Endfor + Endif + Endproc -ENDDEFINE && CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin +Enddefine && CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin -DEFINE CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin - #IF .F. - LOCAL THIS AS c_conversor_prg_a_mnx OF 'FOXBIN2PRG.PRG' - #ENDIF - _MEMBERDATA = [] ; +Define Class c_conversor_prg_a_mnx As c_conversor_prg_a_bin + #If .F. + Local This As c_conversor_prg_a_mnx Of 'FOXBIN2PRG.PRG' + #Endif + _MemberData = [] ; + [] ; + [] ; + [] @@ -13589,208 +13604,208 @@ DEFINE CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin c_MenuLocation = '' - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toMenu (!@ OUT) Objeto generado de clase CL_DBC con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toMenu, toEx AS EXCEPTION, toFoxBin2Prg - DODEFAULT( @toMenu, @toEx, @toFoxBin2Prg ) + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toMenu (!@ OUT) Objeto generado de clase CL_DBC con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toMenu, toEx As Exception, toFoxBin2Prg + DoDefault( @toMenu, @toEx, @toFoxBin2Prg ) - #IF .F. - LOCAL toMenu AS CL_MENU OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toMenu As CL_MENU Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines ; - , laLineasExclusion(1), lnBloquesExclusion, lnIDInputFile - STORE 0 TO lnCodError, lnCodeLines - STORE '' TO lcLine + Try + Local lnCodError, loEx As Exception, loReg, lcLine, laCodeLines(1), lnCodeLines ; + , laLineasExclusion(1), lnBloquesExclusion, lnIDInputFile + Store 0 To lnCodError, lnCodeLines + Store '' To lcLine - WITH THIS AS c_conversor_prg_a_mnx OF 'FOXBIN2PRG.PRG' - lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles + With This As c_conversor_prg_a_mnx Of 'FOXBIN2PRG.PRG' + lnIDInputFile = toFoxBin2Prg.n_ProcessedFiles - IF NOT toFoxBin2Prg.l_ProcessFiles THEN - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - IF toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) THEN - toFoxBin2Prg.updateProcessedFile() - ENDIF + If Not toFoxBin2Prg.l_ProcessFiles Then +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + If toFoxBin2Prg.addProcessedFile( .c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) Then + toFoxBin2Prg.updateProcessedFile() + Endif - EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) - ENDIF + Exit && Si se indicó no procesar, se sale aquí. (Modo de simulación) + Endif - C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) - lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + C_FB2PRG_CODE = Filetostr( .c_InputFile ) + lnCodeLines = Alines( laCodeLines, C_FB2PRG_CODE ) - .createMenu('CURSOR') + .createMenu('CURSOR') - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) - .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toMenu ) - USE IN (SELECT('TABLABIN')) +*-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + .updateProgressbar( 'Identifying Code Blocks...', 1, 2, 1 ) + .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toMenu ) + Use In (Select('TABLABIN')) - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' - ERROR 'InputFile Error Simulation' - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' - .writeErrorLog( '*** SIMULATED ERROR' ) - ENDCASE + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I1' + Error 'InputFile Error Simulation' + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_I0' + .writeErrorLog( '*** SIMULATED ERROR' ) + Endcase - IF .l_Error - .writeLog( '*** ERRORS found - Generation Cancelled' ) - EXIT - ENDIF + If .l_Error + .writeLog( '*** ERRORS found - Generation Cancelled' ) + Exit + Endif - toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .updateProgressbar( 'Generating Binary...', 1, 2, 1 ) - toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - .createMenu() - .writeBinaryFile( @toMenu, @toFoxBin2Prg ) - ENDWITH && THIS + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .updateProgressbar( 'Generating Binary...', 1, 2, 1 ) + toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) + .createMenu() + .writeBinaryFile( @toMenu, @toFoxBin2Prg ) + Endwith && THIS - CATCH TO loEx - lnCodError = loEx.ERRORNO + Catch To loEx + lnCodError = loEx.ErrorNo - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - USE IN (SELECT("TABLABIN")) - ENDTRY + Finally + Use In (Select("TABLABIN")) + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc - PROCEDURE identifyCodeBlocks - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - * tnBloquesExclusion (@? IN ) Sin uso - * toMenu (@? OUT) Objeto con toda la información del menú analizado - * - * NOTA: - * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toMenu + Procedure identifyCodeBlocks +*-------------------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* taCodeLines (!@ IN ) El array con las líneas del código donde buscar +* tnCodeLines (!@ IN ) Cantidad de líneas de código +* taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no +* tnBloquesExclusion (@? IN ) Sin uso +* toMenu (@? OUT) Objeto con toda la información del menú analizado +* +* NOTA: +* Como identificador se usa el nombre de clase o de procedimiento, según corresponda. +*-------------------------------------------------------------------------------------------------------------- + Lparameters taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toMenu - EXTERNAL ARRAY taCodeLines, taLineasExclusion + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toMenu AS CL_MENU OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toMenu As CL_MENU Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueMenu_Completed - STORE 0 TO I + Try + Local I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueMenu_Completed + Store 0 To I - WITH THIS AS c_conversor_prg_a_mnx OF 'FOXBIN2PRG.PRG' - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + With This As c_conversor_prg_a_mnx Of 'FOXBIN2PRG.PRG' + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 - toMenu = NULL - toMenu = CREATEOBJECT('CL_MENU') + If tnCodeLines > 1 + toMenu = Null + toMenu = Createobject('CL_MENU') - FOR I = 1 TO tnCodeLines - .set_Line( @lcLine, @taCodeLines, m.I ) + For I = 1 To tnCodeLines + .set_Line( @lcLine, @taCodeLines, m.I ) - DO CASE - CASE .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios - LOOP + Do Case + Case .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + Loop - CASE NOT llFoxBin2Prg_Completed AND .analyzeCodeBlock_FoxBin2Prg( toMenu, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. + Case Not llFoxBin2Prg_Completed And .analyzeCodeBlock_FoxBin2Prg( toMenu, @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. - CASE NOT llBloqueMenu_Completed AND toMenu.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines, THIS ) - llBloqueMenu_Completed = .T. + Case Not llBloqueMenu_Completed And toMenu.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines, This ) + llBloqueMenu_Completed = .T. - ENDCASE - ENDFOR - ENDIF - ENDWITH && THIS + Endcase + Endfor + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toMenu ; - , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueMenu_Completed - ENDTRY + Finally + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toMenu ; + , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueMenu_Completed + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE writeBinaryFile - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toMenu (!@ OUT) Objeto generado de clase CL_DBC con la información leida del texto - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toMenu, toFoxBin2Prg + Procedure writeBinaryFile +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toMenu (!@ OUT) Objeto generado de clase CL_DBC con la información leida del texto +*--------------------------------------------------------------------------------------------------- + Lparameters toMenu, toFoxBin2Prg - #IF .F. - LOCAL toMenu AS CL_MENU OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toMenu As CL_MENU Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lnCodError - lnCodError = 0 + Try + Local lnCodError + lnCodError = 0 - *-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) - toFoxBin2Prg.addProcessedFile( THIS.c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) +*-- addProcessedFile( tcFile, tcInOutType, tcProcessed, tcHasErrors, tcSupported, tcExpanded ) + toFoxBin2Prg.addProcessedFile( This.c_OutputFile, 'O', 'P1', 'E0', 'S1', 'X0' ) - DO CASE - CASE toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' - ERROR 'OutputFile Error Simulation' - ENDCASE + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase - toMenu.updateMENU( THIS ) + toMenu.updateMENU( This ) - toFoxBin2Prg.updateProcessedFile() + toFoxBin2Prg.updateProcessedFile() - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + Finally + Use In (Select(Juststem(This.c_OutputFile))) - ENDTRY + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc -ENDDEFINE && CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin +Enddefine && CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin -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 +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 - _MEMBERDATA = [] ; + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -13839,1316 +13854,1316 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base + [] - PROCEDURE convert - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto - * toEx (!@ OUT) Objeto con información del error - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toModulo, toEx AS EXCEPTION, toFoxBin2Prg - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF - DODEFAULT( @toModulo, @toEx, @toFoxBin2Prg ) - ENDPROC + Procedure convert +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toModulo (!@ OUT) Objeto generado de clase correspondiente con la información leida del texto +* toEx (!@ OUT) Objeto con información del error +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toModulo, toEx As Exception, toFoxBin2Prg + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif + DoDefault( @toModulo, @toEx, @toFoxBin2Prg ) + Endproc - PROCEDURE classify_PAM_Hidden_Protected - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tnPropsAndValues_Count (@! IN ) - * taPropsAndValues (@! IN ) - * tnProtected_Count (@! IN ) - * taProtected (@! IN ) - * tnPropsAndComments_Count (@! IN ) - * taPropsAndComments (@! IN ) - * tcHiddenProp (@! OUT) Lista de propiedades Hidden - * tcProtectedProp (@! OUT) Lista de propiedades Protected - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tnPropsAndValues_Count, taPropsAndValues, tnProtected_Count, taProtected ; + Procedure classify_PAM_Hidden_Protected +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tnPropsAndValues_Count (@! IN ) +* taPropsAndValues (@! IN ) +* tnProtected_Count (@! IN ) +* taProtected (@! IN ) +* tnPropsAndComments_Count (@! IN ) +* taPropsAndComments (@! IN ) +* tcHiddenProp (@! OUT) Lista de propiedades Hidden +* tcProtectedProp (@! OUT) Lista de propiedades Protected +*--------------------------------------------------------------------------------------------------- + Lparameters tnPropsAndValues_Count, taPropsAndValues, tnProtected_Count, taProtected ; , tnPropsAndComments_Count, taPropsAndComments, tcHiddenProp, tcProtectedProp - IF tnPropsAndValues_Count > 0 THEN - *-- Recorro las propiedades (campo Properties) para ir conformando - *-- las definiciones HIDDEN y PROTECTED - LOCAL lcProp, I + If tnPropsAndValues_Count > 0 Then +*-- Recorro las propiedades (campo Properties) para ir conformando +*-- las definiciones HIDDEN y PROTECTED + Local lcProp, I - STORE '' TO tcHiddenProp, tcProtectedProp + Store '' To tcHiddenProp, tcProtectedProp - FOR I = 1 TO tnProtected_Count - DO CASE - CASE EMPTY( taProtected(m.I) ) - LOOP + For I = 1 To tnProtected_Count + Do Case + Case Empty( taProtected(m.I) ) + Loop - CASE RIGHT( taProtected(m.I), 1 ) == '^' - *-- Hidden Property or method - lcProp = CHRTRAN( taProtected(m.I), '^', '' ) - IF ASCAN(taPropsAndComments, '*' + lcProp, 1, 0, 1, 1+2+4) > 0 - LOOP && method - ENDIF - tcHiddenProp = tcHiddenProp + ',' + lcProp + Case Right( taProtected(m.I), 1 ) == '^' +*-- Hidden Property or method + lcProp = Chrtran( taProtected(m.I), '^', '' ) + If Ascan(taPropsAndComments, '*' + lcProp, 1, 0, 1, 1+2+4) > 0 + Loop && method + Endif + tcHiddenProp = tcHiddenProp + ',' + lcProp - OTHERWISE - *-- Protected Property or method - IF ASCAN(taPropsAndComments, '*' + taProtected(m.I), 1, 0, 1, 1+2+4) > 0 - LOOP && method - ENDIF - tcProtectedProp = tcProtectedProp + ',' + taProtected(m.I) - ENDCASE - ENDFOR + Otherwise +*-- Protected Property or method + If Ascan(taPropsAndComments, '*' + taProtected(m.I), 1, 0, 1, 1+2+4) > 0 + Loop && method + Endif + tcProtectedProp = tcProtectedProp + ',' + taProtected(m.I) + Endcase + Endfor - ENDIF - ENDPROC + Endif + Endproc - PROCEDURE get_ADD_OBJECT_METHODS - LPARAMETERS toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount ; + Procedure get_ADD_OBJECT_METHODS + Lparameters toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount ; , taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count ; , toFoxBin2Prg - EXTERNAL ARRAY taPropsAndComments, taProtected + External Array taPropsAndComments, taProtected - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lcMethodName, lnMethodCount + Try + Local lcMethodName, lnMethodCount - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - lnMethodCount = tnMethodCount - .method2Array( toRegObj.METHODS, @taMethods, @taCode, '', @tnMethodCount ; - , @taPropsAndComments, tnPropsAndComments_Count, @taProtected, tnProtected_Count, @toFoxBin2Prg, @toRegObj ) + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' + lnMethodCount = tnMethodCount + .method2Array( toRegObj.METHODS, @taMethods, @taCode, '', @tnMethodCount ; + , @taPropsAndComments, tnPropsAndComments_Count, @taProtected, tnProtected_Count, @toFoxBin2Prg, @toRegObj ) - *-- Ubico los métodos protegidos y les cambio la definición. - *-- Los métodos se deben generar con la ruta completa, porque si no es imposible saber a que objeto corresponden, - *-- o si son de la clase. - IF tnMethodCount - lnMethodCount > 0 THEN - FOR I = lnMethodCount + 1 TO tnMethodCount - IF taMethods(m.I,2) = 0 - LOOP - ENDIF +*-- Ubico los métodos protegidos y les cambio la definición. +*-- Los métodos se deben generar con la ruta completa, porque si no es imposible saber a que objeto corresponden, +*-- o si son de la clase. + If tnMethodCount - lnMethodCount > 0 Then + For I = lnMethodCount + 1 To tnMethodCount + If taMethods(m.I,2) = 0 + Loop + Endif - IF EMPTY(toRegObj.PARENT) - lcMethodName = toRegObj.OBJNAME + '.' + taMethods(m.I,1) - ELSE - DO CASE - CASE '.' $ toRegObj.PARENT - lcMethodName = SUBSTR(toRegObj.PARENT, AT('.', toRegObj.PARENT) + 1) + '.' + toRegObj.OBJNAME + '.' + taMethods(m.I,1) - - CASE LOWER( LEFT(toRegObj.PARENT + '.', LEN( toRegClass.OBJNAME + '.' ) ) ) == LOWER( toRegClass.OBJNAME + '.' ) + If Empty(toRegObj.Parent) lcMethodName = toRegObj.OBJNAME + '.' + taMethods(m.I,1) + Else + Do Case + Case '.' $ toRegObj.Parent + lcMethodName = Substr(toRegObj.Parent, At('.', toRegObj.Parent) + 1) + '.' + toRegObj.OBJNAME + '.' + taMethods(m.I,1) - OTHERWISE - lcMethodName = toRegObj.PARENT + '.' + toRegObj.OBJNAME + '.' + taMethods(m.I,1) + Case Lower( Left(toRegObj.Parent + '.', Len( toRegClass.OBJNAME + '.' ) ) ) == Lower( toRegClass.OBJNAME + '.' ) + lcMethodName = toRegObj.OBJNAME + '.' + taMethods(m.I,1) - ENDCASE - ENDIF + Otherwise + lcMethodName = toRegObj.Parent + '.' + toRegObj.OBJNAME + '.' + taMethods(m.I,1) - *-- Genero el método SIN indentar, ya que se hace luego - taCode(taMethods(m.I,2)) = 'PROCEDURE ' + lcMethodName + CR_LF + .indentMemo( taCode(taMethods(m.I,2)) ) + CR_LF + 'ENDPROC' - taMethods(m.I,1) = lcMethodName - ENDFOR - ENDIF - ENDWITH && THIS + Endcase + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF +*-- Genero el método SIN indentar, ya que se hace luego + taCode(taMethods(m.I,2)) = 'PROCEDURE ' + lcMethodName + CR_LF + .indentMemo( taCode(taMethods(m.I,2)) ) + CR_LF + 'ENDPROC' + taMethods(m.I,1) = lcMethodName + Endfor + Endif + Endwith && THIS - THROW + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - FINALLY - RELEASE toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount ; - , taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count ; - , toFoxBin2Prg, lcMethodName, lnMethodCount - ENDTRY + Throw - RETURN - ENDPROC + Finally + Release toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount ; + , taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count ; + , toFoxBin2Prg, lcMethodName, lnMethodCount + Endtry + + Return + Endproc - PROCEDURE get_CLASS_METHODS - LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments, toFoxBin2Prg - *-- DEFINIR MÉTODOS DE LA CLASE - *-- Ubico los métodos protegidos y les cambio la definición - EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments + Procedure get_CLASS_METHODS + Lparameters tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments, toFoxBin2Prg +*-- DEFINIR MÉTODOS DE LA CLASE +*-- Ubico los métodos protegidos y les cambio la definición + External Array taMethods, taCode, taProtected, taPropsAndComments - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen - STORE '' TO lcMethod, lcMethodName, lcProcDef, lcMethods + Try + Local lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen + Store '' To lcMethod, lcMethodName, lcProcDef, lcMethods - IF tnMethodCount > 0 THEN - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - FOR I = 1 TO tnMethodCount - lcMethodName = CHRTRAN( taMethods(m.I,1), '^', '' ) - lnProtectedItem = ASCAN( taProtected, taMethods(m.I,1), 1, 0, 0, 1+2+4) + If tnMethodCount > 0 Then + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' + For I = 1 To tnMethodCount + lcMethodName = Chrtran( taMethods(m.I,1), '^', '' ) + lnProtectedItem = Ascan( taProtected, taMethods(m.I,1), 1, 0, 0, 1+2+4) - IF lnProtectedItem = 0 - lnProtectedItem = ASCAN( taProtected, taMethods(m.I,1) + '^', 1, 0, 0, 1+2+4) + If lnProtectedItem = 0 + lnProtectedItem = Ascan( taProtected, taMethods(m.I,1) + '^', 1, 0, 0, 1+2+4) - IF lnProtectedItem = 0 - *-- Método común - lcProcDef = 'PROCEDURE' - ELSE - *-- Método oculto - lcProcDef = 'HIDDEN PROCEDURE' - ENDIF - ELSE - *-- Método protegido - lcProcDef = 'PROTECTED PROCEDURE' - ENDIF + If lnProtectedItem = 0 +*-- Método común + lcProcDef = 'PROCEDURE' + Else +*-- Método oculto + lcProcDef = 'HIDDEN PROCEDURE' + Endif + Else +*-- Método protegido + lcProcDef = 'PROTECTED PROCEDURE' + Endif - lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethodName, 1, 0, 1, 1+2+4+8) + lnCommentRow = Ascan( taPropsAndComments, '*' + lcMethodName, 1, 0, 1, 1+2+4+8) - *-- Nombre del método - lcMethod = lcProcDef + ' ' + taMethods(m.I,1) +*-- Nombre del método + lcMethod = lcProcDef + ' ' + taMethods(m.I,1) - *-- Comentarios del método (si tiene) - IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) - * PRG_Compat_Level >= 1 - IF BITAND(toFoxBin2Prg.n_PRG_Compat_Level, 1) > 0 - lcMethod = lcMethod + C_TAB + C_TAB + 'HELPSTRING "' + taPropsAndComments(lnCommentRow,2) + '"' - ELSE - * PRG_Compat_Level = 0 (Default old setting) - lcMethod = lcMethod + C_TAB + C_TAB + '&' + '& ' + taPropsAndComments(lnCommentRow,2) - ENDIF - ENDIF +*-- Comentarios del método (si tiene) + If lnCommentRow > 0 And Not Empty(taPropsAndComments(lnCommentRow,2)) +* PRG_Compat_Level >= 1 + If Bitand(toFoxBin2Prg.n_PRG_Compat_Level, 1) > 0 + lcMethod = lcMethod + C_TAB + C_TAB + 'HELPSTRING "' + taPropsAndComments(lnCommentRow,2) + '"' + Else +* PRG_Compat_Level = 0 (Default old setting) + lcMethod = lcMethod + C_TAB + C_TAB + '&' + '& ' + taPropsAndComments(lnCommentRow,2) + Endif + Endif - *-- Código del método - IF taMethods(m.I,2) > 0 THEN - taCode(taMethods(m.I,2)) = lcMethod + CR_LF + .indentMemo( taCode(taMethods(m.I,2)) ) + CR_LF + 'ENDPROC' - ELSE - lnLen = ALEN(taCode,1) + 1 - DIMENSION taCode( lnLen ) - taCode( lnLen ) = lcMethod + CR_LF + 'ENDPROC' - taMethods(m.I,2) = lnLen - ENDIF - ENDFOR - ENDWITH && THIS - ENDIF +*-- Código del método + If taMethods(m.I,2) > 0 Then + taCode(taMethods(m.I,2)) = lcMethod + CR_LF + .indentMemo( taCode(taMethods(m.I,2)) ) + CR_LF + 'ENDPROC' + Else + lnLen = Alen(taCode,1) + 1 + Dimension taCode( lnLen ) + taCode( lnLen ) = lcMethod + CR_LF + 'ENDPROC' + taMethods(m.I,2) = lnLen + Endif + Endfor + Endwith && THIS + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments ; - , lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen - ENDTRY + Finally + Release tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments ; + , lcMethod, lcMethodName, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lnLen + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE get_OLEPublicObjectName - LPARAMETERS ta_NombresObjsOle - *-- Obtengo los objetos "OLEPublic" - LOCAL I + Procedure get_OLEPublicObjectName + Lparameters ta_NombresObjsOle +*-- Obtengo los objetos "OLEPublic" + Local I - SELECT PADR(OBJNAME,100) OBJNAME ; + Select Padr(OBJNAME,100) OBJNAME ; FROM TABLABIN ; - WHERE TABLABIN.PLATFORM = "COMMENT" AND TABLABIN.RESERVED2 == "OLEPublic" ; - ORDER BY 1 ; - INTO ARRAY ta_NombresObjsOle + WHERE TABLABIN.PLATFORM = "COMMENT" And TABLABIN.RESERVED2 == "OLEPublic" ; + ORDER By 1 ; + INTO Array ta_NombresObjsOle - FOR I = 1 TO _TALLY - ta_NombresObjsOle(m.I) = ALLTRIM( ta_NombresObjsOle(m.I) ) - ENDFOR + For I = 1 To _Tally + ta_NombresObjsOle(m.I) = Alltrim( ta_NombresObjsOle(m.I) ) + Endfor - RETURN - ENDPROC + Return + Endproc - PROCEDURE get_PropsAndCommentsFrom_RESERVED3 - *-- Sirve para el memo RESERVED3 - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcMemo (v! IN ) Contenido de un campo MEMO - * tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres - * taPropsAndComments (!@ OUT) Array con las propiedades y comentarios - * tnPropsAndComments_Count (!@ OUT) Cantidad de propiedades - * tcSortedMemo (@? OUT) Contenido del campo memo ordenado - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo + Procedure get_PropsAndCommentsFrom_RESERVED3 +*-- Sirve para el memo RESERVED3 +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcMemo (v! IN ) Contenido de un campo MEMO +* tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres +* taPropsAndComments (!@ OUT) Array con las propiedades y comentarios +* tnPropsAndComments_Count (!@ OUT) Cantidad de propiedades +* tcSortedMemo (@? OUT) Contenido del campo memo ordenado +*--------------------------------------------------------------------------------------------------- + Lparameters tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo - EXTERNAL ARRAY taPropsAndComments + External Array taPropsAndComments - TRY - LOCAL laLines(1), I, lnPos, loEx AS EXCEPTION - tcSortedMemo = '' - tnPropsAndComments_Count = ALINES(laLines, tcMemo, 1+4) + Try + Local laLines(1), I, lnPos, loEx As Exception + tcSortedMemo = '' + tnPropsAndComments_Count = Alines(laLines, tcMemo, 1+4) - IF tnPropsAndComments_Count <= 1 AND EMPTY(laLines) - tnPropsAndComments_Count = 0 - EXIT - ENDIF + If tnPropsAndComments_Count <= 1 And Empty(laLines) + tnPropsAndComments_Count = 0 + Exit + Endif - DIMENSION taPropsAndComments(tnPropsAndComments_Count,2) + Dimension taPropsAndComments(tnPropsAndComments_Count,2) - FOR I = 1 TO tnPropsAndComments_Count - lnPos = AT(' ', laLines(m.I)) && Un espacio separa la propiedad de su comentario (si tiene) + For I = 1 To tnPropsAndComments_Count + lnPos = At(' ', laLines(m.I)) && Un espacio separa la propiedad de su comentario (si tiene) - IF lnPos = 0 - taPropsAndComments(m.I,1) = LOWER( laLines(m.I) ) - taPropsAndComments(m.I,2) = '' - ELSE - taPropsAndComments(m.I,1) = LOWER( LEFT( laLines(m.I), lnPos - 1 ) ) - taPropsAndComments(m.I,2) = SUBSTR( laLines(m.I), lnPos + 1 ) - ENDIF - ENDFOR + If lnPos = 0 + taPropsAndComments(m.I,1) = Lower( laLines(m.I) ) + taPropsAndComments(m.I,2) = '' + Else + taPropsAndComments(m.I,1) = Lower( Left( laLines(m.I), lnPos - 1 ) ) + taPropsAndComments(m.I,2) = Substr( laLines(m.I), lnPos + 1 ) + Endif + Endfor - IF tlSort AND THIS.l_PropSort_Enabled - ASORT( taPropsAndComments, 1, -1, 0, 1 ) - ENDIF + If tlSort And This.l_PropSort_Enabled + Asort( taPropsAndComments, 1, -1, 0, 1 ) + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo ; - , laLines, I, lnPos, loEx - ENDTRY + Finally + Release tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo ; + , laLines, I, lnPos, loEx + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE get_PropsAndValuesFrom_PROPERTIES - *-- Sirve para el memo PROPERTIES - *--------------------------------------------------------------------------------------------------- - * KNOWLEDGE BASE: - * 29/11/2013 FDBOZZO En un pageframe, si las props.nativas del mismo no están antes que las de - * los objetos contenidos, causa un error. Se deben ordenar primero las - * props.nativas (sin punto) y luego las de los objetos (con punto) - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcMemo (v! IN ) Contenido de un campo MEMO - * tnSort (v? IN ) Indica si se deben ordenar alfabéticamente los objetos y props (1), o no (0) - * taPropsAndValues (!@ OUT) Array con las propiedades y comentarios - * tnPropsAndValues_Count (!@ OUT) Cantidad de propiedades - * tcSortedMemo (?@ OUT) Contenido del campo memo ordenado - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo, toFoxBin2Prg + Procedure get_PropsAndValuesFrom_PROPERTIES +*-- Sirve para el memo PROPERTIES +*--------------------------------------------------------------------------------------------------- +* KNOWLEDGE BASE: +* 29/11/2013 FDBOZZO En un pageframe, si las props.nativas del mismo no están antes que las de +* los objetos contenidos, causa un error. Se deben ordenar primero las +* props.nativas (sin punto) y luego las de los objetos (con punto) +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcMemo (v! IN ) Contenido de un campo MEMO +* tnSort (v? IN ) Indica si se deben ordenar alfabéticamente los objetos y props (1), o no (0) +* taPropsAndValues (!@ OUT) Array con las propiedades y comentarios +* tnPropsAndValues_Count (!@ OUT) Cantidad de propiedades +* tcSortedMemo (?@ OUT) Contenido del campo memo ordenado +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo, toFoxBin2Prg - EXTERNAL ARRAY taPropsAndValues + External Array taPropsAndValues - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods, lcLastIncompletePropName - STORE '' TO tcSortedMemo, lcLastIncompletePropName - tnPropsAndValues_Count = 0 + Try + Local laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods, lcLastIncompletePropName + Store '' To tcSortedMemo, lcLastIncompletePropName + tnPropsAndValues_Count = 0 - IF NOT EMPTY(m.tcMemo) - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - lnItemCount = ALINES(laItems, m.tcMemo, 0, CR_LF) && Específicamente CR+LF para que no reconozca los CR o LF por separado - X = 0 + If Not Empty(m.tcMemo) + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' + lnItemCount = Alines(laItems, m.tcMemo, 0, CR_LF) && Específicamente CR+LF para que no reconozca los CR o LF por separado + X = 0 - IF lnItemCount <= 1 AND EMPTY(laItems) - lnItemCount = 0 - EXIT - ENDIF + If lnItemCount <= 1 And Empty(laItems) + lnItemCount = 0 + Exit + Endif - *-- 1) OBTENCIÓN Y SEPARACIÓN DE PROPIEDADES Y VALORES - *-- Crear un array con los valores especiales que pueden estar repartidos entre varias lineas - FOR I = 1 TO m.lnItemCount - IF EMPTY( laItems(m.I) ) - LOOP - ENDIF +*-- 1) OBTENCIÓN Y SEPARACIÓN DE PROPIEDADES Y VALORES +*-- Crear un array con los valores especiales que pueden estar repartidos entre varias lineas + For I = 1 To m.lnItemCount + If Empty( laItems(m.I) ) + Loop + Endif - IF C_MPROPHEADER $ laItems(m.I) - *-- Solo entrará por aquí cuando se evalúe una propiedad de PROPERTIES con un valor especial (largo) - lnLenAcum = 0 - lnPosEQ = AT( '=', laItems(m.I) ) - lcPropName = lcLastIncompletePropName + LEFT( laItems(m.I), lnPosEQ - 2 ) - lnLenVal = INT( VAL( SUBSTR( laItems(m.I), lnPosEQ + 2 + 517, 8) ) ) - lcValue = SUBSTR( laItems(m.I), lnPosEQ + 2 + 517 + 8 ) + If C_MPROPHEADER $ laItems(m.I) +*-- Solo entrará por aquí cuando se evalúe una propiedad de PROPERTIES con un valor especial (largo) + lnLenAcum = 0 + lnPosEQ = At( '=', laItems(m.I) ) + lcPropName = lcLastIncompletePropName + Left( laItems(m.I), lnPosEQ - 2 ) + lnLenVal = Int( Val( Substr( laItems(m.I), lnPosEQ + 2 + 517, 8) ) ) + lcValue = Substr( laItems(m.I), lnPosEQ + 2 + 517 + 8 ) - IF LEN( lcValue ) < lnLenVal - *-- Como el valor es multi-línea, debo agregarle los CR_LF que le quitó el ALINES() - FOR I = m.I + 1 TO m.lnItemCount - lcValue = lcValue + CR_LF + laItems(m.I) + If Len( lcValue ) < lnLenVal +*-- Como el valor es multi-línea, debo agregarle los CR_LF que le quitó el ALINES() + For I = m.I + 1 To m.lnItemCount + lcValue = lcValue + CR_LF + laItems(m.I) - IF LEN( lcValue ) >= lnLenVal - EXIT - ENDIF - ENDFOR + If Len( lcValue ) >= lnLenVal + Exit + Endif + Endfor - lcValue = C_FB2P_VALUE_I + CR_LF + lcValue + CR_LF + C_FB2P_VALUE_F - ELSE - lcValue = C_FB2P_VALUE_I + lcValue + C_FB2P_VALUE_F - ENDIF + lcValue = C_FB2P_VALUE_I + CR_LF + lcValue + CR_LF + C_FB2P_VALUE_F + Else + lcValue = C_FB2P_VALUE_I + lcValue + C_FB2P_VALUE_F + Endif - *-- Es un valor especial, por lo que se encapsula en un marcador especial - X = m.X + 1 - DIMENSION taPropsAndValues(m.X,2) - taPropsAndValues(m.X,1) = lcPropName - taPropsAndValues(m.X,2) = .normalizePropertyValue( lcPropName, lcValue, '' ) +*-- Es un valor especial, por lo que se encapsula en un marcador especial + X = m.X + 1 + Dimension taPropsAndValues(m.X,2) + taPropsAndValues(m.X,1) = lcPropName + taPropsAndValues(m.X,2) = .normalizePropertyValue( lcPropName, lcValue, '' ) - ELSE - *-- Propiedad normal - lnPosEQ = AT( '=', laItems(m.I) ) + Else +*-- Propiedad normal + lnPosEQ = At( '=', laItems(m.I) ) - IF lnPosEQ = 0 THEN - *-- AUTOFIX DE PROPIEDAD PARTIDA: - *-- Esto solo puede ocurrir cuando en el memo de Propiedades hay alguna propiedad - *-- partida debido a una edición manual con un Enter erróneo, algo como esto: - * comm - * AND2.Caption = "Command2" - * - *-- En el caso anterior, las 2 líneas son realmente una: - * command2.Caption = "Command2" - * - *-- Solución: Guardar esta parte del nombre y agregarlo a la próxima propiedad. - lcLastIncompletePropName = laItems(m.I) - LOOP - ENDIF + If lnPosEQ = 0 Then +*-- AUTOFIX DE PROPIEDAD PARTIDA: +*-- Esto solo puede ocurrir cuando en el memo de Propiedades hay alguna propiedad +*-- partida debido a una edición manual con un Enter erróneo, algo como esto: +* comm +* AND2.Caption = "Command2" +* +*-- En el caso anterior, las 2 líneas son realmente una: +* command2.Caption = "Command2" +* +*-- Solución: Guardar esta parte del nombre y agregarlo a la próxima propiedad. + lcLastIncompletePropName = laItems(m.I) + Loop + Endif - * Skip ZOrderSet property if configured to - IF toFoxBin2Prg.l_RemoveZOrderSetFromProps AND ATC( '.ZOrderSet.', '.' + lcLastIncompletePropName + LEFT( laItems(m.I), lnPosEQ - 2 ) + '.' ) > 0 THEN - lcLastIncompletePropName = '' - LOOP - ENDIF +* Skip ZOrderSet property if configured to + If toFoxBin2Prg.l_RemoveZOrderSetFromProps And Atc( '.ZOrderSet.', '.' + lcLastIncompletePropName + Left( laItems(m.I), lnPosEQ - 2 ) + '.' ) > 0 Then + lcLastIncompletePropName = '' + Loop + Endif - X = m.X + 1 - DIMENSION taPropsAndValues(m.X,2) - taPropsAndValues(m.X,1) = lcLastIncompletePropName + LEFT( laItems(m.I), lnPosEQ - 2 ) - taPropsAndValues(m.X,2) = .normalizePropertyValue( taPropsAndValues(m.X,1), LTRIM( SUBSTR( laItems(m.I), lnPosEQ + 2 ) ), '' ) - ENDIF + X = m.X + 1 + Dimension taPropsAndValues(m.X,2) + taPropsAndValues(m.X,1) = lcLastIncompletePropName + Left( laItems(m.I), lnPosEQ - 2 ) + taPropsAndValues(m.X,2) = .normalizePropertyValue( taPropsAndValues(m.X,1), Ltrim( Substr( laItems(m.I), lnPosEQ + 2 ) ), '' ) + Endif - lcLastIncompletePropName = '' - ENDFOR + lcLastIncompletePropName = '' + Endfor - tnPropsAndValues_Count = m.X - lcMethods = '' + tnPropsAndValues_Count = m.X + lcMethods = '' - *-- 2) SORT - .sortPropsAndValues( @taPropsAndValues, tnPropsAndValues_Count, tnSort ) +*-- 2) SORT + .sortPropsAndValues( @taPropsAndValues, tnPropsAndValues_Count, tnSort ) - *-- Agregar propiedades primero - FOR I = 1 TO m.tnPropsAndValues_Count - tcSortedMemo = m.tcSortedMemo + m.taPropsAndValues(m.I,1) + ' = ' + m.taPropsAndValues(m.I,2) + CR_LF - ENDFOR +*-- Agregar propiedades primero + For I = 1 To m.tnPropsAndValues_Count + tcSortedMemo = m.tcSortedMemo + m.taPropsAndValues(m.I,1) + ' = ' + m.taPropsAndValues(m.I,2) + CR_LF + Endfor - *-- Agregar métodos al final - tcSortedMemo = m.tcSortedMemo + m.lcMethods +*-- Agregar métodos al final + tcSortedMemo = m.tcSortedMemo + m.lcMethods - ENDWITH && THIS - ENDIF + Endwith && THIS + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo ; - , laItems, I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods - ENDTRY + Finally + Release tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo ; + , laItems, I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE get_PropsFrom_PROTECTED - *--------------------------------------------------------------------------------------------------- - *-- Sirve para el memo PROTECTED - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcMemo (v! IN ) Contenido de un campo MEMO - * tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres - * taProtected (!@ OUT) Array con las propiedades y comentarios - * tnProtected_Count (!@ OUT) Cantidad de propiedades - * tcSortedMemo (@? OUT) Contenido del campo memo ordenado - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcMemo, tlSort, taProtected, tnProtected_Count, tcSortedMemo + Procedure get_PropsFrom_PROTECTED +*--------------------------------------------------------------------------------------------------- +*-- Sirve para el memo PROTECTED +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* tcMemo (v! IN ) Contenido de un campo MEMO +* tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres +* taProtected (!@ OUT) Array con las propiedades y comentarios +* tnProtected_Count (!@ OUT) Cantidad de propiedades +* tcSortedMemo (@? OUT) Contenido del campo memo ordenado +*--------------------------------------------------------------------------------------------------- + Lparameters tcMemo, tlSort, taProtected, tnProtected_Count, tcSortedMemo - EXTERNAL ARRAY taProtected + External Array taProtected - LOCAL I + Local I tcSortedMemo = '' - tnProtected_Count = ALINES(taProtected, tcMemo, 1+4) + tnProtected_Count = Alines(taProtected, tcMemo, 1+4) - IF tnProtected_Count <= 1 AND EMPTY(taProtected) + If tnProtected_Count <= 1 And Empty(taProtected) tnProtected_Count = 0 - ELSE - IF tlSort AND THIS.l_PropSort_Enabled - ASORT( taProtected, 1, -1, 0, 1 ) - ENDIF + Else + If tlSort And This.l_PropSort_Enabled + Asort( taProtected, 1, -1, 0, 1 ) + Endif - FOR I = tnProtected_Count TO 1 STEP -1 - *-- El ASCAN es para evitar valores repetidos, que se eliminarán. v1.19.29 + For I = tnProtected_Count To 1 Step -1 +*-- El ASCAN es para evitar valores repetidos, que se eliminarán. v1.19.29 taProtected(m.I) = taProtected(m.I) - IF ASCAN( taProtected, taProtected(m.I), 1, -1, 0, 1+2+4 ) = m.I + If Ascan( taProtected, taProtected(m.I), 1, -1, 0, 1+2+4 ) = m.I tcSortedMemo = tcSortedMemo + taProtected(m.I) + CR_LF - ELSE - ADEL( taProtected, m.I ) + Else + Adel( taProtected, m.I ) tnProtected_Count = tnProtected_Count - 1 - ENDIF - ENDFOR + Endif + Endfor - DIMENSION taProtected(tnProtected_Count) - ENDIF + Dimension taProtected(tnProtected_Count) + Endif - RELEASE tcMemo, tlSort, taProtected, tnProtected_Count, tcSortedMemo, I - RETURN - ENDPROC + Release tcMemo, tlSort, taProtected, tnProtected_Count, tcSortedMemo, I + Return + Endproc - PROCEDURE ignoreCorruptedObjects(lcCursor) - * Issue#17 - Error, The specified key already exists - * Para evitar este error se deben ignorar los objetos corruptos (duplicados) - * Se identifican porque la clase principal el campo Reserved1 tiene vacio en vez de "Class" - LOCAL lcParentObjName, lcSetDeleted - SELECT (lcCursor) - lcSetDeleted = SET("Deleted") - SET DELETED OFF + Procedure ignoreCorruptedObjects(lcCursor) +* Issue#17 - Error, The specified key already exists +* Para evitar este error se deben ignorar los objetos corruptos (duplicados) +* Se identifican porque la clase principal el campo Reserved1 tiene vacio en vez de "Class" + Local lcParentObjName, lcSetDeleted + Select (lcCursor) + lcSetDeleted = Set("Deleted") + Set Deleted Off - SCAN FOR PLATFORM = "WINDOWS" AND EMPTY(Parent) AND EMPTY(RESERVED1) - lcParentObjName = LOWER(OBJNAME) - DELETE - SKIP - DELETE REST WHILE GETWORDNUM(LOWER(PARENT) + '.', 1, '.') == lcParentObjName - SKIP -1 - ENDSCAN + Scan For PLATFORM = "WINDOWS" And Empty(Parent) And Empty(RESERVED1) + lcParentObjName = Lower(OBJNAME) + Delete + Skip + Delete Rest While Getwordnum(Lower(Parent) + '.', 1, '.') == lcParentObjName + Skip -1 + Endscan - SET DELETED &lcSetDeleted. - RETURN - ENDPROC + Set Deleted &lcSetDeleted. + Return + Endproc - PROCEDURE ignoreIncorrectDefinedObjects(lcCursor) - * Issue#15 - VFP Designer ignored objects should be ignored by FoxBin2Prg - LOCAL lcObjName, lcParent, lcParentObjName, loObjs as Collection - loObjs = CREATEOBJECT("Collection") - SELECT (lcCursor) + Procedure ignoreIncorrectDefinedObjects(lcCursor) +* Issue#15 - VFP Designer ignored objects should be ignored by FoxBin2Prg + Local lcObjName, lcParent, lcParentObjName, loObjs As Collection + loObjs = Createobject("Collection") + Select (lcCursor) - SCAN FOR PLATFORM = "WINDOWS" - lcObjName = LOWER(OBJNAME) - lcParent = LOWER(PARENT) + Scan For PLATFORM = "WINDOWS" + lcObjName = Lower(OBJNAME) + lcParent = Lower(Parent) - IF EMPTY(lcParent) + If Empty(lcParent) lcParentObjName = lcObjName - ELSE + Else lcParentObjName = lcParent + '.' + lcObjName - ENDIF + Endif - IF NOT EMPTY(lcParent) - * Tiene Parent, y debe existir, si no es ignorado - * NOTA: Del parent solo se puede comprobar el objeto primario. - IF loObjs.GetKey(GETWORDNUM(lcParent + '.', 1, '.')) > 0 - * Existe: se agrega al array el nuevo objeto - * NOTA: Podría estar duplicado, pero no se trata ese caso aquí - IF NOT EMPTY(lcParentObjName) AND loObjs.GetKey(lcParentObjName) = 0 + If Not Empty(lcParent) +* Tiene Parent, y debe existir, si no es ignorado +* NOTA: Del parent solo se puede comprobar el objeto primario. + If loObjs.GetKey(Getwordnum(lcParent + '.', 1, '.')) > 0 +* Existe: se agrega al array el nuevo objeto +* NOTA: Podría estar duplicado, pero no se trata ese caso aquí + If Not Empty(lcParentObjName) And loObjs.GetKey(lcParentObjName) = 0 loObjs.Add( '', lcParentObjName ) - ENDIF - ELSE - * No existe: se ignora - DELETE - ENDIF - ELSE - * No Existe: se agrega al array - IF NOT EMPTY(lcParentObjName) AND loObjs.GetKey(lcParentObjName) = 0 + Endif + Else +* No existe: se ignora + Delete + Endif + Else +* No Existe: se agrega al array + If Not Empty(lcParentObjName) And loObjs.GetKey(lcParentObjName) = 0 loObjs.Add( '', lcParentObjName ) - ENDIF + Endif - ENDIF - ENDSCAN + Endif + Endscan - RETURN - ENDPROC + Return + Endproc - PROCEDURE indentMemo - LPARAMETERS tcMethod, tcIndentation, tlKeepProcHeader - *-- INDENTA EL CÓDIGO DE UN MÉTODO DADO Y QUITA LA CABECERA DE MÉTODO (PROCEDURE/ENDPROC) SI LA ENCUENTRA - TRY - LOCAL I, X, lcMethod, llProcedure, lnInicio, lnFin, laLineas(1), lnOffset ; - , loLang as CL_LANG OF 'FOXBIN2PRG.PRG' + Procedure indentMemo + Lparameters tcMethod, tcIndentation, tlKeepProcHeader +*-- INDENTA EL CÓDIGO DE UN MÉTODO DADO Y QUITA LA CABECERA DE MÉTODO (PROCEDURE/ENDPROC) SI LA ENCUENTRA + Try + Local I, X, lcMethod, llProcedure, lnInicio, lnFin, laLineas(1), lnOffset ; + , loLang As CL_LANG Of 'FOXBIN2PRG.PRG' - loLang = _SCREEN.o_FoxBin2Prg_Lang - lcMethod = '' - lnInicio = 1 - lnOffset = 0 - lnFin = ALINES(laLineas, tcMethod) - llProcedure = ( LEFT(laLineas(1),10) == 'PROCEDURE ' ; - OR LEFT(laLineas(1),17) == 'HIDDEN PROCEDURE ' ; - OR LEFT(laLineas(1),20) == 'PROTECTED PROCEDURE ' ) + loLang = _Screen.o_FoxBin2Prg_Lang + lcMethod = '' + lnInicio = 1 + lnOffset = 0 + lnFin = Alines(laLineas, tcMethod) + llProcedure = ( Left(laLineas(1),10) == 'PROCEDURE ' ; + OR Left(laLineas(1),17) == 'HIDDEN PROCEDURE ' ; + OR Left(laLineas(1),20) == 'PROTECTED PROCEDURE ' ) - IF VARTYPE(tcIndentation) # 'C' - tcIndentation = '' - ENDIF + If Vartype(tcIndentation) # 'C' + tcIndentation = '' + Endif - *-- Quito las líneas en blanco luego del final del ENDPROC - X = 0 - FOR I = lnFin TO 1 STEP -1 - IF NOT EMPTY(laLineas(m.I)) && Última línea de código - IF llProcedure AND LEFT( CHRTRAN(laLineas(m.I), C_TAB, ' ') + ' ', 8 ) <> C_ENDPROC + ' ' THEN - *ERROR 'Procedimiento sin cerrar. La última línea de código debe ser ENDPROC. [' + laLineas(1) + ']' - ERROR (TEXTMERGE(loLang.C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC)) - ENDIF - EXIT - ENDIF - X = m.X + 1 - ENDFOR +*-- Quito las líneas en blanco luego del final del ENDPROC + X = 0 + For I = lnFin To 1 Step -1 + If Not Empty(laLineas(m.I)) && Última línea de código + If llProcedure And Left( Chrtran(laLineas(m.I), C_TAB, ' ') + ' ', 8 ) <> C_ENDPROC + ' ' Then +*ERROR 'Procedimiento sin cerrar. La última línea de código debe ser ENDPROC. [' + laLineas(1) + ']' + Error (Textmerge(loLang.C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC)) + Endif + Exit + Endif + X = m.X + 1 + Endfor - IF m.X > 0 - lnFin = lnFin - m.X - DIMENSION laLineas(lnFin) - ENDIF + If m.X > 0 + lnFin = lnFin - m.X + Dimension laLineas(lnFin) + Endif - *-- Si encuentra la cabecera de un PROCEDURE, la saltea - IF llProcedure - lnOffset = 1 - ENDIF +*-- Si encuentra la cabecera de un PROCEDURE, la saltea + If llProcedure + lnOffset = 1 + Endif - FOR I = lnInicio + lnOffset TO lnFin - lnOffset - *-- TEXT/ENDTEXT aquí da error 2044 de recursividad. No usar. - lcMethod = lcMethod + CR_LF + tcIndentation + laLineas(m.I) - ENDFOR + For I = lnInicio + lnOffset To lnFin - lnOffset +*-- TEXT/ENDTEXT aquí da error 2044 de recursividad. No usar. + lcMethod = lcMethod + CR_LF + tcIndentation + laLineas(m.I) + Endfor - IF llProcedure AND tlKeepProcHeader - lcMethod = CR_LF + C_TAB + laLineas(lnInicio) + lcMethod + CR_LF + C_TAB + laLineas(lnFin) - ENDIF + If llProcedure And tlKeepProcHeader + lcMethod = CR_LF + C_TAB + laLineas(lnInicio) + lcMethod + CR_LF + C_TAB + laLineas(lnFin) + Endif - lcMethod = SUBSTR(lcMethod,3) && Quito el primer ENTER (CR+LF) + lcMethod = Substr(lcMethod,3) && Quito el primer ENTER (CR+LF) - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcMethod, tcIndentation, tlKeepProcHeader ; - , I, X, llProcedure, lnInicio, lnFin, laLineas, lnOffset - ENDTRY + Finally + Release tcMethod, tcIndentation, tlKeepProcHeader ; + , I, X, llProcedure, lnInicio, lnFin, laLineas, lnOffset + Endtry - RETURN lcMethod - ENDPROC + Return lcMethod + Endproc - PROCEDURE memoInOneLine - LPARAMETERS tcMethod + Procedure memoInOneLine + Lparameters tcMethod - TRY - LOCAL lcLine, I - lcLine = '' + Try + Local lcLine, I + lcLine = '' - IF NOT EMPTY(tcMethod) - FOR I = 1 TO ALINES(laLines, m.tcMethod, 0) - lcLine = lcLine + ', ' + laLines(m.I) - ENDFOR + If Not Empty(tcMethod) + For I = 1 To Alines(laLines, m.tcMethod, 0) + lcLine = lcLine + ', ' + laLines(m.I) + Endfor - lcLine = SUBSTR(lcLine, 3) - ENDIF + lcLine = Substr(lcLine, 3) + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcMethod, I - ENDTRY + Finally + Release tcMethod, I + Endtry - RETURN lcLine - ENDPROC + Return lcLine + Endproc - PROCEDURE set_MultilineMemoWithAddObjectProperties - LPARAMETERS taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine + Procedure set_MultilineMemoWithAddObjectProperties + Lparameters taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine - EXTERNAL ARRAY taPropsAndValues + External Array taPropsAndValues - TRY - LOCAL lcLine, I, lcComentarios, laLines(1), lcFinDeLinea - lcLine = '' - lcFinDeLinea = ', ;' + CR_LF + Try + Local lcLine, I, lcComentarios, laLines(1), lcFinDeLinea + lcLine = '' + lcFinDeLinea = ', ;' + CR_LF - IF tnPropCount > 0 - IF VARTYPE(tcLeftIndentation) # 'C' - tcLeftIndentation = '' - ENDIF + If tnPropCount > 0 + If Vartype(tcLeftIndentation) # 'C' + tcLeftIndentation = '' + Endif - FOR I = 1 TO tnPropCount - lcLine = lcLine + tcLeftIndentation + taPropsAndValues(m.I,1) + ' = ' + taPropsAndValues(m.I,2) + lcFinDeLinea - ENDFOR + For I = 1 To tnPropCount + lcLine = lcLine + tcLeftIndentation + taPropsAndValues(m.I,1) + ' = ' + taPropsAndValues(m.I,2) + lcFinDeLinea + Endfor - *-- Quito el ", ;" final - lcLine = tcLeftIndentation + SUBSTR(lcLine, 1 + LEN(tcLeftIndentation), LEN(lcLine) - LEN(tcLeftIndentation) - LEN(lcFinDeLinea)) - ENDIF +*-- Quito el ", ;" final + lcLine = tcLeftIndentation + Substr(lcLine, 1 + Len(tcLeftIndentation), Len(lcLine) - Len(tcLeftIndentation) - Len(lcFinDeLinea)) + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine ; - , I, lcComentarios, laLines, lcFinDeLinea - ENDTRY + Finally + Release taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine ; + , I, lcComentarios, laLines, lcFinDeLinea + Endtry - RETURN lcLine - ENDPROC + Return lcLine + Endproc - PROCEDURE set_UserValue - *--------------------------------------------------------------------------------------------------- - * Intenta obtener información más precisa sobre el error a reportar dentro de methods - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toEx (v! IN ) Objeto Exception - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toEx as Exception + Procedure set_UserValue +*--------------------------------------------------------------------------------------------------- +* Intenta obtener información más precisa sobre el error a reportar dentro de methods +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toEx (v! IN ) Objeto Exception +*--------------------------------------------------------------------------------------------------- + Lparameters toEx As Exception - LOCAL lcMethods, I, lcLine, laCodeLines(1), lcMethod, lcLocation, lnErrorLine - STORE '' TO lcMethods, lcLine, laCodeLines, lcMethod, lcLocation - STORE 0 TO lnErrorLine, I + Local lcMethods, I, lcLine, laCodeLines(1), lcMethod, lcLocation, lnErrorLine + Store '' To lcMethods, lcLine, laCodeLines, lcMethod, lcLocation + Store 0 To lnErrorLine, I - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' toEx.UserValue = toEx.UserValue + CR_LF - IF NOT EMPTY(ALIAS()) AND INLIST(.c_Type, 'SCX', 'VCX') THEN - IF TYPE("METHODS")#"U" THEN + If Not Empty(Alias()) And Inlist(.c_Type, 'SCX', 'VCX') Then + If Type("METHODS")#"U" Then lcMethods = METHODS - ENDIF + Endif toEx.UserValue = toEx.UserValue + 'Error location ' + '..............................' + CR_LF - IF TYPE("PARENT")#"U" AND NOT EMPTY(Parent) THEN + If Type("PARENT")#"U" And Not Empty(Parent) Then lcLocation = lcLocation + Parent + '.' - ENDIF + Endif - IF TYPE("OBJNAME")#"U" THEN + If Type("OBJNAME")#"U" Then lcLocation = lcLocation + OBJNAME - ENDIF + Endif - *-- Busco el Procedure si hay un n_Methods_LineNo - ALINES(laCodeLines, lcMethods) +*-- Busco el Procedure si hay un n_Methods_LineNo + Alines(laCodeLines, lcMethods) - FOR I = .n_Methods_LineNo TO 1 STEP -1 - lcLine = LTRIM( laCodeLines(m.I), 0, ' ', CHR(9) ) + For I = .n_Methods_LineNo To 1 Step -1 + lcLine = Ltrim( laCodeLines(m.I), 0, ' ', Chr(9) ) - DO CASE - CASE LEFT(lcLine, 10) == 'PROCEDURE ' - lcMethod = ALLTRIM( SUBSTR( lcLine, 11) ) - lnErrorLine = .n_Methods_LineNo - m.I - EXIT + Do Case + Case Left(lcLine, 10) == 'PROCEDURE ' + lcMethod = Alltrim( Substr( lcLine, 11) ) + lnErrorLine = .n_Methods_LineNo - m.I + Exit - CASE LEFT(lcLine, 9) == 'FUNCTION ' - lcMethod = ALLTRIM( SUBSTR( lcLine, 10) ) - lnErrorLine = .n_Methods_LineNo - m.I - EXIT + Case Left(lcLine, 9) == 'FUNCTION ' + lcMethod = Alltrim( Substr( lcLine, 10) ) + lnErrorLine = .n_Methods_LineNo - m.I + Exit - ENDCASE + Endcase - ENDFOR + Endfor - IF EMPTY(lcMethod) THEN + If Empty(lcMethod) Then lcLocation = 'Class: ' + lcLocation - ELSE + Else lcLocation = 'Method: ' + lcLocation + '.' + lcMethod - ENDIF + Endif - IF lnErrorLine > 0 THEN - lcLocation = lcLocation + ', Line ' + TRANSFORM(lnErrorLine) - ENDIF + If lnErrorLine > 0 Then + lcLocation = lcLocation + ', Line ' + Transform(lnErrorLine) + Endif toEx.UserValue = toEx.UserValue + lcLocation + CR_LF - IF .n_Methods_LineNo = 0 THEN + If .n_Methods_LineNo = 0 Then toEx.UserValue = toEx.UserValue + '> (no evaluated code yet)' + CR_LF - ELSE + Else toEx.UserValue = toEx.UserValue + '> ' + laCodeLines(.n_Methods_LineNo) + CR_LF - ENDIF - ENDIF + Endif + Endif - toEx.UserValue = toEx.UserValue + 'Recno: ' + TRANSFORM(RECNO()) + CR_LF + toEx.UserValue = toEx.UserValue + 'Recno: ' + Transform(Recno()) + CR_LF toEx.UserValue = toEx.UserValue + '.............................................' + CR_LF - ENDWITH - ENDPROC + Endwith + Endproc - PROCEDURE sortMethod - LPARAMETERS tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; + Procedure sortMethod + Lparameters tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; , taProtected, tnProtected_Count, toFoxBin2Prg - EXTERNAL ARRAY taMethods, taCode, taPropsAndComments, taProtected + External Array taMethods, taCode, taPropsAndComments, taProtected - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, I2, laMethods(1,3), lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx AS EXCEPTION + Try + Local I, I2, laMethods(1,3), lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx As Exception - IF tnMethodCount > 0 THEN + If tnMethodCount > 0 Then - *-- taMethods[1,3] - *-- 1.Nombre Método - *-- 2.Posición Original - *-- 3.Tipo (HIDDEN/PROTECTED/NORMAL) +*-- taMethods[1,3] +*-- 1.Nombre Método +*-- 2.Posición Original +*-- 3.Tipo (HIDDEN/PROTECTED/NORMAL) - *-- Alphabetical ordering of methods - IF THIS.l_MethodSort_Enabled - ASORT(taMethods,1,-1,0,1) - ENDIF +*-- Alphabetical ordering of methods + If This.l_MethodSort_Enabled + Asort(taMethods,1,-1,0,1) + Endif - DIMENSION laMethods(tnMethodCount,3) - lnDeleted = 0 + Dimension laMethods(tnMethodCount,3) + lnDeleted = 0 - FOR I = tnMethodCount TO 1 STEP -1 - IF taMethods(m.I,2) > 0 THEN - IF '.' $ taMethods(m.I,1) - *-- Los métodos con '.' los mando a otro array - lnDeleted = lnDeleted + 1 - laMethods(lnDeleted,1) = taMethods(m.I,1) - laMethods(lnDeleted,2) = taMethods(m.I,2) - laMethods(lnDeleted,3) = taMethods(m.I,3) - ADEL( taMethods, m.I ) - ENDIF - ENDIF - ENDFOR + For I = tnMethodCount To 1 Step -1 + If taMethods(m.I,2) > 0 Then + If '.' $ taMethods(m.I,1) +*-- Los métodos con '.' los mando a otro array + lnDeleted = lnDeleted + 1 + laMethods(lnDeleted,1) = taMethods(m.I,1) + laMethods(lnDeleted,2) = taMethods(m.I,2) + laMethods(lnDeleted,3) = taMethods(m.I,3) + Adel( taMethods, m.I ) + Endif + Endif + Endfor - FOR I = lnDeleted TO 1 STEP -1 - *-- Los métodos con '.' los paso al final - I2 = tnMethodCount - lnDeleted + (lnDeleted - m.I) + 1 - taMethods(I2,1) = laMethods(m.I,1) - taMethods(I2,2) = laMethods(m.I,2) - taMethods(I2,3) = laMethods(m.I,3) - ENDFOR + For I = lnDeleted To 1 Step -1 +*-- Los métodos con '.' los paso al final + I2 = tnMethodCount - lnDeleted + (lnDeleted - m.I) + 1 + taMethods(I2,1) = laMethods(m.I,1) + taMethods(I2,2) = laMethods(m.I,2) + taMethods(I2,3) = laMethods(m.I,3) + Endfor - ENDIF + Endif - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; - , taProtected, tnProtected_Count, toFoxBin2Prg ; - , I, I2, laMethods, lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx - ENDTRY + Finally + Release tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; + , taProtected, tnProtected_Count, toFoxBin2Prg ; + , I, I2, laMethods, lnDeleted, lcMethodName, lnMethodPos, lcMethodType, loEx + Endtry - RETURN - ENDPROC && SordMethod + Return + Endproc && SordMethod - PROCEDURE method2Array - LPARAMETERS tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; + Procedure method2Array + Lparameters tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; , taProtected, tnProtected_Count, toFoxBin2Prg, toRegObj - *-- 29/10/2013 Fernando D. Bozzo - *-- Se tiene en cuenta la posibilidad de que haya un PROC/ENDPROC dentro de un TEXT/ENDTEXT - *-- cuando es usado en un generador de código o similar. - EXTERNAL ARRAY taMethods, taCode, taPropsAndComments, taProtected +*-- 29/10/2013 Fernando D. Bozzo +*-- Se tiene en cuenta la posibilidad de que haya un PROC/ENDPROC dentro de un TEXT/ENDTEXT +*-- cuando es usado en un generador de código o similar. + External Array taMethods, taCode, taPropsAndComments, taProtected - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - *-- ESTRUCTURA DE LOS ARRAYS CREADOS: - *-- taMethods[1,3] - *-- 1.Nombre Método - *-- 2.Posición Original - *-- 3.Tipo (HIDDEN/PROTECTED/NORMAL) - *-- taCode[1] - *-- 1.Bloque de código del método en su posición original - TRY - LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; - , laLineasExclusion(1), lnBloquesExclusion, lcLastLine ; - , loEx AS EXCEPTION +*-- ESTRUCTURA DE LOS ARRAYS CREADOS: +*-- taMethods[1,3] +*-- 1.Nombre Método +*-- 2.Posición Original +*-- 3.Tipo (HIDDEN/PROTECTED/NORMAL) +*-- taCode[1] +*-- 1.Bloque de código del método en su posición original + Try + Local lnLineCount, laLine(1), I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; + , laLineasExclusion(1), lnBloquesExclusion, lcLastLine ; + , loEx As Exception - IF NOT EMPTY(m.tcMethod) AND LEFT(m.tcMethod,9) == "ENDPROC"+CHR(13)+CHR(10) - tcMethod = SUBSTR(m.tcMethod,10) - ENDIF + If Not Empty(m.tcMethod) And Left(m.tcMethod,9) == "ENDPROC"+Chr(13)+Chr(10) + tcMethod = Substr(m.tcMethod,10) + Endif - IF NOT EMPTY(m.tcMethod) - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - DIMENSION laLine(1) - STORE '' TO laLine, lcLine, lcLastLine - STORE 0 TO lnTextNodes + If Not Empty(m.tcMethod) + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' + Dimension laLine(1) + Store '' To laLine, lcLine, lcLastLine + Store 0 To lnTextNodes - lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE + lnLineCount = Alines(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE - *-- Delete beginning empty lines before first "PROCEDURE", that is the first not empty line. - FOR I = 1 TO lnLineCount - IF EMPTY(laLine(m.I)) OR LEFT( LTRIM(laLine(m.I)),1 ) = '*' - *-- Skip empty and commented lines - ELSE - IF m.I > 1 - FOR X = m.I-1 TO 1 STEP -1 - ADEL(laLine, m.X) - ENDFOR - lnLineCount = lnLineCount - m.I + 1 - DIMENSION laLine(lnLineCount) - ENDIF - EXIT - ENDIF - ENDFOR +*-- Delete beginning empty lines before first "PROCEDURE", that is the first not empty line. + For I = 1 To lnLineCount + If Empty(laLine(m.I)) Or Left( Ltrim(laLine(m.I)),1 ) = '*' +*-- Skip empty and commented lines + Else + If m.I > 1 + For X = m.I-1 To 1 Step -1 + Adel(laLine, m.X) + Endfor + lnLineCount = lnLineCount - m.I + 1 + Dimension laLine(lnLineCount) + Endif + Exit + Endif + Endfor - *-- Delete ending empty lines after last "ENDPROC", that is the last not empty line. - FOR I = lnLineCount TO 1 STEP -1 - IF EMPTY(laLine(m.I)) OR LEFT( LTRIM(laLine(m.I)),1 ) = '*' - ADEL(laLine, m.I) - ELSE - IF m.I < lnLineCount - lnLineCount = m.I - DIMENSION laLine(lnLineCount) - ENDIF - EXIT - ENDIF - ENDFOR +*-- Delete ending empty lines after last "ENDPROC", that is the last not empty line. + For I = lnLineCount To 1 Step -1 + If Empty(laLine(m.I)) Or Left( Ltrim(laLine(m.I)),1 ) = '*' + Adel(laLine, m.I) + Else + If m.I < lnLineCount + lnLineCount = m.I + Dimension laLine(lnLineCount) + Endif + Exit + Endif + Endfor - *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - .identifyExclusionBlocks( @laLine, lnLineCount, .F., @laLineasExclusion, @lnBloquesExclusion ) +*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF + .identifyExclusionBlocks( @laLine, lnLineCount, .F., @laLineasExclusion, @lnBloquesExclusion ) - *-- Analyze and count line methods, get method names and consolidate block code - FOR I = 1 TO lnLineCount - IF toFoxBin2Prg.l_RemoveNullCharsFromCode - laLine(m.I) = CHRTRAN( laLine(m.I), C_NULL_CHAR, '' ) - ENDIF +*-- Analyze and count line methods, get method names and consolidate block code + For I = 1 To lnLineCount + If toFoxBin2Prg.l_RemoveNullCharsFromCode + laLine(m.I) = Chrtran( laLine(m.I), C_NULL_CHAR, '' ) + Endif - lnLine_Len = LEN( laLine(m.I) ) - lcLastLine = lcLine - toFoxBin2Prg.set_Line( @lcLine, @laLine, m.I ) - .get_SeparatedLineAndComment( @lcLine ) + lnLine_Len = Len( laLine(m.I) ) + lcLastLine = lcLine + toFoxBin2Prg.set_Line( @lcLine, @laLine, m.I ) + .get_SeparatedLineAndComment( @lcLine ) - DO CASE - CASE laLineasExclusion(m.I) - IF tnMethodCount > 0 AND llProcOpen - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(m.I) + CR_LF - ELSE - *-- Invalid method code, as outer code added for tools like ReFox or others, is cleaned up - ENDIF + Do Case + Case laLineasExclusion(m.I) + If tnMethodCount > 0 And llProcOpen + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(m.I) + CR_LF + Else +*-- Invalid method code, as outer code added for tools like ReFox or others, is cleaned up + Endif - CASE RIGHT(lcLastLine,1) == ';' - *-- Saltear el análisis de esta línea, que es continuación de la anterior (lcLastLine). - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(m.I) + CR_LF - LOOP + Case Right(lcLastLine,1) == ';' +*-- Saltear el análisis de esta línea, que es continuación de la anterior (lcLastLine). + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(m.I) + CR_LF + Loop - CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 10) ) == 'PROCEDURE ' - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 11), 0, CHR(9), CHR(0), ' ' ) - taMethods(tnMethodCount, 2) = tnMethodCount - taMethods(tnMethodCount, 3) = '' - taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF - llProcOpen = .T. - - CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 9) ) == 'FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 10), 0, CHR(9), CHR(0), ' ' ) - taMethods(tnMethodCount, 2) = tnMethodCount - taMethods(tnMethodCount, 3) = '' - taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF - llProcOpen = .T. - - CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 17) ) == 'HIDDEN PROCEDURE ' - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 18), 0, CHR(9), CHR(0), ' ' ) - taMethods(tnMethodCount, 2) = tnMethodCount - taMethods(tnMethodCount, 3) = 'HIDDEN ' - taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF - llProcOpen = .T. - - CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 16) ) == 'HIDDEN FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 17), 0, CHR(9), CHR(0), ' ' ) - taMethods(tnMethodCount, 2) = tnMethodCount - taMethods(tnMethodCount, 3) = 'HIDDEN ' - taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF - llProcOpen = .T. - - CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 20) ) == 'PROTECTED PROCEDURE ' - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 21), 0, CHR(9), CHR(0), ' ' ) - taMethods(tnMethodCount, 2) = tnMethodCount - taMethods(tnMethodCount, 3) = 'PROTECTED ' - taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF - llProcOpen = .T. - - CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 19) ) == 'PROTECTED FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 20), 0, CHR(9), CHR(0), ' ' ) - taMethods(tnMethodCount, 2) = tnMethodCount - taMethods(tnMethodCount, 3) = 'PROTECTED ' - taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF - llProcOpen = .T. - - CASE lnTextNodes = 0 AND LEFT(lcLine, 7) == 'ENDPROC' - IF lnLine_Len >= 7 AND LEFT( UPPER( CHRTRAN( lcLine , '&'+CHR(9)+CHR(0), ' ') ) + ' ' ,8) == 'ENDPROC ' - *-- Es el final de estructura ENDPROC - IF NOT llProcOpen - *-- Esto no es normal, porque hay más de un ENDPROC, por lo que se ignora. - LOOP - ENDIF - ELSE - *-- Es otra cosa (variable, etc) - taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF - LOOP - ENDIF - - taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF - llProcOpen = .F. - - CASE lnTextNodes = 0 AND LEFT(laLine(m.I), 7) == 'ENDFUNC' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT - IF lnLine_Len >= 7 AND LEFT( UPPER( CHRTRAN( laLine(m.I) , '&'+CHR(9)+CHR(0), ' ') ) + ' ' ,8) == 'ENDFUNC ' - *-- Es el final de estructura ENDPROC - IF NOT llProcOpen - *-- Esto no es normal, porque hay más de un ENDFUNC, por lo que se ignora. - LOOP - ENDIF - lcLine = STRTRAN( lcLine, 'ENDFUNC', 'ENDPROC' ) - ELSE - *-- Es otra cosa (variable, etc) - taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF - LOOP - ENDIF - - taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF - llProcOpen = .F. - - *CASE tnMethodCount = 0 OR NOT llProcOpen AND LEFT( LTRIM(laLine(m.I)),1 ) = '*' - CASE tnMethodCount = 0 OR NOT llProcOpen - *-- Skip empty and commented lines before methods begin - *-- Aquí como condición podría poner: NOT llProcOpen AND LEFT(laLine(m.I), 7) # 'ENDPROC', pero abarcaría demasiado. - - OTHERWISE && Method Code - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(m.I) + CR_LF - - ENDCASE - ENDFOR - - *-- Agrego los métodos definidos, pero sin código (Protected/Reserved3) - FOR I = 1 TO tnPropsAndComments_Count - lcMethod = CHRTRAN( taPropsAndComments(m.I,1), '*', '' ) - IF LEFT( taPropsAndComments(m.I,1), 1 ) == '*' AND ASCAN( taMethods, lcMethod, 1, 0, 1, 1+2+4+8 ) = 0 - tnMethodCount = tnMethodCount + 1 - DIMENSION taMethods(tnMethodCount, 3) &&, taCode(tnMethodCount) - taMethods(tnMethodCount, 1) = lcMethod - taMethods(tnMethodCount, 2) = 0 - - lnProtectedLine = ASCAN( taProtected, lcMethod, 1, 0, 1, 1+2+4+8 ) - - IF lnProtectedLine = 0 THEN - IF tnProtected_Count = 0 - lnProtectedLine = 0 - ELSE - lnProtectedLine = ASCAN( taProtected, lcMethod + '^', 1, 0, 1, 1+2+4+8 ) - ENDIF - - IF lnProtectedLine = 0 THEN + Case lnTextNodes = 0 And Upper( Left(lcLine, 10) ) == 'PROCEDURE ' + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = Rtrim( Substr(lcLine, 11), 0, Chr(9), Chr(0), ' ' ) + taMethods(tnMethodCount, 2) = tnMethodCount taMethods(tnMethodCount, 3) = '' - ELSE + taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF + llProcOpen = .T. + + Case lnTextNodes = 0 And Upper( Left(lcLine, 9) ) == 'FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = Rtrim( Substr(lcLine, 10), 0, Chr(9), Chr(0), ' ' ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = '' + taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF + llProcOpen = .T. + + Case lnTextNodes = 0 And Upper( Left(lcLine, 17) ) == 'HIDDEN PROCEDURE ' + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = Rtrim( Substr(lcLine, 18), 0, Chr(9), Chr(0), ' ' ) + taMethods(tnMethodCount, 2) = tnMethodCount taMethods(tnMethodCount, 3) = 'HIDDEN ' - ENDIF - ELSE - taMethods(tnMethodCount, 3) = 'PROTECTED ' - ENDIF - ENDIF - ENDFOR - ENDWITH && THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - ENDIF + taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF + llProcOpen = .T. - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Case lnTextNodes = 0 And Upper( Left(lcLine, 16) ) == 'HIDDEN FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = Rtrim( Substr(lcLine, 17), 0, Chr(9), Chr(0), ' ' ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = 'HIDDEN ' + taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF + llProcOpen = .T. - THROW + Case lnTextNodes = 0 And Upper( Left(lcLine, 20) ) == 'PROTECTED PROCEDURE ' + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = Rtrim( Substr(lcLine, 21), 0, Chr(9), Chr(0), ' ' ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = 'PROTECTED ' + taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF + llProcOpen = .T. - FINALLY - RELEASE tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; - , taProtected, tnProtected_Count, toFoxBin2Prg ; - , lnLineCount, laLine, I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; - , laLineasExclusion, lnBloquesExclusion ; - , loEx - ENDTRY + Case lnTextNodes = 0 And Upper( Left(lcLine, 19) ) == 'PROTECTED FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = Rtrim( Substr(lcLine, 20), 0, Chr(9), Chr(0), ' ' ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = 'PROTECTED ' + taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(m.I) + CR_LF + llProcOpen = .T. - RETURN - ENDPROC && method2Array + Case lnTextNodes = 0 And Left(lcLine, 7) == 'ENDPROC' + If lnLine_Len >= 7 And Left( Upper( Chrtran( lcLine , '&'+Chr(9)+Chr(0), ' ') ) + ' ' ,8) == 'ENDPROC ' +*-- Es el final de estructura ENDPROC + If Not llProcOpen +*-- Esto no es normal, porque hay más de un ENDPROC, por lo que se ignora. + Loop + Endif + Else +*-- Es otra cosa (variable, etc) + taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF + Loop + Endif + + taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF + llProcOpen = .F. + + Case lnTextNodes = 0 And Left(laLine(m.I), 7) == 'ENDFUNC' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT + If lnLine_Len >= 7 And Left( Upper( Chrtran( laLine(m.I) , '&'+Chr(9)+Chr(0), ' ') ) + ' ' ,8) == 'ENDFUNC ' +*-- Es el final de estructura ENDPROC + If Not llProcOpen +*-- Esto no es normal, porque hay más de un ENDFUNC, por lo que se ignora. + Loop + Endif + lcLine = Strtran( lcLine, 'ENDFUNC', 'ENDPROC' ) + Else +*-- Es otra cosa (variable, etc) + taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF + Loop + Endif + + taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF + llProcOpen = .F. + +*CASE tnMethodCount = 0 OR NOT llProcOpen AND LEFT( LTRIM(laLine(m.I)),1 ) = '*' + Case tnMethodCount = 0 Or Not llProcOpen +*-- Skip empty and commented lines before methods begin +*-- Aquí como condición podría poner: NOT llProcOpen AND LEFT(laLine(m.I), 7) # 'ENDPROC', pero abarcaría demasiado. + + Otherwise && Method Code + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(m.I) + CR_LF + + Endcase + Endfor + +*-- Agrego los métodos definidos, pero sin código (Protected/Reserved3) + For I = 1 To tnPropsAndComments_Count + lcMethod = Chrtran( taPropsAndComments(m.I,1), '*', '' ) + If Left( taPropsAndComments(m.I,1), 1 ) == '*' And Ascan( taMethods, lcMethod, 1, 0, 1, 1+2+4+8 ) = 0 + tnMethodCount = tnMethodCount + 1 + Dimension taMethods(tnMethodCount, 3) &&, taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = lcMethod + taMethods(tnMethodCount, 2) = 0 + + lnProtectedLine = Ascan( taProtected, lcMethod, 1, 0, 1, 1+2+4+8 ) + + If lnProtectedLine = 0 Then + If tnProtected_Count = 0 + lnProtectedLine = 0 + Else + lnProtectedLine = Ascan( taProtected, lcMethod + '^', 1, 0, 1, 1+2+4+8 ) + Endif + + If lnProtectedLine = 0 Then + taMethods(tnMethodCount, 3) = '' + Else + taMethods(tnMethodCount, 3) = 'HIDDEN ' + Endif + Else + taMethods(tnMethodCount, 3) = 'PROTECTED ' + Endif + Endif + Endfor + Endwith && THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' + Endif + + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif + + Throw + + Finally + Release tcMethod, taMethods, taCode, tcSorted, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count ; + , taProtected, tnProtected_Count, toFoxBin2Prg ; + , lnLineCount, laLine, I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; + , laLineasExclusion, lnBloquesExclusion ; + , loEx + Endtry + + Return + Endproc && method2Array - PROCEDURE write_ADD_OBJECTS_WithProperties - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * toRegObj (v! IN ) Objeto de registro - * tcCodigo (@? OUT) Codigo generado - * toFoxBin2Prg (v! IN ) Referencia al objeto principal - *--------------------------------------------------------------------------------------------------- - LPARAMETERS toRegObj, tcCodigo, toFoxBin2Prg + Procedure write_ADD_OBJECTS_WithProperties +*--------------------------------------------------------------------------------------------------- +* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) +* toRegObj (v! IN ) Objeto de registro +* tcCodigo (@? OUT) Codigo generado +* toFoxBin2Prg (v! IN ) Referencia al objeto principal +*--------------------------------------------------------------------------------------------------- + Lparameters toRegObj, tcCodigo, toFoxBin2Prg - #IF .F. - LOCAL toRegObj AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toRegObj As CL_OBJETO Of 'FOXBIN2PRG.PRG' + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count + Try + Local lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - *-- Defino los objetos a cargar - .get_PropsAndValuesFrom_PROPERTIES( toRegObj.PROPERTIES, 1, @laPropsAndValues, @lnPropsAndValues_Count, @lcMemo, @toFoxBin2Prg ) - lcMemo = .set_MultilineMemoWithAddObjectProperties( @laPropsAndValues, @lnPropsAndValues_Count, C_TAB + C_TAB, .T. ) + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' +*-- Defino los objetos a cargar + .get_PropsAndValuesFrom_PROPERTIES( toRegObj.PROPERTIES, 1, @laPropsAndValues, @lnPropsAndValues_Count, @lcMemo, @toFoxBin2Prg ) + lcMemo = .set_MultilineMemoWithAddObjectProperties( @laPropsAndValues, @lnPropsAndValues_Count, C_TAB + C_TAB, .T. ) - IF '.' $ toRegObj.PARENT - *-- Este caso: clase.objeto.objeto ==> se quita clase - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + If '.' $ toRegObj.Parent +*-- Este caso: clase.objeto.objeto ==> se quita clase + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> ADD OBJECT '<>.<>' AS <> <<>> - ENDTEXT - ELSE - *-- Este caso: objeto - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + ENDTEXT + Else +*-- Este caso: objeto + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> ADD OBJECT '<>' AS <> <<>> - ENDTEXT - ENDIF + ENDTEXT + Endif - IF NOT EMPTY(lcMemo) - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + If Not Empty(lcMemo) + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> ; <> - ENDTEXT - ENDIF + ENDTEXT + Endif - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <><> <<>> - ENDTEXT - - IF NOT EMPTY(toRegObj.CLASSLOC) - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - ClassLib="<>" <<>> ENDTEXT - ENDIF - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 - BaseClass="<>" <<>> - ENDTEXT + If Not Empty(toRegObj.CLASSLOC) + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + ClassLib="<>" <<>> + ENDTEXT + Endif - *-- Agrego metainformación para objetos OLE - IF toRegObj.BASECLASS == 'olecontrol' TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 + BaseClass="<>" <<>> + ENDTEXT + +*-- Agrego metainformación para objetos OLE + If toRegObj.BaseClass == 'olecontrol' + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 OLEObject="< 0 Then + Store '' To lcMethods + Dimension laMethods(1,3) - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' .sortMethod( @tcMethods, @taMethods, @taCode, '', @tnMethodCount ; , @taPropsAndComments, tnPropsAndComments_Count, @taProtected, tnProtected_Count, @toFoxBin2Prg ) lcMethods = C_TAB - FOR I = 1 TO tnMethodCount - *-- Genero los métodos indentados - *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso - IF taMethods(m.I,2) = 0 - LOOP - ENDIF + For I = 1 To tnMethodCount +*-- Genero los métodos indentados +*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso + If taMethods(m.I,2) = 0 + Loop + Endif - lcMethods = lcMethods + CR_LF + .indentMemo( taCode(taMethods(m.I,2)), CHR(9) + CHR(9), .T. ) + CR_LF - ENDFOR - ENDWITH && THIS + lcMethods = lcMethods + CR_LF + .indentMemo( taCode(taMethods(m.I,2)), Chr(9) + Chr(9), .T. ) + CR_LF + Endfor + Endwith && THIS tcCodigo = tcCodigo + lcMethods - ENDIF + Endif - RELEASE tcMethods, taMethods, taCode, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count, toFoxBin2Prg ; + Release tcMethods, taMethods, taCode, tnMethodCount, taPropsAndComments, tnPropsAndComments_Count, taProtected, tnProtected_Count, toFoxBin2Prg ; , laMethods, laCode, lnMethodCount, I, lcMethods - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_CLASS_PROPERTIES - LPARAMETERS toRegClass, taPropsAndValues, taPropsAndComments, taProtected ; + Procedure write_CLASS_PROPERTIES + Lparameters toRegClass, taPropsAndValues, taPropsAndComments, taProtected ; , tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count, tcCodigo, toFoxBin2Prg - EXTERNAL ARRAY taPropsAndValues, taPropsAndComments + External Array taPropsAndValues, taPropsAndComments - TRY - LOCAL lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, I ; - , lcPropName, lnProtectedItem, lcComentarios ; - , loEx as Exception + Try + Local lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, I ; + , lcPropName, lnProtectedItem, lcComentarios ; + , loEx As Exception - WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' - *-- DEFINIR PROPIEDADES ( HIDDEN, PROTECTED, *DEFINED_PAM ) - DIMENSION taProtected(1) - STORE '' TO lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd - STORE 0 TO tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count - .get_PropsAndValuesFrom_PROPERTIES( toRegClass.PROPERTIES, 1, @taPropsAndValues, @tnPropsAndValues_Count, '', @toFoxBin2Prg ) - .get_PropsAndCommentsFrom_RESERVED3( toRegClass.RESERVED3, .T., @taPropsAndComments, @tnPropsAndComments_Count, '' ) - .get_PropsFrom_PROTECTED( toRegClass.PROTECTED, .T., @taProtected, @tnProtected_Count, '' ) + With This As c_conversor_bin_a_prg Of 'FOXBIN2PRG.PRG' +*-- DEFINIR PROPIEDADES ( HIDDEN, PROTECTED, *DEFINED_PAM ) + Dimension taProtected(1) + Store '' To lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd + Store 0 To tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count + .get_PropsAndValuesFrom_PROPERTIES( toRegClass.PROPERTIES, 1, @taPropsAndValues, @tnPropsAndValues_Count, '', @toFoxBin2Prg ) + .get_PropsAndCommentsFrom_RESERVED3( toRegClass.RESERVED3, .T., @taPropsAndComments, @tnPropsAndComments_Count, '' ) + .get_PropsFrom_PROTECTED( toRegClass.Protected, .T., @taProtected, @tnProtected_Count, '' ) - IF tnPropsAndValues_Count > 0 THEN - .classify_PAM_Hidden_Protected( @tnPropsAndValues_Count, @taPropsAndValues, @tnProtected_Count, @taProtected ; - , @tnPropsAndComments_Count, @taPropsAndComments, @lcHiddenProp, @lcProtectedProp ) - .write_DEFINED_PAM( @taPropsAndComments, tnPropsAndComments_Count, @tcCodigo ) - .write_HIDDEN_Properties( @lcHiddenProp, @tcCodigo ) - .write_PROTECTED_Properties( @lcProtectedProp, @tcCodigo ) + If tnPropsAndValues_Count > 0 Then + .classify_PAM_Hidden_Protected( @tnPropsAndValues_Count, @taPropsAndValues, @tnProtected_Count, @taProtected ; + , @tnPropsAndComments_Count, @taPropsAndComments, @lcHiddenProp, @lcProtectedProp ) + .write_DEFINED_PAM( @taPropsAndComments, tnPropsAndComments_Count, @tcCodigo ) + .write_HIDDEN_Properties( @lcHiddenProp, @tcCodigo ) + .write_PROTECTED_Properties( @lcProtectedProp, @tcCodigo ) - *-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes) - FOR I = 1 TO tnPropsAndValues_Count - tcCodigo = tcCodigo + CHR(13) + CHR(10) + CHR(9) + taPropsAndValues(m.I,1) + ' = ' + taPropsAndValues(m.I,2) +*-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes) + For I = 1 To tnPropsAndValues_Count + tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + taPropsAndValues(m.I,1) + ' = ' + taPropsAndValues(m.I,2) - IF tnPropsAndComments_Count > 0 THEN - lnComment = ASCAN( taPropsAndComments, taPropsAndValues(m.I,1), 1, 0, 1, 1+2+4+8) + If tnPropsAndComments_Count > 0 Then + lnComment = Ascan( taPropsAndComments, taPropsAndValues(m.I,1), 1, 0, 1, 1+2+4+8) - IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2)) - tcCodigo = tcCodigo + CHR(9) + CHR(9) + '&' + '& ' + taPropsAndComments(lnComment,2) - ENDIF - ENDIF - ENDFOR + If lnComment > 0 And Not Empty(taPropsAndComments(lnComment,2)) + tcCodigo = tcCodigo + Chr(9) + Chr(9) + '&' + '& ' + taPropsAndComments(lnComment,2) + Endif + Endif + Endfor - TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> - ENDTEXT - ENDIF - ENDWITH && THIS + ENDTEXT + Endif + Endwith && THIS - CATCH TO loEx - IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF + Catch To loEx + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - RELEASE toRegClass, taPropsAndValues, taPropsAndComments, taProtected ; - , tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count ; - , lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, I ; - , lcPropName, lnProtectedItem, lcComentarios, loEx - ENDTRY + Finally + Release toRegClass, taPropsAndValues, taPropsAndComments, taProtected ; + , tnPropsAndValues_Count, tnPropsAndComments_Count, tnProtected_Count ; + , lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, I ; + , lcPropName, lnProtectedItem, lcComentarios, loEx + Endtry - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_DEFINED_PAM - *-- Escribo propiedades DEFINED (Reserved3) en este formato: - LPARAMETERS taPropsAndComments, tnPropsAndComments_Count, tcCodigo + Procedure write_DEFINED_PAM +*-- Escribo propiedades DEFINED (Reserved3) en este formato: + Lparameters taPropsAndComments, tnPropsAndComments_Count, tcCodigo - * - *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! - *m: *mimetodo && Mi metodo - *p: prop1 && Mi prop 1 - *p: prop_especial_cr && - *a: ^array_1_d[1,0] && Array 1 dimensión (1) - *a: ^array_2_d[1,2] && Array una dimension (1,2) - *p: _memberdata && XML Metadata for customizable properties - * +* +*m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! +*m: *mimetodo && Mi metodo +*p: prop1 && Mi prop 1 +*p: prop_especial_cr && +*a: ^array_1_d[1,0] && Array 1 dimensión (1) +*a: ^array_2_d[1,2] && Array una dimension (1,2) +*p: _memberdata && XML Metadata for customizable properties +* - IF tnPropsAndComments_Count > 0 - LOCAL I, lcPropsMethodsDefd, lcType + If tnPropsAndComments_Count > 0 + Local I, lcPropsMethodsDefd, lcType lcPropsMethodsDefd = '' TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> ENDTEXT - FOR I = 1 TO tnPropsAndComments_Count - IF EMPTY(taPropsAndComments(m.I,1)) - LOOP - ENDIF + For I = 1 To tnPropsAndComments_Count + If Empty(taPropsAndComments(m.I,1)) + Loop + Endif - lcType = LEFT( taPropsAndComments(m.I,1), 1 ) - lcType = ICASE( lcType == '*', 'm' ; + lcType = Left( taPropsAndComments(m.I,1), 1 ) + lcType = Icase( lcType == '*', 'm' ; , lcType == '^', 'a' ; , 'p' ) - IF lcType == 'p' THEN - tcCodigo = tcCodigo + CHR(13) + CHR(10) + CHR(9) + CHR(9) + '*' + lcType + ': ' + taPropsAndComments(m.I,1) - ELSE - tcCodigo = tcCodigo + CHR(13) + CHR(10) + CHR(9) + CHR(9) + '*' + lcType + ': ' + SUBSTR( taPropsAndComments(m.I,1), 2) - ENDIF + If lcType == 'p' Then + tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + Chr(9) + '*' + lcType + ': ' + taPropsAndComments(m.I,1) + Else + tcCodigo = tcCodigo + Chr(13) + Chr(10) + Chr(9) + Chr(9) + '*' + lcType + ': ' + Substr( taPropsAndComments(m.I,1), 2) + Endif - IF NOT EMPTY(taPropsAndComments(m.I,2)) - tcCodigo = tcCodigo + CHR(9) + CHR(9) + '&' + '& ' + taPropsAndComments(m.I,2) - ENDIF - ENDFOR + If Not Empty(taPropsAndComments(m.I,2)) + tcCodigo = tcCodigo + Chr(9) + Chr(9) + '&' + '& ' + taPropsAndComments(m.I,2) + Endif + Endfor TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> @@ -15156,137 +15171,137 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base tcCodigo = tcCodigo + CR_LF - RELEASE I, lcPropsMethodsDefd, lcType - ENDIF + Release I, lcPropsMethodsDefd, lcType + Endif - RELEASE taPropsAndComments, tnPropsAndComments_Count - RETURN - ENDPROC + Release taPropsAndComments, tnPropsAndComments_Count + Return + Endproc - PROCEDURE write_DEFINE_CLASS - LPARAMETERS ta_NombresObjsOle, toRegClass, tcCodigo + Procedure write_DEFINE_CLASS + Lparameters ta_NombresObjsOle, toRegClass, tcCodigo - LOCAL lcOF_Classlib, llOleObject + Local lcOF_Classlib, llOleObject lcOF_Classlib = '' - llOleObject = ( ASCAN( ta_NombresObjsOle, toRegClass.OBJNAME, 1, 0, 1, 1+2+4+8) > 0 ) + llOleObject = ( Ascan( ta_NombresObjsOle, toRegClass.OBJNAME, 1, 0, 1, 1+2+4+8) > 0 ) - IF NOT EMPTY(toRegClass.CLASSLOC) - lcOF_Classlib = 'OF "' + LOWER(ALLTRIM(toRegClass.CLASSLOC)) + '" ' - ENDIF + If Not Empty(toRegClass.CLASSLOC) + lcOF_Classlib = 'OF "' + Lower(Alltrim(toRegClass.CLASSLOC)) + '" ' + Endif - *-- DEFINICIÓN DE LA CLASE ( DEFINE CLASS 'className' AS 'classType' [OF 'classLib'] [OLEPUBLIC] ) +*-- DEFINICIÓN DE LA CLASE ( DEFINE CLASS 'className' AS 'classType' [OF 'classLib'] [OLEPUBLIC] ) TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<'DEFINE CLASS'>> <> AS <> <> ENDTEXT - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_DEFINE_CLASS_COMMENTS - LPARAMETERS toRegClass, tcCodigo - *-- Comentario de la clase - IF NOT EMPTY(toRegClass.RESERVED7) THEN - *-- Si es multilínea, debe ir en un tag aparte - IF OCCURS( CHR(13), toRegClass.RESERVED7 ) > 0 THEN + Procedure write_DEFINE_CLASS_COMMENTS + Lparameters toRegClass, tcCodigo +*-- Comentario de la clase + If Not Empty(toRegClass.RESERVED7) Then +*-- Si es multilínea, debe ir en un tag aparte + If Occurs( Chr(13), toRegClass.RESERVED7 ) > 0 Then TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> <> <<>> <> ENDTEXT - ELSE && Comentario in-line + Else && Comentario in-line TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <<>> <<'&'+'&'>> <> ENDTEXT - ENDIF - ENDIF + Endif + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_ENDDEFINE_IfApplicable - LPARAMETERS tnLastClass, tcCodigo - IF tnLastClass = 1 + Procedure write_ENDDEFINE_IfApplicable + Lparameters tnLastClass, tcCodigo + If tnLastClass = 1 TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<'ENDDEFINE'>> <<>> ENDTEXT - ENDIF + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_EXTERNAL_CLASS_HEADER - LPARAMETERS toRegClass, toFoxBin2Prg, tcCodigo - *-- < EXTERNAL_CLASS Name = "class-name" Baseclass="base-class" /> - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + Procedure write_EXTERNAL_CLASS_HEADER + Lparameters toRegClass, toFoxBin2Prg, tcCodigo +*-- < EXTERNAL_CLASS Name = "class-name" Baseclass="base-class" /> + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - IF EMPTY(tcCodigo) THEN + If Empty(tcCodigo) Then TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 *-- EXTERNAL_CLASS identify external member Class names / EXTERNAL_CLASS identifica los nombres de las Clases externas ENDTEXT - ENDIF + Endif TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> Name="<>" Baseclass="<>" <> ENDTEXT - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_EXTERNAL_MEMBER_HEADER - LPARAMETERS toFoxBin2Prg, tcMemberName, tcMemberType, tcCodigo - *-- < EXTERNAL_MEMBER Name = "member-name" Type="member-type" /> - #IF .F. - LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - #ENDIF + Procedure write_EXTERNAL_MEMBER_HEADER + Lparameters toFoxBin2Prg, tcMemberName, tcMemberType, tcCodigo +*-- < EXTERNAL_MEMBER Name = "member-name" Type="member-type" /> + #If .F. + Local toFoxBin2Prg As c_foxbin2prg Of 'FOXBIN2PRG.PRG' + #Endif - IF EMPTY(tcCodigo) THEN + If Empty(tcCodigo) Then TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 *-- EXTERNAL_MEMBER identify external member names / EXTERNAL_MEMBER identifica los nombres de los miembros externos ENDTEXT - ENDIF + Endif - IF NOT EMPTY(tcMemberName) AND NOT EMPTY(tcMemberType) THEN + If Not Empty(tcMemberName) And Not Empty(tcMemberType) Then TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> Name="<>" Type="<>" <> ENDTEXT - ENDIF + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_INCLUDE - LPARAMETERS toReg, tcCodigo - *-- #INCLUDE - IF NOT EMPTY(toReg.RESERVED8) THEN + Procedure write_INCLUDE + Lparameters toReg, tcCodigo +*-- #INCLUDE + If Not Empty(toReg.RESERVED8) Then TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> #INCLUDE "<>" ENDTEXT - ENDIF + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_CLASSMETADATA - LPARAMETERS toRegClass, tcCodigo + Procedure write_CLASSMETADATA + Lparameters toRegClass, tcCodigo - *-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid) +*-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid) TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> ENDTEXT @@ -15299,7 +15314,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base Uniqueid="<>" ENDTEXT - IF NOT EMPTY(toRegClass.OLE2) + If Not Empty(toRegClass.OLE2) TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 <<>> Nombre="<>" Parent="<>" @@ -15307,19 +15322,19 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base OLEObject="< se quita clase - lcNombre = SUBSTR(toRegObj.PARENT, AT('.', toRegObj.PARENT)+1) + '.' + toRegObj.OBJNAME - ELSE - *-- Este caso: objeto + If '.' $ toRegObj.Parent +*-- Este caso: clase.objeto.objeto ==> se quita clase + lcNombre = Substr(toRegObj.Parent, At('.', toRegObj.Parent)+1) + '.' + toRegObj.OBJNAME + Else +*-- Este caso: objeto lcNombre = toRegObj.OBJNAME - ENDIF + Endif TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 <<>> <> @@ -15360,1177 +15375,1177 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base <> ENDTEXT - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_HIDDEN_Properties - *-- Escribo la definición HIDDEN de propiedades - LPARAMETERS tcHiddenProp, tcCodigo + Procedure write_HIDDEN_Properties +*-- Escribo la definición HIDDEN de propiedades + Lparameters tcHiddenProp, tcCodigo - IF NOT EMPTY(tcHiddenProp) + If Not Empty(tcHiddenProp) TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> HIDDEN <> ENDTEXT - ENDIF + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_PROTECTED_Properties - *-- Escribo la definición PROTECTED de propiedades - LPARAMETERS tcProtectedProp, tcCodigo + Procedure write_PROTECTED_Properties +*-- Escribo la definición PROTECTED de propiedades + Lparameters tcProtectedProp, tcCodigo - IF NOT EMPTY(tcProtectedProp) + If Not Empty(tcProtectedProp) TEXT TO tcCodigo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> PROTECTED <> ENDTEXT - ENDIF + Endif - RETURN - ENDPROC + Return + Endproc - PROCEDURE write_TXT_REPORTE - LPARAMETERS toReg + Procedure write_TXT_REPORTE + Lparameters toReg - TRY - LOCAL lc_TAG_REPORTE_I, lc_TAG_REPORTE_F, loEx AS EXCEPTION - lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' ' - lc_TAG_REPORTE_F = '' + Try + Local lc_TAG_REPORTE_I, lc_TAG_REPORTE_F, loEx As Exception + lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' ' + lc_TAG_REPORTE_F = '' - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 objcode="<>" name="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 vpos="<>" hpos="<>" height="<>" width="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 order="<>" unique="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 environ="<>" boxchar="<>" fillchar="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 pengreen="<>" penblue="<>" fillred="<>" fillgreen="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 fillblue="<>" pensize="<>" penpat="<>" fillpat="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 fontface="<>" fontstyle="<>" fontsize="<>" mode="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 ruler="<>" rulerlines="<>" grid="<>" gridv="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 gridh="<>" float="<>" stretch="<>" stretchtop="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 top="<>" bottom="<>" suptype="<>" suprest="<>" norepeat="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 resetrpt="<>" pagebreak="<>" colbreak="<>" resetpage="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 general="<>" spacing="<>" double="<>" swapheader="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 swapfooter="<>" ejectbefor="<>" ejectafter="<>" plain="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 summary="<>" addalias="<>" offset="<>" topmargin="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 botmargin="<>" totaltype="<>" resettotal="<>" resoid="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 curpos="<>" supalways="<>" supovflow="<>" suprpcol="<>" <<>> - ENDTEXT + ENDTEXT - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 supgroup="<>" supvalchng="<>" <<>> - ENDTEXT + ENDTEXT - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - IF INLIST(toReg.ObjType, 25, 26) && Dataenvironment, cursors and relations - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - ELSE - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - ENDIF + If Inlist(toReg.ObjType, 25, 26) && Dataenvironment, cursors and relations + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + Else + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + Endif - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + "