Página 1 de 1

Pra quem embute schemas como resource

Enviado: 19 Dez 2016 13:25
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.

Pra quem embute schemas como resource

Enviado: 20 Dez 2016 10:22
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

Pra quem embute schemas como resource

Enviado: 20 Dez 2016 10:49
por JoséQuintas
Isso é o resource do Harbour.
Precisa desse nome pra juntar o arquivo na linquedição.
Sem nome, sem arquivo.

Pra quem embute schemas como resource

Enviado: 20 Dez 2016 11:28
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

Pra quem embute schemas como resource

Enviado: 20 Dez 2016 14:09
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.

Pra quem embute schemas como resource

Enviado: 20 Dez 2016 14:16
por malcarli
estaria enviando como parâmetro o cFile

Pra quem embute schemas como resource

Enviado: 20 Dez 2016 20:45
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.