Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Descompactacao de arquivos em lote #1

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
64 changes: 21 additions & 43 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,58 +1,36 @@
TOTVS - Microsiga Protheus Include (Header) Files
=================================================
Descompactador de Header Files (Include) do Microsiga Protheus da TOTVS
=======================================================================

Arquivos de cabeçalhos disponibilizados pela TOTVS em 5 de Junho de 2016.
## Descrição e instruções

Geralmente estes são disponibilizados compactados via [deflate](https://en.wikipedia.org/wiki/DEFLATE) em um formato de específico.
Script python que descompacta arquivos de extensão ".ch".

Estou aqui disponibilizando-os em um formato legível e de fácil acesso. Os arquivos se encontram dentro da pasta `include`.
Para o correto funcionamento:
1) Os arquivos de extensão ".ch" devem estar dentro da pasta "./include/" relativa ao local se executa o script.
2) A pasta "./decompressed/", relativa ao local se executa o script, deve estar criada.
3) A pasta "./decompressed/" deve estar vazia.

## Mais informações
Para cada arquivo, seu correspondente descompactado será criado na pasta "./decompressed/".
A versão original será mantida.

Os arquivos descompactados em linguagem AdvPL já estão disponibilizados na pasta `include`, os procedimentos seguintes não são necessários.
## Motivação

A maneira que usei para descompactar os arquivos cabeçalhos foi através do seguinte script python:
O uso de arquivos de cabeçalhos é pouco difundido no ADVPL e existem poucos exemplos instrutivos na internet.
Em um esforço para ajudar de forma educativa muitos programadores que trabalham com o Protheus, entendo que os arquivos de cabeçalhos da própria TOTVS garantem a qualidade da fonte de informação para o estudante autodidata.

decompress.py:

#!/usr/bin/python

import zlib
import sys

with open(sys.argv[1]) as f:
content = f.readlines()

compressed = ''.join(content)

decompress = zlib.decompressobj(-zlib.MAX_WBITS)
inflated = decompress.decompress(compressed[14:])
inflated += decompress.flush()

print (inflated[:-1])

Modo de uso:

./decompress.py script_compactado.ch > script_descompactado.ch

O entendimento e análise da compactação ocorreram na seguinte discussão:
## Origem

O entendimento e análise da compactação ocorreram da seguinte discussão:
<http://www.reddit.com/r/codes/comments/26bpbh/does_someone_knows_how_i_could_decompressdecode/>

## Exemplos de arquivos já descompactados

## Licença

Os arquivos de cabeçalhos foram descompactados e deixados intactos. Uma boa parte informa o copyright no topo do arquivo.
Os arquivos de cabeçalhos disponibilizados pela TOTVS em 20 de junho de 2024 através do link: https://suporte.totvs.com/portal/p/10098/download?e=491499 de modo compactado via [deflate](https://en.wikipedia.org/wiki/DEFLATE) foram descompactados e estão na pasta "decompressed" disponíveis em formato legível e de fácil acesso.

Deixo estes arquivos disponível como um esforço para que este possa ajudar de forma educativa muitos programadores que trabalham com o Protheus.
## Licença

O material aqui é disponibilizado sem nenhum lucro para aqueles que tem demonstrado um interesse prévio em receber essas informações para pesquisas e propósitos educativos.
Acredito que a disponibilização destes arquivos caiam num [Uso Justo](https://pt.wikipedia.org/wiki/Fair_use) e não ofenda o copyright, sendo que é apresentada na [Lei 9.609/98](http://www.planalto.gov.br/ccivil_03/Leis/L9609.htm) Artigo 6º II:

Acredito que a disponibilização destes arquivos caiam dentro de um [Uso Justo](https://pt.wikipedia.org/wiki/Fair_use) e não ofenda o copyright, sendo que é apresentada na [Lei 9.609/98](http://www.planalto.gov.br/ccivil_03/Leis/L9609.htm) Artigo 6º II:

Art. 6º Não constituem ofensa aos direitos do titular de programa de computador:
II - a citação parcial do programa, para fins didáticos, desde que identificados o programa e o titular dos direitos respectivos;

Estes arquivos de cabeçalhos não são significativos do sistema e não o colocam em risco. Sua disponibilização para estudo só traz o progresso e benefícios para a sociedade, já que torna possível um entendimento muito mais amplo de funções usadas no Protheus e facilita no desenvolvimento daqueles que usam esta plataforma.


Art. 6º Não constituem ofensa aos direitos do titular de programa de computador:
II - a citação parcial do programa, para fins didáticos, desde que identificados o programa e o titular dos direitos respectivos;
39 changes: 27 additions & 12 deletions decompress.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,33 @@
#!/usr/bin/python

# This script is free of copyright restrictions.

import zlib
import sys
from os import listdir
from os.path import isfile, join

with open(sys.argv[1]) as f:
content = f.readlines()

compressed = ''.join(content)
def descompactaUmArquivo(arq):
# Abre o arquivo e coloca o conteudo na string "content"
with open(arq, 'rb') as f:
content = f.read()
# descompacta
decompress = zlib.decompressobj(-zlib.MAX_WBITS)
inflated = decompress.decompress(content[14:])
inflated += decompress.flush()
# O texto descompactado é o valor retornado como string
return inflated[:-1].decode('utf-8', errors='ignore')

decompress = zlib.decompressobj(-zlib.MAX_WBITS)
inflated = decompress.decompress(compressed[14:])
inflated += decompress.flush()
def nomeValido(arq):
# Verifica se o nome do arquivo termina com '.ch' ou se é nome de um arquivo que já foi descompactado
return arq[len(arq) - 3:len(arq) - 0] == '.ch' or arq[len(arq) - 3:len(arq) - 0] == '.CH' or arq[len(arq) - 3:len(arq) - 0] == '.th' or arq[len(arq) - 3:len(arq) - 0] == '.TH'

print (inflated[:-1])
# Puxa a lista de nomes de arquivos no diretório atual
onlyfiles = [f for f in listdir('./include/') if isfile(join('./include/', f))]

for i in onlyfiles:
if nomeValido(i):
# descompacta
descompactado = descompactaUmArquivo('./include/' + i)
# Monta o nome do arquivo de destino
arqDestino = './decompressed/' + i
# Cria o arquivo de destino. Grava o arquivo. Fecha o arquivo
f = open(arqDestino, 'x')
f.write(descompactado)
f.close()
57 changes: 57 additions & 0 deletions decompressed/FWAdvplExpression.ch
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//Tipos de expressao
#define TOKEN_BLOCK 1
#define TOKEN_LITERAL 2
#define TOKEN_IDENTIFIER 3
#define TOKEN_PARENTS_EXP 4
#define TOKEN_BINARY_EXP 5
#define TOKEN_UNARY 6
#define TOKEN_LIST_EXP 7
#define TOKEN_EMPTY_EXP 8

//Tipos de literais
#define TOKEN_STRINGDOUBLE 1
#define TOKEN_STRINGSIMPLE 2
#define TOKEN_NUMBER 3
#define TOKEN_LOGICAL 4
#define TOKEN_NIL_VALUE 5


//Tipos de expressoes binarias
#define TOKEN_ASSIGNMENT 1
#define TOKEN_PLUS 2
#define TOKEN_MINUS 3
#define TOKEN_MULT 4
#define TOKEN_DIV 5
#define TOKEN_POW 6
#define TOKEN_ALIAS_ACCESS 7
#define TOKEN_AND 8
#define TOKEN_OR 9

#define TOKEN_MINOR 10
#define TOKEN_MINOREQUALS 11
#define TOKEN_MAJOR 12
#define TOKEN_MAJOREQUALS 13
#define TOKEN_EQUALS 14
#define TOKEN_DOUBLEEQUAL 15
#define TOKEN_NOT_EQUAL 16
#define TOKEN_CONTAINED 17

//Tipos de Unary
#define TOKEN_PLUS_PLUS 1
#define TOKEN_MINUS_MINUS 2
#define TOKEN_EXCLAMATION 3
#define TOKEN_NEGATIVE 4
#define TOKEN_MACRO 5

//Tipos de IDENTIFIER
#define TOKEN_ID_NAME 1
#define TOKEN_ID_ATT 2
#define TOKEN_CALL_FUNCTION 3
#define TOKEN_CALL_METHOD 4
#define TOKEN_ID_ALIAS 5
#define TOKEN_ID_FIELD 6

//Tipos de Expression List
#define TOKEN_ARRAY_ACCESS 1
#define TOKEN_ARGUMENTS 2
#define TOKEN_ROOT_EXPRESSIONS 3
Expand Down
36 changes: 36 additions & 0 deletions decompressed/IdxDefException.ch
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
Header : IdxDefException.ch
Copyright (c) 1997-2006, Microsiga Software SA
All rights reserved.
*/

#define EIS_NFCfgIdxName 1 //"Nao foi encontrado configuracao para esse IndexName"
#define EIS_NCFIdxCache 2 //"Nao foi possivel criar o arquivo IDXCACHE.DTC"
#define EIS_OSIdxName 3 //"E Obrigatorio enviar o IndexName"
#define EIS_TabOrig 4 //"O nome da tabela obrigatorio."
#define EIS_VNAaFields 5 //"A Variavel aFields nao e uma Array"
#define EIS_VNAaUser 6 //"A Variavel aUser nao e uma Array"
#define EIS_OIOperation 7 //"E obrigatorio informar a Operacao"
#define EIS_ISOperation 8 //"A Operacao enviada esta incorreta"
#define EIS_OIUIFieldsUsers 9 //"Operacoes Inclusao/Alteracao sao necessarios informar Arrays de Fields e Users"
#define EIS_NFWsIdxServer 10 //"Nao foi encontrado o WebService do IndexServer"
#define EIS_WSCError 11 //"Erro de Comunicacao do WebService"
#define EIS_OILIdxSearch 12 //"E obrigatorio informar uma lista com os Indices para pesquisa"
#define EIS_NIISearch 13 //"Nao foi informado o item para pesquisa"
#define EIS_NFFXmlCfg 14 //"Arquivo XML de configuracao nao encontrado"
#define EIS_NFFCtreeCache 15 //"Arquivo de CTREE de Cache nao encontrado"
#define EIS_NCCDirIdxSrv 16 //"Diretorio do INDEXSERVER nao pode ser criado"
#define EIS_NCCDirIdxName 17 //"Diretorio do INDEXNAME nao pode ser criado"
#define EIS_NCCDirData 18 //"Diretorio do DATA nao pode ser criado"
#define EIS_NCCDirCache 19 //"Diretorio do CACHE nao pode ser criado"
#define EIS_NCAFSTAscdDscd 20 //"As flags de Ascending e Descendig nao podem ser habilitadas ao mesmo tempo"
#define EIS_OIIndexName 21 //"E Obrigatorio informar o nome do Indice"
#define EIS_NEKSIdxSrvWSLoc 22 //"Nao foi encontrada a Chave INDEXSRVWSLOCATION no .INI do Server"
#define EIS_NPFTransaction 23 //"Nao foi possivel finalizar a Transacao"
#define EIS_NOpenExclusive 24 //"Nao foi possivel abrir arquivo para criacao de indice (exclusivo)"
#define EIS_VNAFolders 25 //"A variavel aFolders no uma array."
#define EIS_VNAIncFilters 26 //"A variavel aIncludeFilters no uma array."
#define EIS_VNAExcFilters 27 //"A variavel aExcludeFilters no uma array."
#define EIS_CTREECREATE 28 //"Arquivo do CTree em criao."
#define EIS_INDEXSERVER 29 //"Arquivo do CTree em criao."
#define EIS_INDEXPORT 30 //"Arquivo do CTree em criao."
Expand Down
28 changes: 28 additions & 0 deletions decompressed/IdxSrvException.ch
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
Header : IdxSrvException.ch
Copyright (c) 1997-2006, Microsiga Software SA
All rights reserved.
*/

#define IDXEX_UNKNOWN 1
#define IDXEX_INDEXSERVERNAME_INVALID 2
#define IDXEX_INDEXSERVERPORT_INVALID 3
#define IDXEX_INDEXNAME_INVALID 4
#define IDXEX_TABLENAME_INVALID 5
#define IDXEX_ARRAY_INVALID 6
#define IDXEX_OPERATION_INVALID 7
#define IDXEX_INCORRECT_OPERATION 8
#define IDXEX_OIUIFieldsUsers 9
#define IDXEX_WEBSERVICE_NOTFOUND 10
#define IDXEX_WEBSERVICE_CONNECTION_ERROR 11
#define IDXEX_WEBSERVICE_TRANSACTION_ERROR 12
#define IDXEX_INDEX_LIST_ERROR 13 //" obrigatrio informar uma lista com os indices para pesquisa."
#define IDXEX_INDEX_ITEM_ERROR 14 //"No foi informado o item para pesquisa."
#define IDXEX_INDEX_ORDER_ERROR 15 //"As flags de Ascending e Descendig no podem ser habilitadas ao mesmo tempo."
#define IDXEX_DIRECTORY_ERROR 16 //"Diretorio do [%1] nao pode ser criado."
#define IDXEX_OPEN_FILE_ERROR 17 //"Arquivo [%1] nao encontrado."
#define IDXEX_CREATE_FILE_ERROR 18 //"No foi possivel criar o arquivo: [%1]."
#define IDXEX_OPEN_FILE_EXCLUSIVE_ERROR 19 //"Nao foi possivel abrir arquivo para criacao de indice (exclusivo)"
#define IDXEX_CONFIGURATION_ERROR 20 //"Nao foi encontrado configurao para esse Index Name"
#define IDXEX_SetFaultSoap_ERROR 21 //"Erro enviado pelo SetFaultSoap"

Expand Down
19 changes: 19 additions & 0 deletions decompressed/OfficeEvents.ch
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#DEFINE OFFICE_START "1001"
#DEFINE OFFICE_SHUTDOWN "1000"
#define OFFICE_BEGINXMLDATA "2001"
#define OFFICE_SENDXMLDATA "2002"
#define OFFICE_ENDXMLDATA "2003"
#define OFFICE_ENDXMLTABLE "2004"
#define OFFICE_DOSEARCH "2005"
#define OFFICE_PANELSEARCH "2006"
#DEFINE OFFICE_SMARTCLIENTEXCEPTION "9000"
#DEFINE OFFICE_SMARTCLIENTKILLPROCESS "9001"
#define OFFICE_SENDMENULOTUS "5001"
#define OFFICE_SENDACTIONLOTUS "5002"
#define OFFICE_SENDFIELDSLOTUS "5003"
#define OFFICE_SENDFIELDSVALUELOTUS "5004"
#define OFFICE_CFGMALADIRETA "5005"
#define OFFICE_SKIP "5006"
#define OFFICE_GETALIASRECNO "5007"
#define OFFICE_VERIFYRELATION "5008"
#define OFFICE_ENDLOADPANEL "5009"
Expand Down
34 changes: 34 additions & 0 deletions decompressed/OfficeInfo.ch
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

#define TAB_DATA_VIEW_NONE 0
#define TAB_DATA_VIEW_FORM 1
#define TAB_DATA_VIEW_GRID 2

#DEFINE OT_NOMEPASTA 1
#DEFINE OT_DESCPOR 2
#DEFINE OT_DESCENG 3
#DEFINE OT_DESCSPA 4
#DEFINE OT_TIPOOBJ 5
#DEFINE OT_PASTAAF 6
#DEFINE OT_ALTURA 7
#DEFINE OT_RELATION 8
#DEFINE OT_TABRELATION 9
#DEFINE OT_REALTABLE 10
#DEFINE OT_AUTOSIZE 11
#DEFINE OT_PRGINIC 12
#DEFINE OT_TABELA 13
#DEFINE OT_CAMPOS 14
#DEFINE OT_ORDER 15
#DEFINE OT_TABDESC 16
#DEFINE OT_FORMULAS 17
#DEFINE OT_FILTROS 18
#DEFINE OT_DUMMY1 19
#DEFINE OT_DUMMY2 20

#DEFINE OT_CDESPOR 5
#DEFINE OT_CDESENG 6
#DEFINE OT_CDESSPA 7
#DEFINE OT_OWNTABLE 8
#DEFINE OT_OWNDESTAB 9

#DEFINE TIT_IDIOMA OfficeInfoTitleDes():getTitleIdiomOfficeInfo()
#DEFINE DES_IDIOMA OfficeInfoTitleDes():getDescIdiomOfficeInfo()
Expand Down
Loading