Pra quem embute schemas como resource

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pra quem embute schemas como resource

Mensagem por JoséQuintas »

É só um gerador de fonte pra não ter que digitar cada coisa.

Código: Selecionar todos

#include "directry.ch"
#include "set.ch"

PROCEDURE Main

   LOCAL acPath, oPath, cSrc1 := "", cSrc2 := ""

   cSrc1 += [PROCEDURE Test] + hb_Eol()
   cSrc1 += hb_Eol()
   cSrc1 += [   oFiles := SchemaFiles()] + hb_Eol()
   cSrc1 += [   FOR EACH cFile IN oFiles] + hb_Eol()
   cSrc1 += [      hb_MemoWrit( cFile, FileContent( cFile ) )] + hb_Eol()
   cSrc1 += [   NEXT] + hb_Eol()
   cSrc1 += hb_Eol()
   cSrc1 += [   RETURN] + hb_Eol()
   cSrc1 += hb_Eol()
   cSrc1 += [FUNCTION SchemaFiles()] + hb_Eol()
   cSrc1 += hb_Eol()
   cSrc2 := [FUNCTION FileContent( cFile )] + hb_Eol()
   cSrc2 += hb_Eol()
   cSrc2 += [   DO CASE] + hb_Eol()
   acPath := Directory( "*.*", "D" )
   FOR EACH oPath IN acPath
      IF oPath[ F_NAME ] <> "." .AND. oPath[ F_NAME ] <> ".." .AND. oPath[ F_ATTR ] == "D"
         GeraPath( oPath[ F_NAME ], @cSrc1, @cSrc2 )
      ENDIF
   NEXT
   cSrc1 += hb_Eol()
   cSrc1 += [   RETURN acFiles] + hb_Eol()
   cSrc1 += hb_Eol()
   cSrc2 += [   ENDCASE] + hb_Eol()
   cSrc2 += [   RETURN NIL]
   hb_MemoWrit( "x.prg", cSrc1 + cSrc2 )
   RETURN

FUNCTION GeraPath( cPath, cSrc1, cSrc2 )

   LOCAL aFiles, oFile

   aFiles := Directory( cPath + "\*.*" )
   FOR EACH oFile IN aFiles
      cSrc1 += [   AAdd( acFiles, "] + cPath + "\" + oFile[ F_NAME ] + [" )]  + hb_Eol()
      cSrc2 += [   CASE cFile == "] + cPath + [\] + oFile[ F_NAME ] + [" ; #pragma __binarystreaminclude "] + cPath + "\" + oFile[ F_NAME ] + ["        | RETURN %s] + hb_Eol()
   NEXT

   RETURN NIL
O fonte acima gera o fonte abaixo.

Código: Selecionar todos

PROCEDURE Test

   oFiles := SchemaFiles()
   FOR EACH cFile IN oFiles
      hb_MemoWrit( cFile, FileContent( cFile ) )
   NEXT

   RETURN

FUNCTION SchemaFiles()

   AAdd( acFiles, "PL_008i2_CFOP_EXTERNO\consReciNFe_v3.10.xsd" )
   AAdd( acFiles, "PL_008i2_CFOP_EXTERNO\consSitNFe_v3.10.xsd" )
   AAdd( acFiles, "PL_008i2_CFOP_EXTERNO\consStatServ_v3.10.xsd" )
   AAdd( acFiles, "PL_008i2_CFOP_EXTERNO\enviNFe_v3.10.xsd" )
   ...

   RETURN acFiles

FUNCTION FileContent( cFile )

   DO CASE
   CASE cFile == "PL_008i2_CFOP_EXTERNO\consReciNFe_v3.10.xsd" ; #pragma __binarystreaminclude "PL_008i2_CFOP_EXTERNO\consReciNFe_v3.10.xsd"        | RETURN %s
   CASE cFile == "PL_008i2_CFOP_EXTERNO\consSitNFe_v3.10.xsd" ; #pragma __binarystreaminclude "PL_008i2_CFOP_EXTERNO\consSitNFe_v3.10.xsd"        | RETURN %s
   CASE cFile == "PL_008i2_CFOP_EXTERNO\consStatServ_v3.10.xsd" ; #pragma __binarystreaminclude "PL_008i2_CFOP_EXTERNO\consStatServ_v3.10.xsd"        | RETURN %s
...
   ENDCASE
   RETURN NIL
Fazer como text ou outra coisa complica, porque eles usam UTF-8, e perderia formatação.

Mesmo assim, o mais prático é enviar um ZIP, caso tenha validação do lado do cliente.
Um intermediário seria embutir o ZIP no EXE, e descompactar pelo Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Pra quem embute schemas como resource

Mensagem por malcarli »

Bom dia, José. Obrigado por mais este exemplo excelente.
No trecho:

Código: Selecionar todos

CASE cFile == "PL_008i2_CFOP_EXTERNO\consReciNFe_v3.10.xsd" ; #pragma __binarystreaminclude "PL_008i2_CFOP_EXTERNO\consReciNFe_v3.10.xsd"        | RETURN %s
Cmo seria o comando para trocar o nome do arquivo na rotina em c?

Código: Selecionar todos


 #pragma __binarystreaminclude "PL_008i2_CFOP_EXTERNO\consReciNFe_v3.10.xsd"        | RETURN %s
exemplo:
#pragma __binarystreaminclude " + cfile | RETURN %s
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pra quem embute schemas como resource

Mensagem por JoséQuintas »

Isso é o resource do Harbour.
Precisa desse nome pra juntar o arquivo na linquedição.
Sem nome, sem arquivo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Pra quem embute schemas como resource

Mensagem por malcarli »

Achei um exemplo na net, mas tentei fazer e não deu certo

Código: Selecionar todos


#pragma -km+
   If !Hb_FileExists(PATHDADOS + cFile)
   #pragma __binarystreaminclude + '"' + hb_FNameNameExt( cFile ) + '"'  | RETURN %s
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pra quem embute schemas como resource

Mensagem por JoséQuintas »

Isso é do Harbour, vai incluir o conteúdo do schema em tempo de compilação

É algo como #include "conteúdo do arquivo de schema"

Se retirar o nome daí, como é que a COMPILAÇÃO vai saber o que acrescentar?

Acho que está confundindo compilação com execução.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

Pra quem embute schemas como resource

Mensagem por malcarli »

estaria enviando como parâmetro o cFile
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pra quem embute schemas como resource

Mensagem por JoséQuintas »

É... mas enviando como parâmetro pra quem????

Comparando, seria o mesmo que criar um arquivo RC, mas no próprio fonte.

Código: Selecionar todos

### arquivo RC

iconex   ICON   "arquivo.ico"
schema1 FILE "schema\\nota.xsd"
schema2 FILE "schema\\nota2.xsd"
O Harbour permite que ao invés de usar RC seja usado o fonte, com aquele #pragma ....
Aquilo já é o modo econômico, não dá pra reduzir mais.
O mínimo necessário é o nome do arquivo a ser embutido no EXE.

Ainda não sei se é vantagem isso, mas está aí a opção.

Talvez mais econômico embutir um ZIP e descompactar depois.
Ou enviar separado mesmo, até mesmo baixando direto do site da Sefaz.
De repente o antivírus atrapalha o ZIP.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder