diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 729e75a..395e3ca 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -1,5 +1,5 @@
*---------------------------------------------------------------------------------------------------
-* Módulo.........: FOXBIN2PRG.PRG
+* Módulo.........: FOXBIN2PRG.PRG - PARA VISUAL FOXPRO 9.0
* Autor..........: Fernando D. Bozzo (mailto:fdbozzo@gmail.com)
* Fecha creación.: 04/11/2013
*
@@ -28,8 +28,10 @@
*
*---------------------------------------------------------------------------------------------------
* Historial de cambios y notas importantes
-* 04/11/2013 FDBOZZO Creación inicial de las clases y soporte de los archivos VCX
-*
+* 04/11/2013 FDBOZZO v1.0 Creación inicial de las clases y soporte de los archivos VCX/SCX/PJX
+* 22/11/2013 FDBOZZO v1.1 Corrección de bugs
+* 23/11/2013 FDBOZZO v1.2 Corrección de bugs, limpieza de código y refactorización
+* 24/11/2013 FDBOZZO v1.3 Corrección de bugs, limpieza de código y refactorización
*---------------------------------------------------------------------------------------------------
* TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES:
* PROPIEDAD ARREGLO Y EJEMPLO
@@ -83,6 +85,8 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#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 '*'
@@ -165,7 +169,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
lFileMode = .F.
nClassTimeStamp = ''
o_Conversor = NULL
- n_FB2PRG_Version = 1.2
+ n_FB2PRG_Version = 1.3
*******************************************************************************************************************
PROCEDURE INIT
@@ -288,7 +292,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CR_LF ;
+ toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CR_LF ;
+ toEx.LINECONTENTS + CR_LF + CR_LF ;
- + EVL(toEx.UserValue,'')
+ + EVL(toEx.USERVALUE,'')
RETURN lcError
ENDPROC
@@ -310,6 +314,7 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -333,6 +338,7 @@ DEFINE CLASS c_conversor_base AS SESSION
includeFile = ''
c_CurDir = ''
+
*******************************************************************************************************************
PROCEDURE INIT
SET DELETED ON
@@ -383,6 +389,7 @@ DEFINE CLASS c_conversor_base AS SESSION
, tcExtension = 'EXE', 'Z' ;
, tcExtension = 'MNX', 'M' ;
, tcExtension = 'TXT', 'T' ;
+ , tcExtension = 'FPW', 'T' ;
, tcExtension = 'H', 'T' ;
, 'x' )
ENDPROC
@@ -393,11 +400,7 @@ DEFINE CLASS c_conversor_base AS SESSION
LPARAMETERS tcLine, tcComment
LOCAL llLineIsOnlyComment, ln_AT_Cmt
- IF '&'+'&' $ tcLine
- ln_AT_Cmt = AT( '&'+'&', tcLine)
- tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
- tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, ' ', CHR(9) ) && Quito comentarios. Ej: '#IF .F.&&cmt' ==> '#IF .F.'
- ENDIF
+ THIS.get_SeparatedLineAndComment( @tcLine, @tcComment )
DO CASE
CASE LEFT(tcLine,2) == '*<'
@@ -412,6 +415,21 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE get_SeparatedLineAndComment
+ LPARAMETERS tcLine, tcComment
+ LOCAL ln_AT_Cmt
+
+ IF '&'+'&' $ tcLine
+ ln_AT_Cmt = AT( '&'+'&', tcLine)
+ tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
+ tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, ' ', CHR(9) ) && Quito comentarios. Ej: '#IF .F.&&cmt' ==> '#IF .F.'
+ ENDIF
+
+ RETURN
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE getNext_BAK
LPARAMETERS tcOutputFileName
@@ -683,7 +701,7 @@ DEFINE CLASS c_conversor_base AS SESSION
CASE lcPropName == '_memberdata'
tcAsignacion = STUFF( tcAsignacion, 15, 0, '[') + ']'
- CASE NOT THIS.ComprobarExpresionValida( tcAsignacion, @lnCodError, @lcExpNormalizada )
+ CASE NOT THIS.comprobarExpresionValida( tcAsignacion, @lnCodError, @lcExpNormalizada )
*-- La mayoría de los errores deben relanzarse, ya que intentar arreglarlos
*-- puede empeorar las cosas con asignaciones válidas para guardar pero no
*-- para la lógica del programa.
@@ -756,6 +774,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -767,8 +786,10 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ []
+
*******************************************************************************************************************
PROCEDURE INIT
DODEFAULT()
@@ -789,6 +810,90 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDPROC
+ *******************************************************************************************************************
+ FUNCTION get_ValueByName_FromListNamesWithValues
+ *-- ASIGNO EL VALOR DEL ARRAY DE DATOS Y VALORES PARA LA PROPIEDAD INDICADA
+ LPARAMETERS tcPropName, tcValueType, taPropsAndValues_List
+ LOCAL lnPos, luPropValue
+
+ lnPos = ASCAN( taPropsAndValues_List, tcPropName, 1, 0, 1, 1+2+4+8)
+
+ IF lnPos = 0 OR EMPTY( taPropsAndValues_List( lnPos, 2 ) )
+ *-- Valores no encontrados o vacíos
+ luPropValue = ''
+ ELSE
+ luPropValue = taPropsAndValues_List( lnPos, 2 )
+ ENDIF
+
+ DO CASE
+ CASE tcValueType = 'I'
+ luPropValue = CAST( luPropValue AS Integer )
+
+ CASE tcValueType = 'N'
+ luPropValue = CAST( luPropValue AS Double )
+
+ CASE tcValueType = 'T'
+ luPropValue = CAST( luPropValue AS Datetime )
+
+ CASE tcValueType = 'D'
+ luPropValue = CAST( luPropValue AS Date )
+
+ CASE tcValueType = 'E'
+ luPropValue = EVALUATE( luPropValue )
+
+ OTHERWISE && Asumo 'C' para lo demás
+ luPropValue = luPropValue
+
+ ENDCASE
+
+ RETURN luPropValue
+ 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==" />
+ *--
+ LPARAMETERS tcLineWithMetadata, taPropsAndValues_List, tnPropsAndValues_Count, tcLeftTag, tcRightTag
+ EXTERNAL ARRAY taPropsAndValues_List
+ LOCAL lcMetadatos, I, X, lnEqualSigns, lcNextVar, lcStr, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas
+ STORE '' TO lcVirtualMeta
+ STORE 0 TO lnPos1, lnPos2, lnLastPos, tnPropsAndValues_Count, I, X
+
+ lcMetadatos = ALLTRIM( STREXTRACT( tcLineWithMetadata, tcLeftTag, tcRightTag, 1, 1) )
+ 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 + "]"
+ ENDIF
+
+ lnLastPos = 1
+ DIMENSION taPropsAndValues_List( lnCantComillas / 2, 2 )
+
+ FOR I = 1 TO lnCantComillas STEP 2
+ X = X + 1
+
+ * Type="V" Cpid="1252"
+ * ^ ^ => Posiciones del par de comillas dobles
+ lnPos1 = AT( '"', lcMetadatos, I )
+ lnPos2 = AT( '"', lcMetadatos, I + 1 )
+
+ * Type="V" Cpid="1252"
+ * ^ ^ ^ => LastPos, lnPos1 y lnPos2
+ taPropsAndValues_List(X,1) = ALLTRIM( GETWORDNUM( SUBSTR( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) )
+ taPropsAndValues_List(X,2) = SUBSTR( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 )
+
+ lnLastPos = lnPos2 + 1
+ ENDFOR
+
+ RETURN
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE evaluarDefinicionDeProcedure
LPARAMETERS toClase, tnX, tcProcedureAbierto, tcAddobjectAbierto ;
@@ -986,16 +1091,16 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*------------------------------------------------------
LPARAMETERS toModulo, tcLine, ta_Lineas, I, tnLineas
- LOCAL llBloqueEncontrado, X
+ LOCAL llBloqueEncontrado, X, laPropsAndValues_List(1,2), lnPropsAndValues_Count
IF LEFT( tcLine + ' ', LEN(C_FB2PRG_META_I) + 1 ) == C_FB2PRG_META_I + ' '
llBloqueEncontrado = .T.
*-- Metadatos del módulo
- tcLine = ALLTRIM( STREXTRACT( tcLine, C_FB2PRG_META_I, C_FB2PRG_META_F, 1, 1 ) )
- tcLine = CHRTRAN( tcLine, ['], ["] )
- toModulo._Version = VAL( ALLTRIM( STREXTRACT( tcLine, 'version = "', '"', 1, 1 ) ) )
- toModulo._SourceFile = ALLTRIM( STREXTRACT( tcLine, 'SourceFile = "', '"', 1, 1 ) )
+ THIS.get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues_List, @lnPropsAndValues_Count ;
+ , C_FB2PRG_META_I, C_FB2PRG_META_F )
+ toModulo._Version = THIS.get_ValueByName_FromListNamesWithValues( 'Version', 'N', @laPropsAndValues_List )
+ toModulo._SourceFile = THIS.get_ValueByName_FromListNamesWithValues( 'SourceFile', 'C', @laPropsAndValues_List )
ENDIF
RETURN llBloqueEncontrado
@@ -1204,6 +1309,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
*******************************************************************************************************************
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.
@@ -1393,7 +1500,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TRY
LOCAL loObjeto, X, lcObjName
-
+
IF toClase._AddObject_Count > 0
*-- Armo array con el orden Z de los objetos
@@ -1406,7 +1513,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
ENDFOR
ASORT( laObjNames, 2, -1, 0, 1 )
-
+
*-- Escribo los objetos en el orden Z
FOR X = 1 TO toClase._AddObject_Count
@@ -1463,9 +1570,9 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
#ENDIF
TRY
- LOCAL I, X, Z, lnCodError, loEx as Exception, lnPrimerID, lnLineas, lnBloquesExclusion ;
+ LOCAL I, X, Z, lnCodError, loEx AS EXCEPTION, lnPrimerID, lnLineas, lnBloquesExclusion ;
, ln_ID_LimitesDeCabecera, ln_AT_Cmt, lc_Comentario, la_cab_props(1) ;
- , ln_cab_props, lcProp, lnPropsObj, ln_AT, lnOle_Len ;
+ , ln_cab_props, lcProp, lnPropsObj, ln_AT, lnOle_Len, laPropsAndValues_List(1,2), lnPropsAndValues_Count ;
, lcProcedureAbierto, lcAddobjectAbierto, lcLine, lnLine_Len, lcProcName ;
, loOle AS CL_OLE OF 'FOXBIN2PRG.PRG' ;
, loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' ;
@@ -1527,17 +1634,19 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
CASE LEFT( lcLine + ' ', lnOle_Len + 1 ) == C_OLE_I + ' '
*-- 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" />
- lcLine = STREXTRACT( lcLine, C_OLE_I, C_OLE_F, 1, 1 )
- lcLine = CHRTRAN( lcLine, ['], ["] )
+ *< OLE: Nombre="frm_d.ole_ImageControl2" parent="frm_d" objname="ole_ImageControl2" checksum="4171274922" value="b64-value" />
loOle = NULL
loOle = CREATEOBJECT('CL_OLE')
+
+ .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcLine, @laPropsAndValues_List, @lnPropsAndValues_Count ;
+ , C_OLE_I, C_OLE_F )
+
+ loOle._Nombre = .get_ValueByName_FromListNamesWithValues( 'Nombre', 'C', @laPropsAndValues_List )
+ loOle._Parent = .get_ValueByName_FromListNamesWithValues( 'Parent', 'C', @laPropsAndValues_List )
+ loOle._ObjName = .get_ValueByName_FromListNamesWithValues( 'ObjName', 'C', @laPropsAndValues_List )
+ loOle._CheckSum = .get_ValueByName_FromListNamesWithValues( 'CheckSum', 'C', @laPropsAndValues_List )
+ loOle._Value = .get_ValueByName_FromListNamesWithValues( 'Value', 'C', @laPropsAndValues_List )
- loOle._Nombre = ALLTRIM( STREXTRACT( lcLine, ' Nombre = "', '"', 1, 1 ) )
- loOle._Parent = ALLTRIM( STREXTRACT( lcLine, ' Parent = "', '"', 1, 1 ) )
- loOle._ObjName = ALLTRIM( STREXTRACT( lcLine, ' ObjName = "', '"', 1, 1 ) )
- loOle._CheckSum = ALLTRIM( STREXTRACT( lcLine, ' CheckSum = "', '"', 1, 1 ) )
- loOle._Value = STRCONV( ALLTRIM( STREXTRACT( lcLine, ' value = "', '"', 1, 1 ) ), 14 )
toModulo.add_OLE( loOle )
IF EMPTY( loOle._Value )
@@ -1575,6 +1684,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
loClase._Comentario = lc_Comentario
loClase._Inicio = I
loClase._Ini_Cab = I + 1
+
toModulo.add_Class( loClase )
*-- Ubico el objeto ole por su nombre (parent+objname), que no se repite.
@@ -1632,15 +1742,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
CASE LEFT(lcLine, LEN(C_METADATA_I)) == C_METADATA_I && METADATA de la CLASE
- lcLine = CHRTRAN( lcLine, ['], ["] )
- loClase._MetaData = STREXTRACT( lcLine, C_METADATA_I, C_METADATA_F, 1, 1 )
- loClase._BaseClass = ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' BaseClass = "', '"', 1, 1 ) )
- loClase._TimeStamp = INT( .RowTimeStamp( EVALUATE( '{^' + ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' Timestamp = "', '"', 1, 1 ) ) + '}') ) )
- loClase._Scale = ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' Scale = "', '"', 1, 1 ) )
- loClase._UniqueID = ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' UniqueID = "', '"', 1, 1 ) )
- loClase._ProjectClassIcon = ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' ProjectClassIcon = "', '"', 1, 1 ) )
- loClase._ClassIcon = ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' ClassIcon = "', '"', 1, 1 ) )
- loClase._Ole2 = ALLTRIM( STREXTRACT( loClase._MetaData + ',', ' OLEObject = "', '"', 1, 1 ) )
+ *< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" />
+
+ .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lcLine, @laPropsAndValues_List, @lnPropsAndValues_Count ;
+ , C_METADATA_I, C_METADATA_F )
+
+ loClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues_List )
+ loClase._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues_List ) ) )
+ loClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues_List )
+ loClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues_List )
+ loClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues_List )
+ loClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues_List )
+ loClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'Ole2', 'C', @laPropsAndValues_List )
IF NOT EMPTY( loClase._Ole2 ) && Le agrego "OLEObject = " delante
loClase._Ole2 = 'OLEObject = ' + loClase._Ole2 + CR_LF
@@ -1720,14 +1833,16 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
IF NOT EMPTY(lc_Comentario) AND C_END_OBJECT_I $ lc_Comentario && Fin del ADD OBJECT y METADATOS
*< END OBJECT: baseclass = "olecontrol" Uniqueid = "_3X50L3I7V" OLEObject = "C:\WINDOWS\system32\FOXTLIB.OCX" checksum = "4101493921" />
- lc_Comentario = ALLTRIM( STREXTRACT( lc_Comentario, C_END_OBJECT_I, C_END_OBJECT_F, 1, 1 ) ) + ','
- lc_Comentario = CHRTRAN( lc_Comentario, ['], ["] )
- loObjeto._ClassLib = ALLTRIM( STREXTRACT( lc_Comentario, 'ClassLib = "', '"', 1, 1 ) )
- loObjeto._BaseClass = ALLTRIM( STREXTRACT( lc_Comentario, 'BaseClass = "', '"', 1, 1 ) )
- loObjeto._UniqueID = ALLTRIM( STREXTRACT( lc_Comentario, 'UniqueID = "', '"', 1, 1 ) )
- loObjeto._Ole2 = ALLTRIM( STREXTRACT( lc_Comentario, 'OLEObject = "', '"', 1, 1 ) )
- loObjeto._ZOrder = INT( VAL( ALLTRIM( STREXTRACT( lc_Comentario, 'ZOrder = "', '"', 1, 1 ) ) ) )
- loObjeto._TimeStamp = INT( .RowTimeStamp( EVALUATE( '{^' + ALLTRIM( STREXTRACT( lc_Comentario + ',', 'Timestamp = "', '"', 1, 1 ) ) + '}' ) ) )
+
+ .get_ListNamesWithValuesFrom_InLine_MetadataTag( @lc_Comentario, @laPropsAndValues_List, @lnPropsAndValues_Count ;
+ , C_END_OBJECT_I, C_END_OBJECT_F )
+
+ loObjeto._ClassLib = .get_ValueByName_FromListNamesWithValues( 'ClassLib', 'C', @laPropsAndValues_List )
+ loObjeto._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues_List )
+ loObjeto._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues_List )
+ loObjeto._Ole2 = .get_ValueByName_FromListNamesWithValues( 'Ole2', 'C', @laPropsAndValues_List )
+ loObjeto._ZOrder = .get_ValueByName_FromListNamesWithValues( 'ZOrder', 'I', @laPropsAndValues_List )
+ loObjeto._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues_List ) ) )
IF NOT EMPTY( loObjeto._Ole2 ) && Le agrego "OLEObject = " delante
loObjeto._Ole2 = 'OLEObject = ' + loObjeto._Ole2 + CR_LF
@@ -1773,7 +1888,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
CATCH TO loEx
lnCodError = loEx.ERRORNO
*loEx.UserValue = 'ATENCION: EL ERROR PODRIA SER DEL PROGRAMA FUENTE' + CR_LF + CR_LF ;
- + JUSTEXT(THIS.c_inputFile) + ' Line ' + TRANSFORM(I) + ':' + ta_Lineas(I)
+ + JUSTEXT(THIS.c_inputFile) + ' Line ' + TRANSFORM(I) + ':' + ta_Lineas(I)
IF THIS.l_Debug
SET STEP ON
@@ -2426,24 +2541,28 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
THIS.doBackup()
+ *-- Creo solo la cabecera del proyecto
STRTOFILE( '', '__newproject.f2b' )
BUILD PROJECT (THIS.c_outputFile) FROM '__newproject.f2b'
ERASE ( '__newproject.f2b' )
USE (THIS.c_outputFile) ALIAS TABLABIN AGAIN SHARED
-
+
lcMainProg = ''
-
+
IF NOT EMPTY(toProject._MainProg)
- lcMainProg = LOWER( SYS(2014, toProject._MainProg, ADDBS(JUSTPATH(toProject._HomeDir)) ) )
+ lcMainProg = LOWER( SYS(2014, toProject._MainProg, ADDBS(JUSTPATH(toProject._HomeDir)) ) )
ENDIF
- *-- Actualizo información del Header
- SCATTER FIELDS DEVINFO,RESERVED2 MEMO NAME loReg
- loReg.DEVINFO = toProject.getRowDeviceInfo()
- loServerHead = toProject._ServerHead
- loReg.RESERVED2 = loServerHead.getRowServerInfo()
- GATHER NAME loReg FIELDS DEVINFO,RESERVED2 MEMO
+ *-- Actualizo información del HEADER
+ SCATTER FIELDS DEVINFO,RESERVED2,CMNTSTYLE,NOLOGO,SAVECODE MEMO NAME loReg
+ loReg.DEVINFO = toProject.getRowDeviceInfo()
+ loServerHead = toProject._ServerHead
+ loReg.RESERVED2 = loServerHead.getRowServerInfo()
+ loReg.CMNTSTYLE = toProject._CmntStyle
+ loReg.NOLOGO = toProject._NoLogo
+ loReg.SAVECODE = toProject._SaveCode
+ GATHER NAME loReg FIELDS DEVINFO,RESERVED2,CMNTSTYLE,NOLOGO,SAVECODE MEMO
*-- Si hay ProjectHook, reutilizo registro del archivo dummy
GOTO RECORD 2
@@ -2452,7 +2571,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
*-- Erase Dummy file record '__newproject.f2b'
DELETE
ELSE
- *-- Project Hook
+ *-- PROJECT HOOK
REPLACE ;
NAME WITH toProject._ProjectHookLibrary + CHR(0), ;
TYPE WITH 'W', ;
@@ -2461,7 +2580,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
RESERVED1 WITH toProject._ProjectHookClass + CHR(0)
ENDIF
- *-- Si hay icono de proyecto, lo inserto
+ *-- Si hay ICONO de proyecto, lo inserto
IF NOT EMPTY(toProject._Icon)
INSERT INTO TABLABIN ;
( NAME ;
@@ -2475,7 +2594,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, UPPER(JUSTSTEM(toProject._Icon)) )
ENDIF
- *-- Agrego los archivos
+ *-- Agrego los ARCHIVOS
FOR EACH loFile IN toProject FOXOBJECT
INSERT INTO TABLABIN ;
( NAME ;
@@ -2484,6 +2603,10 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, MAINPROG ;
, COMMENTS ;
, LOCAL ;
+ , CPID ;
+ , ID ;
+ , TIMESTAMP ;
+ , OBJREV ;
, KEY ) ;
VALUES ;
( loFile._Name + CHR(0) ;
@@ -2492,6 +2615,10 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, (loFile._Name == lcMainProg) ;
, loFile._Comments ;
, .T. ;
+ , loFile._CPID ;
+ , loFile._ID ;
+ , loFile._TimeStamp ;
+ , loFile._ObjRev ;
, UPPER(JUSTSTEM(loFile._Name)) )
ENDFOR
@@ -2617,7 +2744,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
#ENDIF
TRY
- LOCAL llBloqueEncontrado, X ;
+ LOCAL llBloqueEncontrado, lcComment, lcMetadatos, X, luValor ;
+ , laPropsAndValues_List(1,2), lnPropsAndValues_Count ;
, loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG'
IF LEFT( tcLine, LEN(C_BUILDPROJ_I) ) == C_BUILDPROJ_I
@@ -2625,28 +2753,43 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
STORE NULL TO loProject, loFile
X = I + 1
- FOR I = X TO tnLineas
- tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) )
+ WITH THIS
+ FOR I = X TO tnLineas
+ lcComment = ''
+ tcLine = LTRIM( ta_Lineas(I), 0, ' ', CHR(9) )
- DO CASE
- CASE LEFT( tcLine, LEN(C_BUILDPROJ_F) ) == C_BUILDPROJ_F
- I = I + 1
- EXIT
+ DO CASE
+ CASE LEFT( tcLine, LEN(C_BUILDPROJ_F) ) == C_BUILDPROJ_F
+ I = I + 1
+ EXIT
- CASE THIS.lineIsOnlyComment( @tcLine )
- LOOP && Saltear comentarios
+ CASE .lineIsOnlyComment( @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 '
- loFile = CREATEOBJECT('CL_PROJ_FILE')
- loFile._Name = ALLTRIM( STREXTRACT( tcLine, ['], ['] ) )
- toProject.ADD( loFile, loFile._Name )
- ENDCASE
- ENDFOR
+ CASE UPPER( LEFT( tcLine, 5 ) ) == '.ADD('
+ * loFile: NAME,TYPE,EXCLUDE,COMMENTS
+ tcLine = CHRTRAN( tcLine, ["] + '[]', "'''" ) && Convierto "[] en '
+ 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_List ;
+ , @lnPropsAndValues_Count, C_FILE_META_I, C_FILE_META_F )
+
+ loFile._Type = .get_ValueByName_FromListNamesWithValues( 'Type', 'C', @laPropsAndValues_List )
+ loFile._CPID = .get_ValueByName_FromListNamesWithValues( 'CPID', 'I', @laPropsAndValues_List )
+ loFile._Timestamp = .get_ValueByName_FromListNamesWithValues( 'Timestamp', 'I', @laPropsAndValues_List )
+ loFile._ID = .get_ValueByName_FromListNamesWithValues( 'ID', 'I', @laPropsAndValues_List )
+ loFile._ObjRev = .get_ValueByName_FromListNamesWithValues( 'ObjRev', 'I', @laPropsAndValues_List )
+
+ toProject.ADD( loFile, loFile._Name )
+ ENDCASE
+ ENDFOR
+ ENDWITH && THIS
I = I - 1
ENDIF
@@ -3038,7 +3181,12 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
CASE THIS.lineIsOnlyComment( @tcLine )
LOOP && Saltear comentarios
- CASE LEFT( tcLine, 9 ) == '.SetMain('
+ 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 )
@@ -3386,7 +3534,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
* (ES) AUTOGENERADO - PARA MANTENER INFORMACIÓN DE SERVIDORES DLL USAR "FOXBIN2PRG", SI NO IMPORTAN, EJECUTAR DIRECTAMENTE PARA REGENERAR EL PROYECTO.
* (EN) AUTOGENERATED - TO KEEP DLL SERVER INFORMATION USE "FOXBIN2PRG", OTHERWISE YOU CAN EXECUTE DIRECTLY TO REGENERATE PROJECT.
*--------------------------------------------------------------------------------------------------------------------------------------------------------
- <> Version = "<>", SourceFile = "<>" <>
+ <> Version="<>" SourceFile="<>" <>
*
ENDTEXT
ENDPROC
@@ -3443,7 +3591,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
*-- Escaneo el proyecto
SCAN ALL FOR NOT INLIST(TYPE, 'H','W','i' )
- SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS MEMO NAME loReg
+ SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV MEMO NAME loReg
loReg.NAME = LOWER( ALLTRIM( loReg.NAME, 0, ' ', CHR(0) ) )
loReg.COMMENTS = CHRTRAN( ALLTRIM( loReg.COMMENTS, 0, ' ', CHR(0) ), ['], ["] )
loProject.ADD( loReg, loReg.NAME )
@@ -3502,14 +3650,22 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
ENDTEXT
- *-- Definir archivos del proyecto
+ *-- Definir archivos del proyecto y metadata: CPID, Timestamp, ID, etc.
loProject.KEYSORT = 2
FOR EACH loReg IN loProject &&FOXOBJECT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>.ADD('<>')
ENDTEXT
-
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8
+ <><><<'&'>><<'&'>> <>
+ Type="<>"
+ Cpid="<>"
+ Timestamp="<>"
+ ID="<>"
+ ObjRev="<>"
+ <>
+ ENDTEXT
ENDFOR
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
@@ -3592,6 +3748,9 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
<>.Icon = lcCurdir + '<>'
<>.Debug = <>
<>.Encrypted = <>
+ <>*<.CmntStyle = <> />
+ <>*<.NoLogo = <> />
+ <>*<.SaveCode = <> />
<>.ProjectHookLibrary = '<>'
<>.ProjectHookClass = '<>'
<><>
@@ -3650,7 +3809,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
+ [] ;
+ [] ;
+ [] ;
- + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -3768,7 +3926,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*******************************************************************************************************************
PROCEDURE write_ADD_OBJECTS_WithProperties
LPARAMETERS toRegObj
-
+
#IF .F.
LOCAL toRegObj AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
#ENDIF
@@ -3805,22 +3963,19 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF NOT EMPTY(toRegObj.CLASSLOC)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- ClassLib = "<>" <<>>
+ ClassLib="<>" <<>>
ENDTEXT
ENDIF
- TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- BaseClass = "<>" Uniqueid = "<>" <<>>
- ENDTEXT
-
- TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- Timestamp = "<>" ZOrder = "<>" <<>>
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8
+ BaseClass="<>" UniqueID="<>"
+ Timestamp="<>" ZOrder="<>" <<>>
ENDTEXT
*-- Agrego metainformación para objetos OLE
IF toRegObj.BASECLASS == 'olecontrol'
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- OLEObject = "<>" checksum = "<>" <<>>
+ OLEObject="<>" CheckSum="<>" <<>>
ENDTEXT
ENDIF
@@ -3880,7 +4035,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF lnCommentRow > 0 AND NOT EMPTY(taPropsWithComments(lnCommentRow,2))
TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <>&& <>
+ <><>&& <>
ENDTEXT
ENDIF
@@ -3917,7 +4072,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!!
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
- <> Version = "<>", SourceFile = "<>" <>
+ <> Version="<>" SourceFile="<>" <>
*
ENDTEXT
ENDPROC
@@ -4000,14 +4155,14 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
lcPropName = RTRIM( GETWORDNUM( taProps(I), 1, '=' ) )
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>
+ <><>
ENDTEXT
lnComment = ASCAN( taPropsWithComments, lcPropName, 1, 0, 1, 8)
IF lnComment > 0 AND NOT EMPTY(taPropsWithComments(lnComment,2))
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <>&& <>
+ <><>&& <>
ENDTEXT
ENDIF
ENDFOR
@@ -4048,28 +4203,36 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><> Baseclass = "<>" Timestamp = "<>" Scale = "<>" Uniqueid = "<>" <<>>
+
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8
+ <><>
+ Baseclass="<>"
+ Timestamp="<>"
+ Scale="<>"
+ Uniqueid="<>"
ENDTEXT
IF NOT EMPTY(toRegClass.OLE2)
- TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- OLEObject = "<>" <<>>
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ OLEObject = "<>"
ENDTEXT
ENDIF
IF NOT EMPTY(toRegClass.RESERVED5)
- TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- ProjectClassIcon = "<>" <<>>
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ ProjectClassIcon="<>"
ENDTEXT
ENDIF
IF NOT EMPTY(toRegClass.RESERVED4)
- TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- ClassIcon = "<>" <<>>
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
+ ClassIcon="<>"
ENDTEXT
ENDIF
- TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8
<>
ENDTEXT
ENDPROC
@@ -4081,7 +4244,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Comentario de la clase
IF NOT EMPTY(toRegClass.RESERVED7) THEN
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <>
+ <><><<'&'+'&'>> <>
ENDTEXT
ENDIF
ENDPROC
@@ -4155,12 +4318,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
laOLE( lnOLECount ) = lcOLEChecksum
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <> Nombre = "<>" parent = "<>" objname = "<>" checksum = "<>" <<>>
+
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+8
+ <>
+ Nombre="<>"
+ Parent="<>"
+ ObjName="<>"
+ Checksum="<>" <<>>
ENDTEXT
IF NOT llOleExistente
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- value = "<>" <<>>
+ Value="<>" <<>>
ENDTEXT
ENDIF
@@ -4271,7 +4442,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*ENDIF
*lcLine = lcLine + CR_LF
-
+
lcLine = lcLine + tcLeftIndentation + laLines(I) + lcFinDeLinea
ENDFOR
@@ -4291,8 +4462,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
CATCH TO loEx
*loEx.UserValue = 'ATENCION: EL ERROR PODRIA SER DEL PROGRAMA FUENTE' + CR_LF + CR_LF ;
- + JUSTEXT(THIS.c_inputFile) + ' MEMO Line ' + TRANSFORM(I) + ':' + laLines(I) + CR_LF + CR_LF ;
- + 'Analyzed memo content:' + CR_LF + tcMethod
+ + JUSTEXT(THIS.c_inputFile) + ' MEMO Line ' + TRANSFORM(I) + ':' + laLines(I) + CR_LF + CR_LF ;
+ + 'Analyzed memo content:' + CR_LF + tcMethod
IF THIS.l_Debug
SET STEP ON
ENDIF
@@ -4973,16 +5144,21 @@ DEFINE CLASS CL_PROJECT AS COLLECTION
, RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD
_MEMBERDATA = [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -5010,17 +5186,23 @@ DEFINE CLASS CL_PROJECT AS COLLECTION
+ []
*-- Proj.Info
- _HomeDir = ''
- _ServerInfo = ''
+ _CmntStyle = 1
_Debug = .F.
_Encrypted = .F.
- _MainProg = ''
- _ProjectHookLibrary = ''
- _ProjectHookClass = ''
+ _HomeDir = ''
_Icon = ''
+ _ID = ''
+ _MainProg = ''
+ _NoLogo = .F.
+ _ObjRev = 0
+ _ProjectHookClass = ''
+ _ProjectHookLibrary = ''
+ _SaveCode = .T.
_ServerHead = NULL
- _Version = ''
+ _ServerInfo = ''
_SourceFile = ''
+ _TimeStamp = 0
+ _Version = ''
*-- Dev.info
_Autor = ''
@@ -5387,7 +5569,7 @@ DEFINE CLASS CL_PROJ_SRV_HEAD AS CUSTOM
WITH THIS
lnPos = 1
lnLen = 4
- lnLenH = 8 + 8 + LEN(._LibraryName) + 4 + LEN(._InternalName) + 4 + LEN(._ProjectName) + 4 + LEN(._TypeLibDesc) - 1
+ lnLenH = 8 + LEN(._LibraryName) + 4 + LEN(._InternalName) + 4 + LEN(._ProjectName) + 4 + LEN(._TypeLibDesc) - 1
*-- Header
lcStr = lcStr + PADL( 4, 4, ' ' ) + PADL( lnLenH, 4, ' ' )
@@ -5604,15 +5786,23 @@ DEFINE CLASS CL_PROJ_FILE AS CUSTOM
, RESETTODEFAULT, SAVEASCLASS, SHOWWHATSTHIS, WRITEEXPRESSION, WRITEMETHOD
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
- _Name = ''
- _Type = ''
- _Exclude = .F.
- _Comments = ''
+ _Name = ''
+ _Type = ''
+ _Exclude = .F.
+ _Comments = ''
+ _CPID = 0
+ _ID = 0
+ _ObjRev = 0
+ _TimeStamp = 0
ENDDEFINE