From 1c2107b601d11bbb098a6521bf8b599e690bbe58 Mon Sep 17 00:00:00 2001 From: Lutz Date: Sun, 21 Feb 2021 20:03:51 +0100 Subject: [PATCH] Translation of help / create config files Translation of the config options to german Splitted help, to create config files templates Added options to create config files templates --- foxbin2prg.prg | 43265 ++++++++++++++++++++++++----------------------- 1 file changed, 21686 insertions(+), 21579 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 7159640..926ec3e 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -236,9 +236,11 @@ * 14/02/2021 Lutz Scheffler inserted option UseFilesPerDBC to split DBC processing from vcx / scx * 15/02/2021 Lutz Scheffler inserted option RedirectFilePerDBCToMain to split DBC processing from vcx / scx * 15/02/2021 Lutz Scheffler inserted option ItemPerDBCCheck to split DBC processing from vcx / scx -* the tree above are straight forward, so no extra comment ar within the code +* the three above are straight forward, so no extra comment ar within the code * 19/02/2021 Lutz Scheffler inserted option DBF_BinChar_Base64 to allow processing of NoCPTrans fields in non base64 way * 20/02/2021 Lutz Scheffler inserted option DBF_IncludeDeleted to allow including deleted records of DBF +* 21/02/2021 Lutz Scheffler German translation improved +* 21/02/2021 Lutz Scheffler added option to create config file template * @@ -410,215 +412,215 @@ *--------------------------------------------------------------------------------------------------- * 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_DEL_RECORD_I '' && *** Lutz Scheffler 2021/02/20: Deleted Record, just mark like this, no fuzz with field name -#DEFINE C_DEL_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_DEL_RECORD_I '' && *** Lutz Scheffler 2021/02/20: Deleted Record, just mark like this, no fuzz with field name +#Define C_DEL_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 @@ -632,53 +634,58 @@ 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 +*!* Changed by: Lutz Scheffler 15.2.2021 +*!* change date="{^2021-02-15,18:44:00}" +* added option to create config files +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; + OR Atc('-C','-'+tc_InputFile) > 0 OR Atc('-T','-'+tc_InputFile) > 0 Then pcParamX = tc_InputFile tc_InputFile = tcType tcType = pcParamX - RELEASE pcParamX -ENDIF + Release pcParamX +Endif +*!* /Changed by: Lutz Scheffler 15.2.2021 -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 @@ -686,9 +693,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 @@ -701,8 +708,8 @@ DECLARE INTEGER TerminateProcess IN Win32API INTEGER hProcess, INTEGER uExitCode -DEFINE CLASS c_foxbin2prg AS Session - _MEMBERDATA = [] ; +Define Class c_foxbin2prg As Session + _MemberData = [] ; + [] ; + [] ; + [] ; @@ -832,12 +839,12 @@ DEFINE CLASS c_foxbin2prg AS Session *!* + [] ; *!* ;&& /SF - 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_Language = '' && EN, FR, ES, DE c_SimulateError = '' && SIMERR_I0, SIMERR_I1, SIMERR_O1 c_loc_processing_file = '' @@ -846,7 +853,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. @@ -913,13 +920,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 @@ -946,388 +953,388 @@ 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 + Endif + Endfor + Endwith - RETURN lnCount - ENDFUNC + 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_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 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 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 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 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 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 *!* Changed by: Lutz Scheffler 21.02.2021 @@ -1335,1518 +1342,1518 @@ DEFINE CLASS c_foxbin2prg AS Session * additional options controlling * - splitt of DBC separated from VCX/SCX * - new operations of DBF - PROCEDURE n_UseFilesPerDBC_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.n_UseFilesPerDBC - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).n_UseFilesPerDBC, THIS.n_UseFilesPerDBC ) - ENDIF - ENDPROC + Procedure n_UseFilesPerDBC_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.n_UseFilesPerDBC + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).n_UseFilesPerDBC, This.n_UseFilesPerDBC ) + Endif + Endproc - PROCEDURE l_RedirectFilePerDBCToMain_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_RedirectFilePerDBCToMain - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_RedirectFilePerDBCToMain, THIS.l_RedirectFilePerDBCToMain ) - ENDIF - ENDPROC + Procedure l_RedirectFilePerDBCToMain_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_RedirectFilePerDBCToMain + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_RedirectFilePerDBCToMain, This.l_RedirectFilePerDBCToMain ) + Endif + Endproc - PROCEDURE l_ItemPerDBCCheck_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_ItemPerDBCCheck - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_ItemPerDBCCheck, THIS.l_ItemPerDBCCheck ) - ENDIF - ENDPROC + Procedure l_ItemPerDBCCheck_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_ItemPerDBCCheck + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_ItemPerDBCCheck, This.l_ItemPerDBCCheck ) + Endif + Endproc - PROCEDURE l_DBF_BinChar_Base64_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_DBF_BinChar_Base64 - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_DBF_BinChar_Base64, THIS.l_DBF_BinChar_Base64 ) - ENDIF - ENDPROC + Procedure l_DBF_BinChar_Base64_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_DBF_BinChar_Base64 + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_DBF_BinChar_Base64, This.l_DBF_BinChar_Base64 ) + Endif + Endproc - PROCEDURE l_DBF_IncludeDeleted_ACCESS - IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) ) - RETURN THIS.l_DBF_IncludeDeleted - ELSE - RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).l_DBF_IncludeDeleted, THIS.l_DBF_IncludeDeleted ) - ENDIF - ENDPROC + Procedure l_DBF_IncludeDeleted_ACCESS + If This.n_CFG_Actual = 0 Or Isnull( This.o_Configuration( This.n_CFG_Actual ) ) + Return This.l_DBF_IncludeDeleted + Else + Return Nvl( This.o_Configuration( This.n_CFG_Actual ).l_DBF_IncludeDeleted, This.l_DBF_IncludeDeleted ) + Endif + Endproc *!* /Changed by: Lutz Scheffler 21.02.2021 - 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 ; + 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), 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 *!* Changed by: Lutz Scheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - splitt of DBC separated from VCX/SCX * - new operations of DBF - CASE LEFT( laConfig(m.I), 15 ) == LOWER('UseFilesPerDBC:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 16 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.n_UseFilesPerDBC = INT( VAL(lcValue) ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > UseFilesPerDBC: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 15 ) == Lower('UseFilesPerDBC:') + lcValue = Alltrim( Substr( laConfig(m.I), 16 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.n_UseFilesPerDBC = Int( Val(lcValue) ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > UseFilesPerDBC: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 25 ) == LOWER('RedirectFilePerDBCToMain:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 26 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_RedirectFilePerDBCToMain = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > RedirectFilePerDBCToMain: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 25 ) == Lower('RedirectFilePerDBCToMain:') + lcValue = Alltrim( Substr( laConfig(m.I), 26 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_RedirectFilePerDBCToMain = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > RedirectFilePerDBCToMain: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 16 ) == LOWER('ItemPerDBCCheck:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 17 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_ItemPerDBCCheck = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > ItemPerDBCCheck: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 16 ) == Lower('ItemPerDBCCheck:') + lcValue = Alltrim( Substr( laConfig(m.I), 17 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_ItemPerDBCCheck = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > ItemPerDBCCheck: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 19 ) == LOWER('DBF_BinChar_Base64:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 20 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_DBF_BinChar_Base64 = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_BinChar_Base64: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 19 ) == Lower('DBF_BinChar_Base64:') + lcValue = Alltrim( Substr( laConfig(m.I), 20 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_DBF_BinChar_Base64 = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > DBF_BinChar_Base64: ' + Transform(lcValue) ) + Endif - CASE LEFT( laConfig(m.I), 19 ) == LOWER('DBF_IncludeDeleted:') - lcValue = ALLTRIM( SUBSTR( laConfig(m.I), 20 ) ) - IF INLIST( lcValue, '0', '1' ) THEN - lo_CFG.l_DBF_IncludeDeleted = ( TRANSFORM(lcValue) == '1' ) - .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_IncludeDeleted: ' + TRANSFORM(lcValue) ) - ENDIF + Case Left( laConfig(m.I), 19 ) == Lower('DBF_IncludeDeleted:') + lcValue = Alltrim( Substr( laConfig(m.I), 20 ) ) + If Inlist( lcValue, '0', '1' ) Then + lo_CFG.l_DBF_IncludeDeleted = ( Transform(lcValue) == '1' ) + .writeLog( C_TAB + Justfname(lcConfigFile) + ' > DBF_IncludeDeleted: ' + Transform(lcValue) ) + Endif *!* /Changed by: Lutz Scheffler 21.02.2021 - 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), 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), 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), 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('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), 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), 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), 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), 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), 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), 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('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('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('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('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('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('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('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('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('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('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('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('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('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('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('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('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('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('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), 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), 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), 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), 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('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), 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), 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), 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), 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), 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), 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), 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) ) + 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 + 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) ) +*!* Changed by: Lutz Scheffler 21.02.2021 +*!* change date="{^2021-02-21,10:57:00}" +* additional options controlling +* - splitt of DBC separated from VCX/SCX +* - new operations of DBF + .writeLog( C_TAB + 'n_UseFilesPerDBC: ' + Transform(.n_UseFilesPerDBC) ) + .writeLog( C_TAB + 'l_RedirectFilePerDBCToMain: ' + Transform(.l_RedirectFilePerDBCToMain) ) + .writeLog( C_TAB + 'l_ItemPerDBCCheck: ' + Transform(.l_ItemPerDBCCheck) ) + .writeLog( C_TAB + 'l_DBF_BinChar_Base64: ' + Transform(.l_DBF_BinChar_Base64) ) + .writeLog( C_TAB + 'l_DBF_IncludeDeleted: ' + Transform(.l_DBF_IncludeDeleted) ) +*!* /Changed by: Lutz Scheffler 21.02.2021 + .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) ) -*!* Changed by: Lutz Scheffler 21.02.2021 -*!* change date="{^2021-02-21,10:57:00}" -* additional options controlling -* - splitt of DBC separated from VCX/SCX -* - new operations of DBF - .writeLog( C_TAB + 'n_UseFilesPerDBC: ' + TRANSFORM(.n_UseFilesPerDBC) ) - .writeLog( C_TAB + 'l_RedirectFilePerDBCToMain: ' + TRANSFORM(.l_RedirectFilePerDBCToMain) ) - .writeLog( C_TAB + 'l_ItemPerDBCCheck: ' + TRANSFORM(.l_ItemPerDBCCheck) ) - .writeLog( C_TAB + 'l_DBF_BinChar_Base64: ' + TRANSFORM(.l_DBF_BinChar_Base64) ) - .writeLog( C_TAB + 'l_DBF_IncludeDeleted: ' + TRANSFORM(.l_DBF_IncludeDeleted) ) -*!* /Changed by: Lutz Scheffler 21.02.2021 - .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 *!* Changed by: Lutz Scheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF *!* /Changed by: Lutz Scheffler 21.02.2021 - CASE LEFT( lcConfigItem, 20 ) == LOWER('DBF_BinChar_Base64:') - IF INLIST( laConfig(m.I), '0', '1' ) THEN - to_out_DBF_CFG.l_DBF_BinChar_Base64 = ( TRANSFORM(laConfig(m.I)) == '1' ) - IF tlGenerateLog THEN - THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_BinChar_Base64: ' + TRANSFORM(to_out_DBF_CFG.l_DBF_BinChar_Base64) ) - ENDIF - ENDIF + Case Left( lcConfigItem, 20 ) == Lower('DBF_BinChar_Base64:') + If Inlist( laConfig(m.I), '0', '1' ) Then + to_out_DBF_CFG.l_DBF_BinChar_Base64 = ( Transform(laConfig(m.I)) == '1' ) + If tlGenerateLog Then + This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_BinChar_Base64: ' + Transform(to_out_DBF_CFG.l_DBF_BinChar_Base64) ) + Endif + Endif - CASE LEFT( lcConfigItem, 20 ) == LOWER('DBF_IncludeDeleted:') - IF INLIST( laConfig(m.I), '0', '1' ) THEN - to_out_DBF_CFG.l_DBF_IncludeDeleted = ( TRANSFORM(laConfig(m.I)) == '1' ) - IF tlGenerateLog THEN - THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_IncludeDeleted: ' + TRANSFORM(to_out_DBF_CFG.l_DBF_IncludeDeleted) ) - ENDIF - ENDIF + Case Left( lcConfigItem, 20 ) == Lower('DBF_IncludeDeleted:') + If Inlist( laConfig(m.I), '0', '1' ) Then + to_out_DBF_CFG.l_DBF_IncludeDeleted = ( Transform(laConfig(m.I)) == '1' ) + If tlGenerateLog Then + This.writeLog(' ' + Justfname(lcTableCFG) + ' > DBF_IncludeDeleted: ' + Transform(to_out_DBF_CFG.l_DBF_IncludeDeleted) ) + Endif + Endif *!* /Changed by: Lutz Scheffler 21.02.2021 - 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 ; @@ -2855,39 +2862,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 ; @@ -2895,41 +2902,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 ; @@ -2937,1565 +2944,1576 @@ 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 + Endwith && THIS - RETURN llhasSupport - ENDPROC + 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' + 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)) + 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 '\' $ 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 + 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 = 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 + lnSupportType = Int(lnSupportType) + Endwith && THIS - FINALLY - STORE NULL TO loDBF_CFG - RELEASE loDBF_CFG - ENDTRY + Finally + Store Null To loDBF_CFG + Release loDBF_CFG + Endtry - RETURN lnSupportType - ENDPROC + 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 ; + 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 + 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() + 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 + 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 + 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 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' + 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 + 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 + 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 + 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 ) +*-- 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 +*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 +*-- 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 + 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 + .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 + 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 ) +*-- 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 +*-- 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 + 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 + 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 + 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 + 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( ) + .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 ) +*-- 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 +* 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 + 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 + Else && Asumo .n_UseClassPerFile = 1 + tc_InputFile = Forceext(tc_InputFile, '') + '.' + .c_ClassToConvert + '.' + .c_VC2 - ENDIF - ENDIF + Endif + Endif - loLang = _SCREEN.o_FoxBin2Prg_Lang + 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 + 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 + 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 +*!* Changed by: Lutz Scheffler 15.2.2021 +*!* change date="{^2021-02-15,18:44:00}" +* added option to create config files + Case UPPER( tcType )=='-C' AND VARTYPE( tc_InputFile )='C' + loLang = _Screen.o_FoxBin2Prg_Lang + STRTOFILE( STRTRAN( '*' + STRTRAN( loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC_cfg, 0h0D0A, 0h0D0A + '*'), 0h0D0A + '*' + 0h0D0A, 0h0D0A0D0A), tc_InputFile ) - OTHERWISE - *-- EJECUCIÓN NORMAL + Case UPPER( tcType )=='-T' AND VARTYPE( tc_InputFile )='C' + loLang = _Screen.o_FoxBin2Prg_Lang + STRTOFILE( STRTRAN( STRTRAN( '*' + loLang.C_FOXBIN2PRG_SYNTAX_INFO_EXAMPLE_LOC_tab_cfg, 0h0D0A, 0h0D0A + '*'), 0h0D0A + '*' + 0h0D0A, 0h0D0A0D0A), tc_InputFile ) +*!* /Changed by: Lutz Scheffler 15.2.2021 + + 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 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 + 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 + loFrm_Interactive.Release() + loFrm_Interactive = Null - DO CASE - CASE lnConversionOption = 1 && Bin2Txt - tcType = tcType + '-BIN2PRG' + Do Case + Case lnConversionOption = 1 && Bin2Txt + tcType = tcType + '-BIN2PRG' - CASE lnConversionOption = 2 && Txt2Bin - tcType = tcType + '-PRG2BIN' + Case lnConversionOption = 2 && Txt2Bin + tcType = tcType + '-PRG2BIN' - OTHERWISE && None - ERROR 1799 && Conversion Cancelled - ENDCASE - ENDIF + 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 ) ) +*-- 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 + 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' + 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 .n_Debug > 0 Then + Erase ( .c_LogFile ) + Endif - IF EVL(tcType,'0') <> '*' THEN - IF .n_ShowProgressbar <> 0 AND .l_ProcessFiles THEN - .loadProgressbarForm() - 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 + 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 ) + lnFileCount = Adir( laFiles, lcFileSpec, '', 1 ) - FOR I = 1 TO lnFileCount - toModulo = NULL - lcFile = FORCEPATH( laFiles(m.I,1), JUSTPATH( lcFileSpec ) ) + 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) + 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 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() + 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 + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - llError = .T. - .l_Error = .F. - ENDCASE - ENDIF + 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() + 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 + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 - CASE lnCodError > 0 - .doWriteErrorLog( @toEx ) - llError = .T. - .l_Error = .F. - ENDCASE - ENDIF + 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 + '"' + 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() + 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 + Do Case + Case lnCodError = 1799 && Conversion Cancelled + Error 1799 - CASE lnCodError > 0 + 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!! @@ -4505,52 +4523,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) = '"' @@ -4564,1026 +4582,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 @@ -5592,16 +5610,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 = [] ; + [] ; + [] ; + [] ; @@ -5616,7 +5634,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, ; @@ -5627,7 +5645,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, ; @@ -5638,7 +5656,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, ; @@ -5649,7 +5667,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, ; @@ -5660,7 +5678,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, ; @@ -5669,7 +5687,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, ; @@ -5677,7 +5695,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, ; @@ -5685,7 +5703,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, ; @@ -5693,7 +5711,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, ; @@ -5701,7 +5719,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, ; @@ -5709,7 +5727,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, ; @@ -5717,7 +5735,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, ; @@ -5725,7 +5743,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, ; @@ -5733,7 +5751,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, ; @@ -5741,7 +5759,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, ; @@ -5749,7 +5767,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, ; @@ -5757,7 +5775,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, ; @@ -5765,7 +5783,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, ; @@ -5773,7 +5791,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, ; @@ -5781,7 +5799,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, ; @@ -5789,7 +5807,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, ; @@ -5797,7 +5815,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, ; @@ -5805,7 +5823,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, ; @@ -5813,7 +5831,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, ; @@ -5821,7 +5839,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, ; @@ -5829,7 +5847,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, ; @@ -5837,7 +5855,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, ; @@ -5845,7 +5863,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, ; @@ -5853,7 +5871,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, ; @@ -5861,7 +5879,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, ; @@ -5869,7 +5887,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, ; @@ -5877,7 +5895,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, ; @@ -5885,7 +5903,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, ; @@ -5893,7 +5911,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, ; @@ -5901,7 +5919,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, ; @@ -5910,7 +5928,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, ; @@ -5919,7 +5937,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, ; @@ -5928,7 +5946,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, ; @@ -5937,135 +5955,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 @@ -6079,17 +6097,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", ; @@ -6103,7 +6121,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, ; @@ -6116,7 +6134,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, ; @@ -6125,7 +6143,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, ; @@ -6134,7 +6152,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, ; @@ -6144,82 +6162,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. @@ -6235,11 +6253,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, ; @@ -6251,7 +6269,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", ; @@ -6261,54 +6279,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+; + 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 = [] ; + [] ; + [] ; + [] ; @@ -6365,7 +6386,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) ; @@ -6394,20 +6415,20 @@ 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 + 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 @@ -6418,502 +6439,502 @@ DEFINE CLASS c_conversor_base AS Custom *!* /Changed by: Lutz Scheffler 21.02.2021 - SET EXACT ON - IF NOT EMPTY( ON("ESCAPE") ) THEN - SET ESCAPE ON - ENDIF + Set Exact On + If Not Empty( On("ESCAPE") ) Then + Set Escape On + Endif - PUBLIC C_FB2PRG_CODE + 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' ; @@ -6929,183 +6950,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) = '"' @@ -7119,991 +7140,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 = [] ; + [] ; + [] ; + [] ; @@ -8149,137 +8170,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) ; @@ -8288,51 +8309,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 ; @@ -8340,38 +8361,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 ; @@ -8382,24 +8403,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 ; @@ -8410,30 +8431,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 ; @@ -8444,24 +8465,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 ; @@ -8472,18 +8493,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) ; @@ -8497,14 +8518,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) ; @@ -8560,473 +8581,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 ; @@ -9038,7 +9059,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER ; + , User ; , DEVINFO ) ; VALUES ; ( 'WINDOWS' ; @@ -9062,20 +9083,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 ; @@ -9087,7 +9108,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER ) ; + , User ) ; VALUES ; ( 'WINDOWS' ; , toObjeto._UniqueID ; @@ -9110,1489 +9131,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}" @@ -10600,336 +10621,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 ; @@ -10941,7 +11379,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin , RESERVED6 ; , RESERVED7 ; , RESERVED8 ; - , USER) ; + , User) ; VALUES ; ( 'WINDOWS' ; , loClase._UniqueID ; @@ -10969,512 +11407,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 = [] ; + [] ; + [] ; + [] ; @@ -11488,844 +11509,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 = [] ; + [] ; + [] ; + [] ; @@ -12333,477 +12354,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 = [] ; + [] ; + [] ; + [] ; @@ -12813,440 +12834,440 @@ 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 ) +*-- 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 + 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 ) - .writeBinaryFile_STRUCTURE( @toTable, @toFoxBin2Prg, @lcAlterTable ) + toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) + .writeBinaryFile_STRUCTURE( @toTable, @toFoxBin2Prg, @lcAlterTable ) - IF llImportData AND lnCodeLines > 1 AND toTable._I > 1 THEN - *-- Identifico los registros de la tabla y los agrego - I = toTable._I - 1 + If llImportData And lnCodeLines > 1 And toTable._I > 1 Then +*-- Identifico los registros de la tabla y los agrego + I = toTable._I - 1 *!* Changed by: Lutz Scheffler 21.02.2021 *!* change date="{^2021-02-21,10:57:00}" * additional options controlling * - new operations of DBF - toTable.analyzeCodeBlock( C_TABLE_I, @laCodeLines, @m.I, lnCodeLines, @toFoxBin2Prg,; - IIF( m.lnFileCount = 1, NVL( m.loDBF_CFG.l_DBF_BinChar_Base64, m.toFoxBin2Prg.l_DBF_BinChar_Base64 ), m.toFoxBin2Prg.l_DBF_BinChar_Base64 ),; - IIF( m.lnFileCount = 1, NVL( m.loDBF_CFG.l_DBF_IncludeDeleted, m.toFoxBin2Prg.l_DBF_IncludeDeleted ), m.toFoxBin2Prg.l_DBF_IncludeDeleted ) ) + toTable.analyzeCodeBlock( C_TABLE_I, @laCodeLines, @m.I, lnCodeLines, @toFoxBin2Prg,; + IIF( m.lnFileCount = 1, Nvl( m.loDBF_CFG.l_DBF_BinChar_Base64, m.toFoxBin2Prg.l_DBF_BinChar_Base64 ), m.toFoxBin2Prg.l_DBF_BinChar_Base64 ),; + IIF( m.lnFileCount = 1, Nvl( m.loDBF_CFG.l_DBF_IncludeDeleted, m.toFoxBin2Prg.l_DBF_IncludeDeleted ), m.toFoxBin2Prg.l_DBF_IncludeDeleted ) ) *!* /Changed by: Lutz Scheffler 21.02.2021 - ENDIF + Endif - IF NOT EMPTY(lcAlterTable) - EXECSCRIPT(lcAlterTable) - ENDIF + If Not Empty(lcAlterTable) + Execscript(lcAlterTable) + Endif - .writeBinaryFile_INDEXES( @toTable, @toFoxBin2Prg ) + .writeBinaryFile_INDEXES( @toTable, @toFoxBin2Prg ) - ENDWITH && THIS + 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")) - USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + Finally + Use In (Select("TABLABIN")) + Use In (Select(Juststem(This.c_OutputFile))) - IF NOT EMPTY(lcTempDBC) - CLOSE DATABASES - ERASE (FORCEEXT(lcTempDBC,'DBC')) - ERASE (FORCEEXT(lcTempDBC,'DCT')) - ERASE (FORCEEXT(lcTempDBC,'DCX')) - ENDIF + 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 + Store Null To loDBF_CFG + Release loDBF_CFG - ENDTRY + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc - 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 + 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 - 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 + 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') + 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 + 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' ) +*-- 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 + Do Case + Case toFoxBin2Prg.c_SimulateError = 'SIMERR_O1' + Error 'OutputFile Error Simulation' + Endcase - ERASE (FORCEEXT(.c_OutputFile, 'DBF')) - ERASE (FORCEEXT(.c_OutputFile, 'FPT')) - ERASE (FORCEEXT(.c_OutputFile, 'CDX')) + Erase (Forceext(.c_OutputFile, 'DBF')) + Erase (Forceext(.c_OutputFile, 'FPT')) + Erase (Forceext(.c_OutputFile, 'CDX')) - 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 + 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 - toTable._TableName = .c_OutputFile + toTable._TableName = .c_OutputFile - *-- Conformo los campos - FOR EACH loField IN toTable._Fields FOXOBJECT - lcLongDec = '' +*-- Conformo los campos + For Each loField In toTable._Fields FoxObject + lcLongDec = '' - IF NOT EMPTY(lcFieldDef) - lcFieldDef = lcFieldDef + ';' + CR_LF + ', ' - ENDIF + If Not Empty(lcFieldDef) + lcFieldDef = lcFieldDef + ';' + CR_LF + ', ' + Endif - *-- Nombre, Tipo - lcFieldDef = lcFieldDef + '"' + loField._Name + '" ' + loField._Type +*-- Nombre, Tipo + lcFieldDef = lcFieldDef + '"' + loField._Name + '" ' + loField._Type - *-- Longitud - IF INLIST( loField._Type, 'C', 'N', 'F', 'Q', 'V' ) - lcLongDec = lcLongDec + '(' + loField._Width - ENDIF +*-- Longitud + If Inlist( loField._Type, 'C', 'N', 'F', 'Q', 'V' ) + lcLongDec = lcLongDec + '(' + loField._Width + 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 +*-- 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 + 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 + 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 - ENDWITH && THIS + Endwith && THIS - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - loEx.USERVALUE = 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ; - + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"' + Catch To loEx + lnCodError = loEx.ErrorNo + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + loEx.UserValue = 'lcFieldDef="' + Transform(lcFieldDef) + '"' + CR_LF ; + + 'lcCreateTable="' + Transform(lcCreateTable) + '"' - 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 - STORE NULL TO loField, loDBFUtils - RELEASE I, loField, loDBFUtils ; - , lcCreateTable, lcLongDec, lcFieldDef, lcTempDBC, lnDataSessionID, lnSelect + Finally + Store Null To loField, loDBFUtils + Release I, loField, loDBFUtils ; + , lcCreateTable, lcLongDec, lcFieldDef, lcTempDBC, lnDataSessionID, lnSelect - ENDTRY + Endtry - RETURN lnCodError - ENDPROC + Return lnCodError + Endproc - 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 + 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 - TRY - LOCAL I, lnCodError, loEx AS EXCEPTION ; - , loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG' ; - , loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' ; - , ldLastUpdate + 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') + 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') - *-- Regenero los índices - FOR EACH loIndex IN toTable._Indexes FOXOBJECT - lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName +*-- Regenero los índices + For Each loIndex In toTable._Indexes FoxObject + lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName - IF loIndex._TagType = 'BINARY' - lcIndex = lcIndex + ' BINARY' - ELSE - lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"' + If loIndex._TagType = 'BINARY' + lcIndex = lcIndex + ' BINARY' + Else + lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"' - IF NOT EMPTY(loIndex._Filter) - lcIndex = lcIndex + ' FOR ' + loIndex._Filter - ENDIF + If Not Empty(loIndex._Filter) + lcIndex = lcIndex + ' FOR ' + loIndex._Filter + Endif - lcIndex = lcIndex + ' ' + loIndex._Order + 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 + 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 - &lcIndex. - ENDFOR + &lcIndex. + Endfor - USE IN (SELECT(JUSTSTEM(.c_OutputFile))) + Use In (Select(Juststem(.c_OutputFile))) - *-- 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 +*-- 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 - loDBFUtils.write_DBC_BackLink( .c_OutputFile, toTable._Database, ldLastUpdate ) + loDBFUtils.write_DBC_BackLink( .c_OutputFile, toTable._Database, ldLastUpdate ) - toFoxBin2Prg.updateProcessedFile() - ENDWITH && THIS + toFoxBin2Prg.updateProcessedFile() + Endwith && THIS - CATCH TO loEx - lnCodError = loEx.ERRORNO - toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - loEx.USERVALUE = 'lcIndex="' + TRANSFORM(lcIndex) + '"' + 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 + If This.n_Debug > 0 And _vfp.StartMode = 0 + Set Step On + Endif - THROW + Throw - FINALLY - STORE NULL TO loIndex - RELEASE I, loIndex, lcIndex, ldLastUpdate + Finally + Store Null To loIndex + Release I, loIndex, lcIndex, ldLastUpdate - ENDTRY + 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 - * toTable (@? OUT) Objeto con toda la información de la tabla analizada - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable + 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 - EXTERNAL ARRAY taCodeLines, taLineasExclusion + External Array taCodeLines, taLineasExclusion - #IF .F. - LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' - #ENDIF + #If .F. + Local toTable As CL_DBF_TABLE Of 'FOXBIN2PRG.PRG' + #Endif - TRY - LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed - STORE 0 TO I + Try + Local I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed + Store 0 To I - WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + With This As c_conversor_prg_a_dbf Of 'FOXBIN2PRG.PRG' + .c_Type = Upper(Justext(.c_OutputFile)) - IF tnCodeLines > 1 - toTable = NULL - toTable = CREATEOBJECT('CL_DBF_TABLE') + If tnCodeLines > 1 + toTable = Null + toTable = Createobject('CL_DBF_TABLE') - 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( toTable, @lcLine, @taCodeLines, @m.I, tnCodeLines ) - llFoxBin2Prg_Completed = .T. + 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 + Case Not llBloqueTable_Completed And toTable.analyzeCodeBlock( @lcLine, @taCodeLines, @m.I, tnCodeLines ) + llBloqueTable_Completed = .T. + Exit - 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, toTable ; - , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed - ENDTRY + Finally + Release taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable ; + , I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed + Endtry - RETURN - ENDPROC + Return + Endproc -ENDDEFINE && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin +Enddefine && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin * SF, 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 = [] ; +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 = [] ; + [] ; + [] ; + [] ; @@ -13259,501 +13280,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_UseFilesPerDBC > 0 AND toFoxBin2Prg.l_RedirectFilePerDBCToMain - 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_UseFilesPerDBC > 0 And toFoxBin2Prg.l_RedirectFilePerDBCToMain + 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_UseFilesPerDBC > 0 AND toFoxBin2Prg.l_RedirectFilePerDBCToMain - ELSE - llEXTERNAL_MEMBER_Completed = .T. - ENDIF + If toFoxBin2Prg.n_UseFilesPerDBC > 0 And toFoxBin2Prg.l_RedirectFilePerDBCToMain + 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_UseFilesPerDBC > 0 AND toFoxBin2Prg.l_ItemPerDBCCheck 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_UseFilesPerDBC > 0 And toFoxBin2Prg.l_ItemPerDBCCheck 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 = [] ; + [] ; + [] ; + [] @@ -13763,208 +13784,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 = [] ; + [] ; + [] ; + [] ; @@ -14013,1316 +14034,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 <<>> <> @@ -15330,137 +15351,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 @@ -15473,7 +15494,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="<>" @@ -15481,19 +15502,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 <<>> <> @@ -15534,1177 +15555,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 + "