Commit e1d7adf3580ad4297d1d30f220b6ccde84f3a64b
1 parent
00e98f6e
Exists in
master
and in
5 other branches
Como o antigo plugin remotectl foi totalmente remodelado para suportar hllapi na…
…da mais lógico que mudar o nome para hllapi
Showing
30 changed files
with
3195 additions
and
3176 deletions
Show diff stats
Makefile.in
@@ -326,7 +326,7 @@ clean: | @@ -326,7 +326,7 @@ clean: | ||
326 | @make -C src/lib3270 clean | 326 | @make -C src/lib3270 clean |
327 | @make -C src/pw3270 clean | 327 | @make -C src/pw3270 clean |
328 | @make -C src/tools clean | 328 | @make -C src/tools clean |
329 | - @make -C src/plugins/remotectl clean | 329 | + @make -C src/plugins/hllapi clean |
330 | @make -C src/plugins/rx3270 clean | 330 | @make -C src/plugins/rx3270 clean |
331 | @make -C src/plugins/dbus3270 clean | 331 | @make -C src/plugins/dbus3270 clean |
332 | @make -C src/oxt clean | 332 | @make -C src/oxt clean |
@@ -356,10 +356,10 @@ distclean: clean | @@ -356,10 +356,10 @@ distclean: clean | ||
356 | 356 | ||
357 | #---[ Plugins ]---------------------------------------------------------------- | 357 | #---[ Plugins ]---------------------------------------------------------------- |
358 | 358 | ||
359 | -$(BINDIR)/Debug/plugins/remotectl@DLLEXT@: src/plugins/remotectl/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT) | 359 | +$(BINDIR)/Debug/plugins/hllapi@DLLEXT@: src/plugins/hllapi/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT) |
360 | @make $(PLUGIN_DEBUG_ARGS) -C $(dir $<) Debug | 360 | @make $(PLUGIN_DEBUG_ARGS) -C $(dir $<) Debug |
361 | 361 | ||
362 | -$(BINDIR)/Release/plugins/remotectl@DLLEXT@: src/plugins/remotectl/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) | 362 | +$(BINDIR)/Release/plugins/hllapi@DLLEXT@: src/plugins/hllapi/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) |
363 | @make $(PLUGIN_RELEASE_ARGS) -C $(dir $<) Release | 363 | @make $(PLUGIN_RELEASE_ARGS) -C $(dir $<) Release |
364 | 364 | ||
365 | $(BINDIR)/Debug/plugins/rx3270@DLLEXT@: src/plugins/rx3270/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT) | 365 | $(BINDIR)/Debug/plugins/rx3270@DLLEXT@: src/plugins/rx3270/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT) |
configure.ac
@@ -128,7 +128,7 @@ case "$host" in | @@ -128,7 +128,7 @@ case "$host" in | ||
128 | DLLDIR="" | 128 | DLLDIR="" |
129 | DBGCMDPREFIX="" | 129 | DBGCMDPREFIX="" |
130 | LDARCH="" | 130 | LDARCH="" |
131 | - PLUGINS="remotectl" | 131 | + PLUGINS="hllapi" |
132 | APP_GUI_SRC="resources.rc" | 132 | APP_GUI_SRC="resources.rc" |
133 | ;; | 133 | ;; |
134 | 134 | ||
@@ -433,7 +433,7 @@ AC_CONFIG_FILES([ | @@ -433,7 +433,7 @@ AC_CONFIG_FILES([ | ||
433 | src/oxt/Makefile | 433 | src/oxt/Makefile |
434 | src/pw3270/uiparser/Makefile | 434 | src/pw3270/uiparser/Makefile |
435 | src/tools/Makefile | 435 | src/tools/Makefile |
436 | - src/plugins/remotectl/Makefile | 436 | + src/plugins/hllapi/Makefile |
437 | src/plugins/rx3270/Makefile | 437 | src/plugins/rx3270/Makefile |
438 | src/plugins/dbus3270/Makefile | 438 | src/plugins/dbus3270/Makefile |
439 | man/Makefile | 439 | man/Makefile |
po/pt_BR.po
@@ -5,7 +5,7 @@ msgid "" | @@ -5,7 +5,7 @@ msgid "" | ||
5 | msgstr "" | 5 | msgstr "" |
6 | "Project-Id-Version: pw3270 5.0\n" | 6 | "Project-Id-Version: pw3270 5.0\n" |
7 | "Report-Msgid-Bugs-To: \n" | 7 | "Report-Msgid-Bugs-To: \n" |
8 | -"POT-Creation-Date: 2013-03-04 18:26-0300\n" | 8 | +"POT-Creation-Date: 2013-03-06 09:33-0300\n" |
9 | "PO-Revision-Date: 2013-02-25 14:46-0300\n" | 9 | "PO-Revision-Date: 2013-02-25 14:46-0300\n" |
10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" | 10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" |
11 | "Language-Team: Português <>\n" | 11 | "Language-Team: Português <>\n" |
@@ -91,11 +91,11 @@ msgstr "- Emulador 3270 para GTK" | @@ -91,11 +91,11 @@ msgstr "- Emulador 3270 para GTK" | ||
91 | msgid "16 colors" | 91 | msgid "16 colors" |
92 | msgstr "16 cores" | 92 | msgstr "16 cores" |
93 | 93 | ||
94 | -#: screen.c:653 screen.c:683 screen.c:697 screen.c:816 | 94 | +#: screen.c:655 screen.c:685 screen.c:699 screen.c:818 |
95 | msgid "3270 Error" | 95 | msgid "3270 Error" |
96 | msgstr "Erro 3270" | 96 | msgstr "Erro 3270" |
97 | 97 | ||
98 | -#: screen.c:668 | 98 | +#: screen.c:670 |
99 | msgid "3270 Warning" | 99 | msgid "3270 Warning" |
100 | msgstr "Alerta 3270" | 100 | msgstr "Alerta 3270" |
101 | 101 | ||
@@ -200,7 +200,7 @@ msgstr "Sobre a segurança" | @@ -200,7 +200,7 @@ msgstr "Sobre a segurança" | ||
200 | msgid "Action failed" | 200 | msgid "Action failed" |
201 | msgstr "Ação falhou" | 201 | msgstr "Ação falhou" |
202 | 202 | ||
203 | -#: ui/00default.xml:64 | 203 | +#: ui/00default.xml:286 |
204 | msgid "Add to copy" | 204 | msgid "Add to copy" |
205 | msgstr "Adicionar à cópia" | 205 | msgstr "Adicionar à cópia" |
206 | 206 | ||
@@ -208,7 +208,7 @@ msgstr "Adicionar à cópia" | @@ -208,7 +208,7 @@ msgstr "Adicionar à cópia" | ||
208 | msgid "Add/Remove _CR at end of line" | 208 | msgid "Add/Remove _CR at end of line" |
209 | msgstr "Adicionar/Remover _CR no final da linha" | 209 | msgstr "Adicionar/Remover _CR no final da linha" |
210 | 210 | ||
211 | -#: ui/00default.xml:132 | 211 | +#: ui/00default.xml:354 |
212 | msgid "Alert sound" | 212 | msgid "Alert sound" |
213 | msgstr "Aviso sonoro" | 213 | msgstr "Aviso sonoro" |
214 | 214 | ||
@@ -221,7 +221,7 @@ msgstr "" | @@ -221,7 +221,7 @@ msgstr "" | ||
221 | msgid "Application name" | 221 | msgid "Application name" |
222 | msgstr "Nome da aplicação" | 222 | msgstr "Nome da aplicação" |
223 | 223 | ||
224 | -#: ui/10keypad.xml:467 | 224 | +#: ui/10keypad.xml:155 |
225 | msgid "Attn" | 225 | msgid "Attn" |
226 | msgstr "Attn" | 226 | msgstr "Attn" |
227 | 227 | ||
@@ -238,7 +238,7 @@ msgstr "Authority and issuer serial number mismatch" | @@ -238,7 +238,7 @@ msgstr "Authority and issuer serial number mismatch" | ||
238 | msgid "Authority and subject key identifier mismatch" | 238 | msgid "Authority and subject key identifier mismatch" |
239 | msgstr "Authority and subject key identifier mismatch" | 239 | msgstr "Authority and subject key identifier mismatch" |
240 | 240 | ||
241 | -#: ui/00default.xml:127 | 241 | +#: ui/00default.xml:349 |
242 | msgid "Auto-Reconnect" | 242 | msgid "Auto-Reconnect" |
243 | msgstr "Reconectar automaticamente" | 243 | msgstr "Reconectar automaticamente" |
244 | 244 | ||
@@ -262,11 +262,11 @@ msgstr "Versão winsock inválida" | @@ -262,11 +262,11 @@ msgstr "Versão winsock inválida" | ||
262 | msgid "Black" | 262 | msgid "Black" |
263 | msgstr "Preto" | 263 | msgstr "Preto" |
264 | 264 | ||
265 | -#: ui/00default.xml:125 | 265 | +#: ui/00default.xml:347 |
266 | msgid "Blank Fill" | 266 | msgid "Blank Fill" |
267 | msgstr "Completar com espaços" | 267 | msgstr "Completar com espaços" |
268 | 268 | ||
269 | -#: ui/00default.xml:118 | 269 | +#: ui/00default.xml:340 |
270 | msgid "Blinking Cursor" | 270 | msgid "Blinking Cursor" |
271 | msgstr "Cursor piscante" | 271 | msgstr "Cursor piscante" |
272 | 272 | ||
@@ -274,7 +274,7 @@ msgstr "Cursor piscante" | @@ -274,7 +274,7 @@ msgstr "Cursor piscante" | ||
274 | msgid "Blue" | 274 | msgid "Blue" |
275 | msgstr "Azul" | 275 | msgstr "Azul" |
276 | 276 | ||
277 | -#: ui/00default.xml:128 | 277 | +#: ui/00default.xml:350 |
278 | msgid "Bold" | 278 | msgid "Bold" |
279 | msgstr "Negrito" | 279 | msgstr "Negrito" |
280 | 280 | ||
@@ -282,7 +282,7 @@ msgstr "Negrito" | @@ -282,7 +282,7 @@ msgstr "Negrito" | ||
282 | msgid "Brazilian Public Software Portal" | 282 | msgid "Brazilian Public Software Portal" |
283 | msgstr "Portal do Software Público Brasileiro" | 283 | msgstr "Portal do Software Público Brasileiro" |
284 | 284 | ||
285 | -#: ui/10keypad.xml:468 | 285 | +#: ui/10keypad.xml:156 |
286 | msgid "Break" | 286 | msgid "Break" |
287 | msgstr "Break" | 287 | msgstr "Break" |
288 | 288 | ||
@@ -474,7 +474,7 @@ msgstr "Tabela de tradução tem %d entradas, precisa de 256" | @@ -474,7 +474,7 @@ msgstr "Tabela de tradução tem %d entradas, precisa de 256" | ||
474 | msgid "Charset has more than 256 entries" | 474 | msgid "Charset has more than 256 entries" |
475 | msgstr "Tabela de tradução tem mais de 256 caracteres" | 475 | msgstr "Tabela de tradução tem mais de 256 caracteres" |
476 | 476 | ||
477 | -#: ui/00default.xml:79 | 477 | +#: ui/10keypad.xml:147 |
478 | msgid "Clear" | 478 | msgid "Clear" |
479 | msgstr "Limpar" | 479 | msgstr "Limpar" |
480 | 480 | ||
@@ -486,7 +486,7 @@ msgstr "Tema de cores:" | @@ -486,7 +486,7 @@ msgstr "Tema de cores:" | ||
486 | msgid "Color setup" | 486 | msgid "Color setup" |
487 | msgstr "Configuração de cores" | 487 | msgstr "Configuração de cores" |
488 | 488 | ||
489 | -#: ui/00default.xml:107 | 489 | +#: ui/00default.xml:329 |
490 | msgid "Colors" | 490 | msgid "Colors" |
491 | msgstr "Cores" | 491 | msgstr "Cores" |
492 | 492 | ||
@@ -494,7 +494,7 @@ msgstr "Cores" | @@ -494,7 +494,7 @@ msgstr "Cores" | ||
494 | msgid "Complete" | 494 | msgid "Complete" |
495 | msgstr "Completo" | 495 | msgstr "Completo" |
496 | 496 | ||
497 | -#: ui/00default.xml:117 | 497 | +#: ui/00default.xml:339 |
498 | msgid "Connect on startup" | 498 | msgid "Connect on startup" |
499 | msgstr "Conectar ao iniciar" | 499 | msgstr "Conectar ao iniciar" |
500 | 500 | ||
@@ -502,19 +502,19 @@ msgstr "Conectar ao iniciar" | @@ -502,19 +502,19 @@ msgstr "Conectar ao iniciar" | ||
502 | msgid "Connection reset by peer" | 502 | msgid "Connection reset by peer" |
503 | msgstr "Conexão foi cancelada pelo servidor" | 503 | msgstr "Conexão foi cancelada pelo servidor" |
504 | 504 | ||
505 | -#: ui/00default.xml:61 | 505 | +#: ui/00default.xml:283 |
506 | msgid "Copy" | 506 | msgid "Copy" |
507 | msgstr "Copiar" | 507 | msgstr "Copiar" |
508 | 508 | ||
509 | -#: ui/99debug.xml:566 | 509 | +#: ui/99debug.xml:200 |
510 | msgid "Copy as HTML" | 510 | msgid "Copy as HTML" |
511 | msgstr "Copiar como HTML" | 511 | msgstr "Copiar como HTML" |
512 | 512 | ||
513 | -#: ui/00default.xml:62 | 513 | +#: ui/00default.xml:284 |
514 | msgid "Copy as table" | 514 | msgid "Copy as table" |
515 | msgstr "Copiar como tabela" | 515 | msgstr "Copiar como tabela" |
516 | 516 | ||
517 | -#: colors.c:418 ui/00default.xml:124 | 517 | +#: colors.c:418 ui/00default.xml:346 |
518 | msgid "Cross hair cursor" | 518 | msgid "Cross hair cursor" |
519 | msgstr "Cursor mira" | 519 | msgstr "Cursor mira" |
520 | 520 | ||
@@ -527,7 +527,7 @@ msgstr "Atual (%s)" | @@ -527,7 +527,7 @@ msgstr "Atual (%s)" | ||
527 | msgid "Custom colors" | 527 | msgid "Custom colors" |
528 | msgstr "Cores personalizadas" | 528 | msgstr "Cores personalizadas" |
529 | 529 | ||
530 | -#: ui/00default.xml:65 | 530 | +#: ui/00default.xml:287 |
531 | msgid "Cut" | 531 | msgid "Cut" |
532 | msgstr "Recortar" | 532 | msgstr "Recortar" |
533 | 533 | ||
@@ -539,7 +539,7 @@ msgstr "Cilindros" | @@ -539,7 +539,7 @@ msgstr "Cilindros" | ||
539 | msgid "DFT B_uffer size:" | 539 | msgid "DFT B_uffer size:" |
540 | msgstr "Tamanho do b_uffer DFT:" | 540 | msgstr "Tamanho do b_uffer DFT:" |
541 | 541 | ||
542 | -#: ui/99debug.xml:571 | 542 | +#: ui/99debug.xml:205 |
543 | msgid "DS Trace" | 543 | msgid "DS Trace" |
544 | msgstr "DS Trace" | 544 | msgstr "DS Trace" |
545 | 545 | ||
@@ -555,11 +555,11 @@ msgstr "Verde Escuro" | @@ -555,11 +555,11 @@ msgstr "Verde Escuro" | ||
555 | msgid "Data conversion error" | 555 | msgid "Data conversion error" |
556 | msgstr "Erro na conversão de dados" | 556 | msgstr "Erro na conversão de dados" |
557 | 557 | ||
558 | -#: ui/99debug.xml:579 | 558 | +#: ui/99debug.xml:213 |
559 | msgid "Debug" | 559 | msgid "Debug" |
560 | msgstr "Depuração" | 560 | msgstr "Depuração" |
561 | 561 | ||
562 | -#: ui/99debug.xml:581 | 562 | +#: ui/99debug.xml:215 |
563 | msgid "Debug window updates" | 563 | msgid "Debug window updates" |
564 | msgstr "Mostrar atualizações de janela" | 564 | msgstr "Mostrar atualizações de janela" |
565 | 565 | ||
@@ -567,7 +567,7 @@ msgstr "Mostrar atualizações de janela" | @@ -567,7 +567,7 @@ msgstr "Mostrar atualizações de janela" | ||
567 | msgid "Default" | 567 | msgid "Default" |
568 | msgstr "Padrão" | 568 | msgstr "Padrão" |
569 | 569 | ||
570 | -#: ui/00default.xml:81 | 570 | +#: ui/00default.xml:303 |
571 | msgid "Delete field" | 571 | msgid "Delete field" |
572 | msgstr "Apagar campo" | 572 | msgstr "Apagar campo" |
573 | 573 | ||
@@ -599,7 +599,7 @@ msgstr "Nome do servidor em branco" | @@ -599,7 +599,7 @@ msgstr "Nome do servidor em branco" | ||
599 | msgid "Empty port name" | 599 | msgid "Empty port name" |
600 | msgstr "Porta em branco" | 600 | msgstr "Porta em branco" |
601 | 601 | ||
602 | -#: ui/10keypad.xml:463 | 602 | +#: ui/10keypad.xml:151 |
603 | msgid "" | 603 | msgid "" |
604 | "Erase\n" | 604 | "Erase\n" |
605 | "EOF" | 605 | "EOF" |
@@ -607,7 +607,7 @@ msgstr "" | @@ -607,7 +607,7 @@ msgstr "" | ||
607 | "Apagar\n" | 607 | "Apagar\n" |
608 | "Campo" | 608 | "Campo" |
609 | 609 | ||
610 | -#: ui/10keypad.xml:464 | 610 | +#: ui/10keypad.xml:152 |
611 | msgid "" | 611 | msgid "" |
612 | "Erase\n" | 612 | "Erase\n" |
613 | "Input" | 613 | "Input" |
@@ -615,15 +615,15 @@ msgstr "" | @@ -615,15 +615,15 @@ msgstr "" | ||
615 | "Apagar\n" | 615 | "Apagar\n" |
616 | "Campos" | 616 | "Campos" |
617 | 617 | ||
618 | -#: ui/00default.xml:80 | 618 | +#: ui/00default.xml:302 |
619 | msgid "Erase input" | 619 | msgid "Erase input" |
620 | msgstr "Apagar campos" | 620 | msgstr "Apagar campos" |
621 | 621 | ||
622 | -#: ui/00default.xml:82 | 622 | +#: ui/00default.xml:304 |
623 | msgid "Erase to end of field" | 623 | msgid "Erase to end of field" |
624 | msgstr "Apagar até o final do campo" | 624 | msgstr "Apagar até o final do campo" |
625 | 625 | ||
626 | -#: ui/00default.xml:83 | 626 | +#: ui/00default.xml:305 |
627 | msgid "Erase to end of line" | 627 | msgid "Erase to end of line" |
628 | msgstr "Apagar até o final da linha" | 628 | msgstr "Apagar até o final da linha" |
629 | 629 | ||
@@ -666,7 +666,7 @@ msgstr "Erro lendo %s" | @@ -666,7 +666,7 @@ msgstr "Erro lendo %s" | ||
666 | msgid "Error resolving %s: %s" | 666 | msgid "Error resolving %s: %s" |
667 | msgstr "Erro ao resolver %s: %s" | 667 | msgstr "Erro ao resolver %s: %s" |
668 | 668 | ||
669 | -#: ui/99debug.xml:573 | 669 | +#: ui/99debug.xml:207 |
670 | msgid "Event Trace" | 670 | msgid "Event Trace" |
671 | msgstr "Trace de eventos" | 671 | msgstr "Trace de eventos" |
672 | 672 | ||
@@ -714,11 +714,11 @@ msgstr "Format error in certificate's notAfter field" | @@ -714,11 +714,11 @@ msgstr "Format error in certificate's notAfter field" | ||
714 | msgid "Format error in certificate's notBefore field" | 714 | msgid "Format error in certificate's notBefore field" |
715 | msgstr "Format error in certificate's notBefore field" | 715 | msgstr "Format error in certificate's notBefore field" |
716 | 716 | ||
717 | -#: ui/00default.xml:121 | 717 | +#: ui/00default.xml:343 |
718 | msgid "Full Screen" | 718 | msgid "Full Screen" |
719 | msgstr "Tela cheia" | 719 | msgstr "Tela cheia" |
720 | 720 | ||
721 | -#: ui/10functions.xml:347 | 721 | +#: ui/10functions.xml:35 |
722 | msgid "Function bar" | 722 | msgid "Function bar" |
723 | msgstr "Barra de funções" | 723 | msgstr "Barra de funções" |
724 | 724 | ||
@@ -763,7 +763,7 @@ msgstr "HTTP Proxy: EOF inesperado" | @@ -763,7 +763,7 @@ msgstr "HTTP Proxy: EOF inesperado" | ||
763 | msgid "HTTP Proxy: unrecognized reply" | 763 | msgid "HTTP Proxy: unrecognized reply" |
764 | msgstr "HTTP Proxy: Resposta desconhecida" | 764 | msgstr "HTTP Proxy: Resposta desconhecida" |
765 | 765 | ||
766 | -#: ui/00default.xml:142 | 766 | +#: ui/00default.xml:364 |
767 | msgid "Help" | 767 | msgid "Help" |
768 | msgstr "Ajuda" | 768 | msgstr "Ajuda" |
769 | 769 | ||
@@ -824,7 +824,7 @@ msgstr "Comprimento de frame inválido" | @@ -824,7 +824,7 @@ msgstr "Comprimento de frame inválido" | ||
824 | msgid "Informations" | 824 | msgid "Informations" |
825 | msgstr "Informações" | 825 | msgstr "Informações" |
826 | 826 | ||
827 | -#: ui/00default.xml:137 | 827 | +#: ui/00default.xml:359 |
828 | msgid "Input method" | 828 | msgid "Input method" |
829 | msgstr "Método de entrada" | 829 | msgstr "Método de entrada" |
830 | 830 | ||
@@ -871,7 +871,7 @@ msgstr "Sintaxe de proxy inválida" | @@ -871,7 +871,7 @@ msgstr "Sintaxe de proxy inválida" | ||
871 | msgid "Invalid proxy type '%.*s'" | 871 | msgid "Invalid proxy type '%.*s'" |
872 | msgstr "Tipo de proxy invalido '%.*s'" | 872 | msgstr "Tipo de proxy invalido '%.*s'" |
873 | 873 | ||
874 | -#: ui/00default.xml:130 | 874 | +#: ui/00default.xml:352 |
875 | msgid "Keep selected" | 875 | msgid "Keep selected" |
876 | msgstr "Manter selecionado" | 876 | msgstr "Manter selecionado" |
877 | 877 | ||
@@ -887,7 +887,7 @@ msgstr "Teclado está bloqueado" | @@ -887,7 +887,7 @@ msgstr "Teclado está bloqueado" | ||
887 | msgid "LRECL:" | 887 | msgid "LRECL:" |
888 | msgstr "LRECL:" | 888 | msgstr "LRECL:" |
889 | 889 | ||
890 | -#: ui/10keypad.xml:413 | 890 | +#: ui/10keypad.xml:101 |
891 | msgid "Lateral keypad" | 891 | msgid "Lateral keypad" |
892 | msgstr "Barra lateral" | 892 | msgstr "Barra lateral" |
893 | 893 | ||
@@ -904,7 +904,7 @@ msgstr "Faltando ']'" | @@ -904,7 +904,7 @@ msgstr "Faltando ']'" | ||
904 | msgid "Model %d (%s)" | 904 | msgid "Model %d (%s)" |
905 | msgstr "Modelo %d (%s)" | 905 | msgstr "Modelo %d (%s)" |
906 | 906 | ||
907 | -#: ui/00default.xml:119 | 907 | +#: ui/00default.xml:341 |
908 | msgid "Monocase" | 908 | msgid "Monocase" |
909 | msgstr "Só Maiúsculas" | 909 | msgstr "Só Maiúsculas" |
910 | 910 | ||
@@ -940,7 +940,7 @@ msgstr "Erro de rede" | @@ -940,7 +940,7 @@ msgstr "Erro de rede" | ||
940 | msgid "Network startup error" | 940 | msgid "Network startup error" |
941 | msgstr "Erro ao iniciar a rede" | 941 | msgstr "Erro ao iniciar a rede" |
942 | 942 | ||
943 | -#: ui/00default.xml:189 | 943 | +#: ui/00default.xml:411 |
944 | msgid "Next field" | 944 | msgid "Next field" |
945 | msgstr "Próximo campo" | 945 | msgstr "Próximo campo" |
946 | 946 | ||
@@ -1017,111 +1017,111 @@ msgstr "Other (VM/CMS)" | @@ -1017,111 +1017,111 @@ msgstr "Other (VM/CMS)" | ||
1017 | msgid "Out of memory" | 1017 | msgid "Out of memory" |
1018 | msgstr "Out of memory" | 1018 | msgstr "Out of memory" |
1019 | 1019 | ||
1020 | -#: ui/10keypad.xml:450 | 1020 | +#: ui/10keypad.xml:138 |
1021 | msgid "PA1" | 1021 | msgid "PA1" |
1022 | msgstr "PA1" | 1022 | msgstr "PA1" |
1023 | 1023 | ||
1024 | -#: ui/10keypad.xml:451 | 1024 | +#: ui/10keypad.xml:139 |
1025 | msgid "PA2" | 1025 | msgid "PA2" |
1026 | msgstr "PA2" | 1026 | msgstr "PA2" |
1027 | 1027 | ||
1028 | -#: ui/10keypad.xml:452 | 1028 | +#: ui/10keypad.xml:140 |
1029 | msgid "PA3" | 1029 | msgid "PA3" |
1030 | msgstr "PA3" | 1030 | msgstr "PA3" |
1031 | 1031 | ||
1032 | -#: ui/10functions.xml:348 | 1032 | +#: ui/10functions.xml:36 |
1033 | msgid "PF1" | 1033 | msgid "PF1" |
1034 | msgstr "PF1" | 1034 | msgstr "PF1" |
1035 | 1035 | ||
1036 | -#: ui/10functions.xml:357 | 1036 | +#: ui/10functions.xml:45 |
1037 | msgid "PF10" | 1037 | msgid "PF10" |
1038 | msgstr "PF10" | 1038 | msgstr "PF10" |
1039 | 1039 | ||
1040 | -#: ui/10functions.xml:358 | 1040 | +#: ui/10functions.xml:46 |
1041 | msgid "PF11" | 1041 | msgid "PF11" |
1042 | msgstr "PF11" | 1042 | msgstr "PF11" |
1043 | 1043 | ||
1044 | -#: ui/10functions.xml:359 | 1044 | +#: ui/10functions.xml:47 |
1045 | msgid "PF12" | 1045 | msgid "PF12" |
1046 | msgstr "PF12" | 1046 | msgstr "PF12" |
1047 | 1047 | ||
1048 | -#: ui/10functions.xml:362 | 1048 | +#: ui/10functions.xml:50 |
1049 | msgid "PF13" | 1049 | msgid "PF13" |
1050 | msgstr "PF13" | 1050 | msgstr "PF13" |
1051 | 1051 | ||
1052 | -#: ui/10functions.xml:363 | 1052 | +#: ui/10functions.xml:51 |
1053 | msgid "PF14" | 1053 | msgid "PF14" |
1054 | msgstr "PF14" | 1054 | msgstr "PF14" |
1055 | 1055 | ||
1056 | -#: ui/10functions.xml:364 | 1056 | +#: ui/10functions.xml:52 |
1057 | msgid "PF15" | 1057 | msgid "PF15" |
1058 | msgstr "PF15" | 1058 | msgstr "PF15" |
1059 | 1059 | ||
1060 | -#: ui/10functions.xml:365 | 1060 | +#: ui/10functions.xml:53 |
1061 | msgid "PF16" | 1061 | msgid "PF16" |
1062 | msgstr "PF16" | 1062 | msgstr "PF16" |
1063 | 1063 | ||
1064 | -#: ui/10functions.xml:366 | 1064 | +#: ui/10functions.xml:54 |
1065 | msgid "PF17" | 1065 | msgid "PF17" |
1066 | msgstr "PF17" | 1066 | msgstr "PF17" |
1067 | 1067 | ||
1068 | -#: ui/10functions.xml:367 | 1068 | +#: ui/10functions.xml:55 |
1069 | msgid "PF18" | 1069 | msgid "PF18" |
1070 | msgstr "PF18" | 1070 | msgstr "PF18" |
1071 | 1071 | ||
1072 | -#: ui/10functions.xml:368 | 1072 | +#: ui/10functions.xml:56 |
1073 | msgid "PF19" | 1073 | msgid "PF19" |
1074 | msgstr "PF19" | 1074 | msgstr "PF19" |
1075 | 1075 | ||
1076 | -#: ui/10functions.xml:349 | 1076 | +#: ui/10functions.xml:37 |
1077 | msgid "PF2" | 1077 | msgid "PF2" |
1078 | msgstr "PF2" | 1078 | msgstr "PF2" |
1079 | 1079 | ||
1080 | -#: ui/10functions.xml:369 | 1080 | +#: ui/10functions.xml:57 |
1081 | msgid "PF20" | 1081 | msgid "PF20" |
1082 | msgstr "PF20" | 1082 | msgstr "PF20" |
1083 | 1083 | ||
1084 | -#: ui/10functions.xml:370 | 1084 | +#: ui/10functions.xml:58 |
1085 | msgid "PF21" | 1085 | msgid "PF21" |
1086 | msgstr "PF21" | 1086 | msgstr "PF21" |
1087 | 1087 | ||
1088 | -#: ui/10functions.xml:371 | 1088 | +#: ui/10functions.xml:59 |
1089 | msgid "PF22" | 1089 | msgid "PF22" |
1090 | msgstr "PF22" | 1090 | msgstr "PF22" |
1091 | 1091 | ||
1092 | -#: ui/10functions.xml:372 | 1092 | +#: ui/10functions.xml:60 |
1093 | msgid "PF23" | 1093 | msgid "PF23" |
1094 | msgstr "PF23" | 1094 | msgstr "PF23" |
1095 | 1095 | ||
1096 | -#: ui/10functions.xml:373 | 1096 | +#: ui/10functions.xml:61 |
1097 | msgid "PF24" | 1097 | msgid "PF24" |
1098 | msgstr "PF24" | 1098 | msgstr "PF24" |
1099 | 1099 | ||
1100 | -#: ui/10functions.xml:350 | 1100 | +#: ui/10functions.xml:38 |
1101 | msgid "PF3" | 1101 | msgid "PF3" |
1102 | msgstr "PF3" | 1102 | msgstr "PF3" |
1103 | 1103 | ||
1104 | -#: ui/10functions.xml:351 | 1104 | +#: ui/10functions.xml:39 |
1105 | msgid "PF4" | 1105 | msgid "PF4" |
1106 | msgstr "PF4" | 1106 | msgstr "PF4" |
1107 | 1107 | ||
1108 | -#: ui/10functions.xml:352 | 1108 | +#: ui/10functions.xml:40 |
1109 | msgid "PF5" | 1109 | msgid "PF5" |
1110 | msgstr "PF5" | 1110 | msgstr "PF5" |
1111 | 1111 | ||
1112 | -#: ui/10functions.xml:353 | 1112 | +#: ui/10functions.xml:41 |
1113 | msgid "PF6" | 1113 | msgid "PF6" |
1114 | msgstr "PF6" | 1114 | msgstr "PF6" |
1115 | 1115 | ||
1116 | -#: ui/10functions.xml:354 | 1116 | +#: ui/10functions.xml:42 |
1117 | msgid "PF7" | 1117 | msgid "PF7" |
1118 | msgstr "PF7" | 1118 | msgstr "PF7" |
1119 | 1119 | ||
1120 | -#: ui/10functions.xml:355 | 1120 | +#: ui/10functions.xml:43 |
1121 | msgid "PF8" | 1121 | msgid "PF8" |
1122 | msgstr "PF8" | 1122 | msgstr "PF8" |
1123 | 1123 | ||
1124 | -#: ui/10functions.xml:356 | 1124 | +#: ui/10functions.xml:44 |
1125 | msgid "PF9" | 1125 | msgid "PF9" |
1126 | msgstr "PF9" | 1126 | msgstr "PF9" |
1127 | 1127 | ||
@@ -1138,15 +1138,15 @@ msgstr "Erro de interpretação em %s" | @@ -1138,15 +1138,15 @@ msgstr "Erro de interpretação em %s" | ||
1138 | msgid "Passthru Proxy: send error" | 1138 | msgid "Passthru Proxy: send error" |
1139 | msgstr "Passthru Proxy: Erro ao enviar" | 1139 | msgstr "Passthru Proxy: Erro ao enviar" |
1140 | 1140 | ||
1141 | -#: ui/00default.xml:66 | 1141 | +#: ui/00default.xml:288 |
1142 | msgid "Paste" | 1142 | msgid "Paste" |
1143 | msgstr "Colar" | 1143 | msgstr "Colar" |
1144 | 1144 | ||
1145 | -#: ui/00default.xml:67 | 1145 | +#: ui/00default.xml:289 |
1146 | msgid "Paste next" | 1146 | msgid "Paste next" |
1147 | msgstr "Colar próximo" | 1147 | msgstr "Colar próximo" |
1148 | 1148 | ||
1149 | -#: ui/00default.xml:70 | 1149 | +#: ui/00default.xml:292 |
1150 | msgid "Paste text file" | 1150 | msgid "Paste text file" |
1151 | msgstr "Colar arquivo texto" | 1151 | msgstr "Colar arquivo texto" |
1152 | 1152 | ||
@@ -1154,7 +1154,7 @@ msgstr "Colar arquivo texto" | @@ -1154,7 +1154,7 @@ msgstr "Colar arquivo texto" | ||
1154 | msgid "Paste text file contents" | 1154 | msgid "Paste text file contents" |
1155 | msgstr "Colar conteúdo de arquivo texto" | 1155 | msgstr "Colar conteúdo de arquivo texto" |
1156 | 1156 | ||
1157 | -#: ui/00default.xml:123 | 1157 | +#: ui/00default.xml:345 |
1158 | msgid "Paste with left margin" | 1158 | msgid "Paste with left margin" |
1159 | msgstr "Colar com margem esquerda" | 1159 | msgstr "Colar com margem esquerda" |
1160 | 1160 | ||
@@ -1170,7 +1170,7 @@ msgstr "Path to application data files" | @@ -1170,7 +1170,7 @@ msgstr "Path to application data files" | ||
1170 | msgid "Pink" | 1170 | msgid "Pink" |
1171 | msgstr "Rosa" | 1171 | msgstr "Rosa" |
1172 | 1172 | ||
1173 | -#: ui/00default.xml:188 | 1173 | +#: ui/00default.xml:410 |
1174 | msgid "Previous field" | 1174 | msgid "Previous field" |
1175 | msgstr "Campo anterior" | 1175 | msgstr "Campo anterior" |
1176 | 1176 | ||
@@ -1178,11 +1178,11 @@ msgstr "Campo anterior" | @@ -1178,11 +1178,11 @@ msgstr "Campo anterior" | ||
1178 | msgid "Primary space:" | 1178 | msgid "Primary space:" |
1179 | msgstr "Primary space:" | 1179 | msgstr "Primary space:" |
1180 | 1180 | ||
1181 | -#: ui/00default.xml:49 | 1181 | +#: ui/00default.xml:271 |
1182 | msgid "Print" | 1182 | msgid "Print" |
1183 | msgstr "Imprimir" | 1183 | msgstr "Imprimir" |
1184 | 1184 | ||
1185 | -#: ui/00default.xml:51 | 1185 | +#: ui/00default.xml:273 |
1186 | msgid "Print copy" | 1186 | msgid "Print copy" |
1187 | msgstr "Imprimir cópia" | 1187 | msgstr "Imprimir cópia" |
1188 | 1188 | ||
@@ -1190,7 +1190,7 @@ msgstr "Imprimir cópia" | @@ -1190,7 +1190,7 @@ msgstr "Imprimir cópia" | ||
1190 | msgid "Print operation failed" | 1190 | msgid "Print operation failed" |
1191 | msgstr "Operação de impressão falhou" | 1191 | msgstr "Operação de impressão falhou" |
1192 | 1192 | ||
1193 | -#: ui/00default.xml:50 | 1193 | +#: ui/00default.xml:272 |
1194 | msgid "Print selected" | 1194 | msgid "Print selected" |
1195 | msgstr "Imprimir seleção" | 1195 | msgstr "Imprimir seleção" |
1196 | 1196 | ||
@@ -1198,7 +1198,7 @@ msgstr "Imprimir seleção" | @@ -1198,7 +1198,7 @@ msgstr "Imprimir seleção" | ||
1198 | msgid "Print selection box" | 1198 | msgid "Print selection box" |
1199 | msgstr "Imprimir marca de seleção" | 1199 | msgstr "Imprimir marca de seleção" |
1200 | 1200 | ||
1201 | -#: print.c:743 ui/00default.xml:108 | 1201 | +#: print.c:743 ui/00default.xml:330 |
1202 | msgid "Print settings" | 1202 | msgid "Print settings" |
1203 | msgstr "Configurações de impressão" | 1203 | msgstr "Configurações de impressão" |
1204 | 1204 | ||
@@ -1286,7 +1286,7 @@ msgstr "RPQ: can't resolve '%s': %s" | @@ -1286,7 +1286,7 @@ msgstr "RPQ: can't resolve '%s': %s" | ||
1286 | msgid "RPQ: gethostbyname error" | 1286 | msgid "RPQ: gethostbyname error" |
1287 | msgstr "RPQ: Erro em gethostbyname" | 1287 | msgstr "RPQ: Erro em gethostbyname" |
1288 | 1288 | ||
1289 | -#: ui/00default.xml:54 | 1289 | +#: ui/00default.xml:276 |
1290 | msgid "Receive file" | 1290 | msgid "Receive file" |
1291 | msgstr "Receber arquivo" | 1291 | msgstr "Receber arquivo" |
1292 | 1292 | ||
@@ -1302,27 +1302,27 @@ msgstr "Formato de registro" | @@ -1302,27 +1302,27 @@ msgstr "Formato de registro" | ||
1302 | msgid "Red" | 1302 | msgid "Red" |
1303 | msgstr "Vermelho" | 1303 | msgstr "Vermelho" |
1304 | 1304 | ||
1305 | -#: ui/99debug.xml:580 | 1305 | +#: ui/99debug.xml:214 |
1306 | msgid "Reload buffer contents" | 1306 | msgid "Reload buffer contents" |
1307 | msgstr "Recarregar conteúdo do buffer" | 1307 | msgstr "Recarregar conteúdo do buffer" |
1308 | 1308 | ||
1309 | -#: ui/00default.xml:75 | 1309 | +#: ui/00default.xml:297 |
1310 | msgid "Remove selection" | 1310 | msgid "Remove selection" |
1311 | msgstr "Remover seleção" | 1311 | msgstr "Remover seleção" |
1312 | 1312 | ||
1313 | -#: ui/00default.xml:76 | 1313 | +#: ui/00default.xml:298 |
1314 | msgid "Reselect" | 1314 | msgid "Reselect" |
1315 | msgstr "Reselecionar" | 1315 | msgstr "Reselecionar" |
1316 | 1316 | ||
1317 | -#: ui/10keypad.xml:460 | 1317 | +#: ui/10keypad.xml:148 |
1318 | msgid "Reset" | 1318 | msgid "Reset" |
1319 | msgstr "Reset" | 1319 | msgstr "Reset" |
1320 | 1320 | ||
1321 | -#: ui/00default.xml:122 | 1321 | +#: ui/00default.xml:344 |
1322 | msgid "Resize on alternate screen" | 1322 | msgid "Resize on alternate screen" |
1323 | msgstr "Mudar tamanho do terminal em tela alternativa" | 1323 | msgstr "Mudar tamanho do terminal em tela alternativa" |
1324 | 1324 | ||
1325 | -#: ui/00default.xml:190 | 1325 | +#: ui/00default.xml:412 |
1326 | msgid "Return" | 1326 | msgid "Return" |
1327 | msgstr "Return" | 1327 | msgstr "Return" |
1328 | 1328 | ||
@@ -1483,7 +1483,7 @@ msgstr "" | @@ -1483,7 +1483,7 @@ msgstr "" | ||
1483 | "SSL_write:\n" | 1483 | "SSL_write:\n" |
1484 | "%s" | 1484 | "%s" |
1485 | 1485 | ||
1486 | -#: ui/00default.xml:46 | 1486 | +#: ui/00default.xml:268 |
1487 | msgid "Save copy" | 1487 | msgid "Save copy" |
1488 | msgstr "Salvar cópia" | 1488 | msgstr "Salvar cópia" |
1489 | 1489 | ||
@@ -1491,7 +1491,7 @@ msgstr "Salvar cópia" | @@ -1491,7 +1491,7 @@ msgstr "Salvar cópia" | ||
1491 | msgid "Save copy to file" | 1491 | msgid "Save copy to file" |
1492 | msgstr "Salvar cópia para arquivo" | 1492 | msgstr "Salvar cópia para arquivo" |
1493 | 1493 | ||
1494 | -#: ui/00default.xml:44 | 1494 | +#: ui/00default.xml:266 |
1495 | msgid "Save screen" | 1495 | msgid "Save screen" |
1496 | msgstr "Salvar tela" | 1496 | msgstr "Salvar tela" |
1497 | 1497 | ||
@@ -1499,7 +1499,7 @@ msgstr "Salvar tela" | @@ -1499,7 +1499,7 @@ msgstr "Salvar tela" | ||
1499 | msgid "Save screen to file" | 1499 | msgid "Save screen to file" |
1500 | msgstr "Salvar tela para arquivo" | 1500 | msgstr "Salvar tela para arquivo" |
1501 | 1501 | ||
1502 | -#: ui/00default.xml:45 | 1502 | +#: ui/00default.xml:267 |
1503 | msgid "Save selected" | 1503 | msgid "Save selected" |
1504 | msgstr "Salvar seleção" | 1504 | msgstr "Salvar seleção" |
1505 | 1505 | ||
@@ -1507,20 +1507,15 @@ msgstr "Salvar seleção" | @@ -1507,20 +1507,15 @@ msgstr "Salvar seleção" | ||
1507 | msgid "Save selection to file" | 1507 | msgid "Save selection to file" |
1508 | msgstr "Salvar seleção para arquivo" | 1508 | msgstr "Salvar seleção para arquivo" |
1509 | 1509 | ||
1510 | -#: ui/99debug.xml:572 | 1510 | +#: ui/99debug.xml:206 |
1511 | msgid "Screen Trace" | 1511 | msgid "Screen Trace" |
1512 | msgstr "Trace de tela" | 1512 | msgstr "Trace de tela" |
1513 | 1513 | ||
1514 | -#: ui/00default.xml:114 | 1514 | +#: ui/00default.xml:336 |
1515 | msgid "Screen size" | 1515 | msgid "Screen size" |
1516 | msgstr "Tamanho da tela" | 1516 | msgstr "Tamanho da tela" |
1517 | 1517 | ||
1518 | -#: ui/09scripts.xml:297 | ||
1519 | -#, fuzzy | ||
1520 | -msgid "Script" | ||
1521 | -msgstr "Scripts" | ||
1522 | - | ||
1523 | -#: ui/00default.xml:89 | 1518 | +#: ui/00default.xml:311 |
1524 | msgid "Scripts" | 1519 | msgid "Scripts" |
1525 | msgstr "Scripts" | 1520 | msgstr "Scripts" |
1526 | 1521 | ||
@@ -1532,15 +1527,15 @@ msgstr "Secondary space:" | @@ -1532,15 +1527,15 @@ msgstr "Secondary space:" | ||
1532 | msgid "Secure connection was successful." | 1527 | msgid "Secure connection was successful." |
1533 | msgstr "Conexão segura efetuada com sucesso." | 1528 | msgstr "Conexão segura efetuada com sucesso." |
1534 | 1529 | ||
1535 | -#: ui/00default.xml:74 | 1530 | +#: ui/00default.xml:296 |
1536 | msgid "Select Field" | 1531 | msgid "Select Field" |
1537 | msgstr "Selecionar campo" | 1532 | msgstr "Selecionar campo" |
1538 | 1533 | ||
1539 | -#: ui/00default.xml:73 | 1534 | +#: ui/00default.xml:295 |
1540 | msgid "Select all" | 1535 | msgid "Select all" |
1541 | msgstr "Selecionar tudo" | 1536 | msgstr "Selecionar tudo" |
1542 | 1537 | ||
1543 | -#: ui/00default.xml:126 | 1538 | +#: ui/00default.xml:348 |
1544 | msgid "Select by rectangles" | 1539 | msgid "Select by rectangles" |
1545 | msgstr "Seleção retangular" | 1540 | msgstr "Seleção retangular" |
1546 | 1541 | ||
@@ -1552,7 +1547,7 @@ msgstr "Selecione arquivo a receber" | @@ -1552,7 +1547,7 @@ msgstr "Selecione arquivo a receber" | ||
1552 | msgid "Select file to send" | 1547 | msgid "Select file to send" |
1553 | msgstr "Selecione arquivo a enviar" | 1548 | msgstr "Selecione arquivo a enviar" |
1554 | 1549 | ||
1555 | -#: ui/00default.xml:111 | 1550 | +#: ui/00default.xml:333 |
1556 | msgid "Select font" | 1551 | msgid "Select font" |
1557 | msgstr "Selecione fonte" | 1552 | msgstr "Selecione fonte" |
1558 | 1553 | ||
@@ -1576,7 +1571,7 @@ msgstr "Self signed certificate" | @@ -1576,7 +1571,7 @@ msgstr "Self signed certificate" | ||
1576 | msgid "Self signed certificate in certificate chain" | 1571 | msgid "Self signed certificate in certificate chain" |
1577 | msgstr "Self signed certificate in certificate chain" | 1572 | msgstr "Self signed certificate in certificate chain" |
1578 | 1573 | ||
1579 | -#: ui/00default.xml:55 | 1574 | +#: ui/00default.xml:277 |
1580 | msgid "Send file" | 1575 | msgid "Send file" |
1581 | msgstr "Enviar arquivo" | 1576 | msgstr "Enviar arquivo" |
1582 | 1577 | ||
@@ -1588,7 +1583,7 @@ msgstr "Enviar arquivo para o servidor" | @@ -1588,7 +1583,7 @@ msgstr "Enviar arquivo para o servidor" | ||
1588 | msgid "Send messages to syslog" | 1583 | msgid "Send messages to syslog" |
1589 | msgstr "Send messages to syslog" | 1584 | msgstr "Send messages to syslog" |
1590 | 1585 | ||
1591 | -#: ui/00default.xml:54 | 1586 | +#: ui/00default.xml:276 |
1592 | msgid "Send/Receive" | 1587 | msgid "Send/Receive" |
1593 | msgstr "Enviar/Receber" | 1588 | msgstr "Enviar/Receber" |
1594 | 1589 | ||
@@ -1596,7 +1591,7 @@ msgstr "Enviar/Receber" | @@ -1596,7 +1591,7 @@ msgstr "Enviar/Receber" | ||
1596 | msgid "Session name" | 1591 | msgid "Session name" |
1597 | msgstr "Nome da sessão" | 1592 | msgstr "Nome da sessão" |
1598 | 1593 | ||
1599 | -#: ui/00default.xml:92 | 1594 | +#: ui/00default.xml:314 |
1600 | msgid "Set hostname" | 1595 | msgid "Set hostname" |
1601 | msgstr "Selecione servidor" | 1596 | msgstr "Selecione servidor" |
1602 | 1597 | ||
@@ -1604,19 +1599,19 @@ msgstr "Selecione servidor" | @@ -1604,19 +1599,19 @@ msgstr "Selecione servidor" | ||
1604 | msgid "Set reported colors (8/16)" | 1599 | msgid "Set reported colors (8/16)" |
1605 | msgstr "Define número de cores informadas (8/16)" | 1600 | msgstr "Define número de cores informadas (8/16)" |
1606 | 1601 | ||
1607 | -#: ui/00default.xml:107 | 1602 | +#: ui/00default.xml:329 |
1608 | msgid "Settings" | 1603 | msgid "Settings" |
1609 | msgstr "Configurações" | 1604 | msgstr "Configurações" |
1610 | 1605 | ||
1611 | -#: ui/00default.xml:129 | 1606 | +#: ui/00default.xml:351 |
1612 | msgid "Show Underline" | 1607 | msgid "Show Underline" |
1613 | msgstr "Mostrar sublinhado" | 1608 | msgstr "Mostrar sublinhado" |
1614 | 1609 | ||
1615 | -#: ui/99debug.xml:579 | 1610 | +#: ui/99debug.xml:213 |
1616 | msgid "Show test pattern" | 1611 | msgid "Show test pattern" |
1617 | msgstr "Mostrar padrão de teste" | 1612 | msgstr "Mostrar padrão de teste" |
1618 | 1613 | ||
1619 | -#: ui/00default.xml:131 | 1614 | +#: ui/00default.xml:353 |
1620 | msgid "Smart paste" | 1615 | msgid "Smart paste" |
1621 | msgstr "Colar inteligente" | 1616 | msgstr "Colar inteligente" |
1622 | 1617 | ||
@@ -1664,18 +1659,6 @@ msgstr "T_otal" | @@ -1664,18 +1659,6 @@ msgstr "T_otal" | ||
1664 | msgid "Terminal colors" | 1659 | msgid "Terminal colors" |
1665 | msgstr "Cores do terminal" | 1660 | msgstr "Cores do terminal" |
1666 | 1661 | ||
1667 | -#: ui/09scripts.xml:298 | ||
1668 | -msgid "Teste01" | ||
1669 | -msgstr "Teste01" | ||
1670 | - | ||
1671 | -#: ui/09scripts.xml:302 | ||
1672 | -msgid "Teste02" | ||
1673 | -msgstr "Teste02" | ||
1674 | - | ||
1675 | -#: ui/09scripts.xml:306 | ||
1676 | -msgid "Teste03" | ||
1677 | -msgstr "Teste03" | ||
1678 | - | ||
1679 | #: host.c:216 | 1662 | #: host.c:216 |
1680 | msgid "Text before '['" | 1663 | msgid "Text before '['" |
1681 | msgstr "Texto antes de '['" | 1664 | msgstr "Texto antes de '['" |
@@ -1902,15 +1885,15 @@ msgid "" | @@ -1902,15 +1885,15 @@ msgid "" | ||
1902 | "This version of %s was built without support for secure sockets layer (SSL)." | 1885 | "This version of %s was built without support for secure sockets layer (SSL)." |
1903 | msgstr "Esta versão do %s foi gerada sem suporte para conexões seguras (SSL)." | 1886 | msgstr "Esta versão do %s foi gerada sem suporte para conexões seguras (SSL)." |
1904 | 1887 | ||
1905 | -#: ui/00default.xml:148 | 1888 | +#: ui/00default.xml:370 |
1906 | msgid "Toolbar" | 1889 | msgid "Toolbar" |
1907 | msgstr "Barra de ferramentas" | 1890 | msgstr "Barra de ferramentas" |
1908 | 1891 | ||
1909 | -#: ui/99debug.xml:571 | 1892 | +#: ui/99debug.xml:205 |
1910 | msgid "Trace" | 1893 | msgid "Trace" |
1911 | msgstr "Trace" | 1894 | msgstr "Trace" |
1912 | 1895 | ||
1913 | -#: ui/00default.xml:120 | 1896 | +#: ui/00default.xml:342 |
1914 | msgid "Track Cursor" | 1897 | msgid "Track Cursor" |
1915 | msgstr "Mostrar posição do cursor" | 1898 | msgstr "Mostrar posição do cursor" |
1916 | 1899 | ||
@@ -2117,7 +2100,7 @@ msgstr "Unsupported passthru host session" | @@ -2117,7 +2100,7 @@ msgstr "Unsupported passthru host session" | ||
2117 | msgid "Unsupported socks 4 proxy" | 2100 | msgid "Unsupported socks 4 proxy" |
2118 | msgstr "Unsupported socks 4 proxy" | 2101 | msgstr "Unsupported socks 4 proxy" |
2119 | 2102 | ||
2120 | -#: ui/00default.xml:133 | 2103 | +#: ui/00default.xml:355 |
2121 | msgid "Use +/- for field navigation" | 2104 | msgid "Use +/- for field navigation" |
2122 | msgstr "Usar teclas +/- para navegar por campos" | 2105 | msgstr "Usar teclas +/- para navegar por campos" |
2123 | 2106 | ||
@@ -2130,7 +2113,7 @@ msgstr "Variável" | @@ -2130,7 +2113,7 @@ msgstr "Variável" | ||
2130 | msgid "Version %s - Revision %s" | 2113 | msgid "Version %s - Revision %s" |
2131 | msgstr "Versão %s - Revisão %s" | 2114 | msgstr "Versão %s - Revisão %s" |
2132 | 2115 | ||
2133 | -#: ui/99debug.xml:574 | 2116 | +#: ui/99debug.xml:208 |
2134 | msgid "View Field Delimiters" | 2117 | msgid "View Field Delimiters" |
2135 | msgstr "Mostrar delimitadores de campo" | 2118 | msgstr "Mostrar delimitadores de campo" |
2136 | 2119 | ||
@@ -2158,7 +2141,7 @@ msgstr "Europa ocidental (ISO 8859-1)" | @@ -2158,7 +2141,7 @@ msgstr "Europa ocidental (ISO 8859-1)" | ||
2158 | msgid "White" | 2141 | msgid "White" |
2159 | msgstr "Branco" | 2142 | msgstr "Branco" |
2160 | 2143 | ||
2161 | -#: ui/00default.xml:159 | 2144 | +#: ui/00default.xml:381 |
2162 | msgid "Window" | 2145 | msgid "Window" |
2163 | msgstr "Janela" | 2146 | msgstr "Janela" |
2164 | 2147 | ||
@@ -2226,19 +2209,19 @@ msgstr "_Procurar" | @@ -2226,19 +2209,19 @@ msgstr "_Procurar" | ||
2226 | msgid "_Color table:" | 2209 | msgid "_Color table:" |
2227 | msgstr "Tabela de cores:" | 2210 | msgstr "Tabela de cores:" |
2228 | 2211 | ||
2229 | -#: ui/00default.xml:102 | 2212 | +#: ui/00default.xml:324 |
2230 | msgid "_Connect" | 2213 | msgid "_Connect" |
2231 | msgstr "_Conectar" | 2214 | msgstr "_Conectar" |
2232 | 2215 | ||
2233 | -#: ui/00default.xml:103 | 2216 | +#: ui/00default.xml:325 |
2234 | msgid "_Disconnect" | 2217 | msgid "_Disconnect" |
2235 | msgstr "_Desconectar" | 2218 | msgstr "_Desconectar" |
2236 | 2219 | ||
2237 | -#: ui/00default.xml:61 | 2220 | +#: ui/99debug.xml:200 |
2238 | msgid "_Edit" | 2221 | msgid "_Edit" |
2239 | msgstr "_Editar" | 2222 | msgstr "_Editar" |
2240 | 2223 | ||
2241 | -#: ui/00default.xml:36 | 2224 | +#: ui/00default.xml:258 |
2242 | msgid "_File" | 2225 | msgid "_File" |
2243 | msgstr "_Arquivo" | 2226 | msgstr "_Arquivo" |
2244 | 2227 | ||
@@ -2266,11 +2249,11 @@ msgstr "Nome do _Host:" | @@ -2266,11 +2249,11 @@ msgstr "Nome do _Host:" | ||
2266 | msgid "_Local file name:" | 2249 | msgid "_Local file name:" |
2267 | msgstr "Arquivo _local:" | 2250 | msgstr "Arquivo _local:" |
2268 | 2251 | ||
2269 | -#: ui/00default.xml:92 | 2252 | +#: ui/00default.xml:314 |
2270 | msgid "_Network" | 2253 | msgid "_Network" |
2271 | msgstr "_Rede" | 2254 | msgstr "_Rede" |
2272 | 2255 | ||
2273 | -#: ui/00default.xml:117 | 2256 | +#: ui/00default.xml:339 |
2274 | msgid "_Options" | 2257 | msgid "_Options" |
2275 | msgstr "_Opções" | 2258 | msgstr "_Opções" |
2276 | 2259 | ||
@@ -2298,7 +2281,7 @@ msgstr "Arquivo _texto" | @@ -2298,7 +2281,7 @@ msgstr "Arquivo _texto" | ||
2298 | msgid "_To" | 2281 | msgid "_To" |
2299 | msgstr "_Para" | 2282 | msgstr "_Para" |
2300 | 2283 | ||
2301 | -#: ui/00default.xml:87 | 2284 | +#: ui/00default.xml:309 |
2302 | msgid "_View" | 2285 | msgid "_View" |
2303 | msgstr "_Exibir" | 2286 | msgstr "_Exibir" |
2304 | 2287 | ||
@@ -2345,6 +2328,19 @@ msgid "unknown error" | @@ -2345,6 +2328,19 @@ msgid "unknown error" | ||
2345 | msgstr "Erro desconhecido" | 2328 | msgstr "Erro desconhecido" |
2346 | 2329 | ||
2347 | #, fuzzy | 2330 | #, fuzzy |
2331 | +#~ msgid "Script" | ||
2332 | +#~ msgstr "Scripts" | ||
2333 | + | ||
2334 | +#~ msgid "Teste01" | ||
2335 | +#~ msgstr "Teste01" | ||
2336 | + | ||
2337 | +#~ msgid "Teste02" | ||
2338 | +#~ msgstr "Teste02" | ||
2339 | + | ||
2340 | +#~ msgid "Teste03" | ||
2341 | +#~ msgstr "Teste03" | ||
2342 | + | ||
2343 | +#, fuzzy | ||
2348 | #~ msgid "Cross hair Cursor" | 2344 | #~ msgid "Cross hair Cursor" |
2349 | #~ msgstr "Cursor mira" | 2345 | #~ msgstr "Cursor mira" |
2350 | 2346 |
pw3270.cbp
@@ -243,29 +243,34 @@ | @@ -243,29 +243,34 @@ | ||
243 | <Unit filename="src/plugins/dbus3270/pw3270dbus.xml" /> | 243 | <Unit filename="src/plugins/dbus3270/pw3270dbus.xml" /> |
244 | <Unit filename="src/plugins/dbus3270/service.h" /> | 244 | <Unit filename="src/plugins/dbus3270/service.h" /> |
245 | <Unit filename="src/plugins/dbus3270/test.sh" /> | 245 | <Unit filename="src/plugins/dbus3270/test.sh" /> |
246 | - <Unit filename="src/plugins/remotectl/Makefile.in" /> | ||
247 | - <Unit filename="src/plugins/remotectl/calls.c"> | 246 | + <Unit filename="src/plugins/hllapi/Makefile.in" /> |
247 | + <Unit filename="src/plugins/hllapi/calls.c"> | ||
248 | <Option compilerVar="CC" /> | 248 | <Option compilerVar="CC" /> |
249 | </Unit> | 249 | </Unit> |
250 | - <Unit filename="src/plugins/remotectl/client.h" /> | ||
251 | - <Unit filename="src/plugins/remotectl/hllapi.c"> | 250 | + <Unit filename="src/plugins/hllapi/client.h" /> |
251 | + <Unit filename="src/plugins/hllapi/hllapi.c"> | ||
252 | <Option compilerVar="CC" /> | 252 | <Option compilerVar="CC" /> |
253 | </Unit> | 253 | </Unit> |
254 | - <Unit filename="src/plugins/remotectl/packets.h" /> | ||
255 | - <Unit filename="src/plugins/remotectl/pipesource.c"> | 254 | + <Unit filename="src/plugins/hllapi/packets.h" /> |
255 | + <Unit filename="src/plugins/hllapi/pipesource.c"> | ||
256 | <Option compilerVar="CC" /> | 256 | <Option compilerVar="CC" /> |
257 | </Unit> | 257 | </Unit> |
258 | - <Unit filename="src/plugins/remotectl/pluginmain.c"> | 258 | + <Unit filename="src/plugins/hllapi/pluginmain.c"> |
259 | <Option compilerVar="CC" /> | 259 | <Option compilerVar="CC" /> |
260 | </Unit> | 260 | </Unit> |
261 | - <Unit filename="src/plugins/remotectl/remote.c"> | 261 | + <Unit filename="src/plugins/hllapi/remote.c"> |
262 | <Option compilerVar="CC" /> | 262 | <Option compilerVar="CC" /> |
263 | </Unit> | 263 | </Unit> |
264 | - <Unit filename="src/plugins/remotectl/remotectl.h" /> | ||
265 | - <Unit filename="src/plugins/remotectl/server.h" /> | ||
266 | - <Unit filename="src/plugins/remotectl/testprogram.c"> | 264 | + <Unit filename="src/plugins/hllapi/remotectl.h" /> |
265 | + <Unit filename="src/plugins/hllapi/server.h" /> | ||
266 | + <Unit filename="src/plugins/hllapi/testprogram.c"> | ||
267 | <Option compilerVar="CC" /> | 267 | <Option compilerVar="CC" /> |
268 | </Unit> | 268 | </Unit> |
269 | + <Unit filename="src/plugins/remotectl/Makefile.in" /> | ||
270 | + <Unit filename="src/plugins/remotectl/client.h" /> | ||
271 | + <Unit filename="src/plugins/remotectl/packets.h" /> | ||
272 | + <Unit filename="src/plugins/remotectl/remotectl.h" /> | ||
273 | + <Unit filename="src/plugins/remotectl/server.h" /> | ||
269 | <Unit filename="src/plugins/rx3270/Makefile.in" /> | 274 | <Unit filename="src/plugins/rx3270/Makefile.in" /> |
270 | <Unit filename="src/plugins/rx3270/pluginmain.cc" /> | 275 | <Unit filename="src/plugins/rx3270/pluginmain.cc" /> |
271 | <Unit filename="src/plugins/rx3270/rx3270.h" /> | 276 | <Unit filename="src/plugins/rx3270/rx3270.h" /> |
pw3270.nsi.in
@@ -117,7 +117,7 @@ SubSection "@PACKAGE@" SecMain | @@ -117,7 +117,7 @@ SubSection "@PACKAGE@" SecMain | ||
117 | setOutPath $INSTDIR | 117 | setOutPath $INSTDIR |
118 | 118 | ||
119 | CreateDirectory "$INSTDIR\plugins" | 119 | CreateDirectory "$INSTDIR\plugins" |
120 | - file "/oname=$INSTDIR\plugins\remotectl.dll" ".bin\Release\plugins\remotectl.dll" | 120 | + file "/oname=$INSTDIR\plugins\hllapi.dll" ".bin\Release\plugins\hllapi.dll" |
121 | file "/oname=$SYSDIR\libhllapi.dll" ".bin\Release\libhllapi.dll" | 121 | file "/oname=$SYSDIR\libhllapi.dll" ".bin\Release\libhllapi.dll" |
122 | 122 | ||
123 | sectionEnd | 123 | sectionEnd |
src/include/pw3270/hllapi.h
@@ -81,13 +81,16 @@ extern "C" { | @@ -81,13 +81,16 @@ extern "C" { | ||
81 | __declspec (dllexport) DWORD __stdcall hllapi_get_screen(WORD pos, LPSTR buffer, WORD len); | 81 | __declspec (dllexport) DWORD __stdcall hllapi_get_screen(WORD pos, LPSTR buffer, WORD len); |
82 | __declspec (dllexport) DWORD __stdcall hllapi_enter(void); | 82 | __declspec (dllexport) DWORD __stdcall hllapi_enter(void); |
83 | __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text); | 83 | __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text); |
84 | - __declspec (dllexport) DWORD __stdcall hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); | 84 | + __declspec (dllexport) DWORD __stdcall hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); |
85 | + __declspec (dllexport) DWORD __stdcall hllapi_emulate_input(LPSTR buffer, WORD len, WORD pasting); | ||
85 | __declspec (dllexport) DWORD __stdcall hllapi_wait_for_ready(WORD seconds); | 86 | __declspec (dllexport) DWORD __stdcall hllapi_wait_for_ready(WORD seconds); |
86 | __declspec (dllexport) DWORD __stdcall hllapi_wait(WORD seconds); | 87 | __declspec (dllexport) DWORD __stdcall hllapi_wait(WORD seconds); |
87 | __declspec (dllexport) DWORD __stdcall hllapi_pfkey(WORD key); | 88 | __declspec (dllexport) DWORD __stdcall hllapi_pfkey(WORD key); |
88 | __declspec (dllexport) DWORD __stdcall hllapi_pakey(WORD key); | 89 | __declspec (dllexport) DWORD __stdcall hllapi_pakey(WORD key); |
89 | __declspec (dllexport) DWORD __stdcall hllapi_setcursor(WORD key); | 90 | __declspec (dllexport) DWORD __stdcall hllapi_setcursor(WORD key); |
90 | __declspec (dllexport) DWORD __stdcall hllapi_getcursor(); | 91 | __declspec (dllexport) DWORD __stdcall hllapi_getcursor(); |
92 | + __declspec (dllexport) DWORD __stdcall hllapi_erase_eof(void); | ||
93 | + __declspec (dllexport) DWORD __stdcall hllapi_print(void); | ||
91 | 94 | ||
92 | #else | 95 | #else |
93 | 96 |
@@ -0,0 +1,152 @@ | @@ -0,0 +1,152 @@ | ||
1 | +# | ||
2 | +# "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | +# (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | +# aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | +# | ||
6 | +# Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | +# | ||
8 | +# Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | +# os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | +# Free Software Foundation. | ||
11 | +# | ||
12 | +# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | +# GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | +# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | +# obter mais detalhes. | ||
16 | +# | ||
17 | +# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | +# programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | +# Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | +# | ||
21 | +# Contatos: | ||
22 | +# | ||
23 | +# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
24 | +# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | ||
25 | +# licinio@bb.com.br (Licínio Luis Branco) | ||
26 | +# kraucer@bb.com.br (Kraucer Fernandes Mazuco) | ||
27 | +# | ||
28 | + | ||
29 | +#---[ Sources ]---------------------------------------------------------------- | ||
30 | + | ||
31 | +MODULE_NAME=hllapi | ||
32 | +DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile | ||
33 | +PLUGIN_SRC=pluginmain.c | ||
34 | +HLLAPI_SRC=hllapi.c calls.c remote.c | ||
35 | + | ||
36 | +#---[ Paths ]------------------------------------------------------------------ | ||
37 | + | ||
38 | +ROOTDIR ?= . | ||
39 | +OBJDIR ?= $(ROOTDIR)/.obj | ||
40 | +BINDIR ?= $(ROOTDIR)/.bin | ||
41 | +BINDBG ?= $(BINDIR)/Debug | ||
42 | +BINRLS ?= $(BINDIR)/Release | ||
43 | + | ||
44 | +OBJDBG = $(OBJDIR)/Debug | ||
45 | +OBJRLS = $(OBJDIR)/Release | ||
46 | +OBJEXT = o | ||
47 | + | ||
48 | +#---[ Tools ]------------------------------------------------------------------ | ||
49 | + | ||
50 | +MKDIR=@MKDIR_P@ | ||
51 | +CC=@CC@ | ||
52 | +LD=@CC@ | ||
53 | +MSGCAT=@MSGCAT@ | ||
54 | +XGETTEXT=@XGETTEXT@ | ||
55 | + | ||
56 | +#---[ Rules ]------------------------------------------------------------------ | ||
57 | + | ||
58 | +DLL_FLAGS=@DLL_FLAGS@ | ||
59 | +DEBUG_CFLAGS=-DDEBUG=1 -g -Wall | ||
60 | + | ||
61 | +LIB3270_MODE ?= Default | ||
62 | + | ||
63 | +ifeq ($(LIB3270_MODE),Debug) | ||
64 | + PW3270_LIBS=-L../../../.bin/Debug@DLLDIR@ -lpw3270 -l3270 | ||
65 | + PW3270_CFLAGS=-I../../../src/include | ||
66 | + LIB3270_LIBS=-L../../../.bin/Debug@DLLDIR@ -l3270 | ||
67 | + LIB3270_CFLAGS=-I../../../src/include | ||
68 | +endif | ||
69 | + | ||
70 | +ifeq ($(LIB3270_MODE),Release) | ||
71 | + PW3270_LIBS=-L../../../.bin/Release@DLLDIR@ -lpw3270 -l3270 | ||
72 | + PW3270_CFLAGS=-I../../../src/include | ||
73 | + LIB3270_LIBS=-L../../../.bin/Release@DLLDIR@ -l3270 | ||
74 | + LIB3270_CFLAGS=-I../../../src/include | ||
75 | +endif | ||
76 | + | ||
77 | +ifeq ($(LIB3270_MODE),Default) | ||
78 | + LIB3270_LIBS ?= `pkg-config --libs lib3270` | ||
79 | + LIB3270_CFLAGS ?= `pkg-config --cflags lib3270` | ||
80 | + PW3270_LIBS ?= `pkg-config --libs pw3270 lib3270` | ||
81 | + PW3270_CFLAGS ?= `pkg-config --cflags pw3270 lib3270` | ||
82 | +endif | ||
83 | + | ||
84 | + | ||
85 | +GTK_CFLAGS ?= @GTK_CFLAGS@ @GTKMAC_CFLAGS@ | ||
86 | +GTK_LIBS ?= @GTK_LIBS@ @GTKMAC_LIBS@ | ||
87 | + | ||
88 | +$(OBJDBG)/%.o: %.c $(DEPENDS) | ||
89 | + @echo " CC `basename $@`" | ||
90 | + @$(MKDIR) `dirname $@` | ||
91 | + @$(CC) $(CFLAGS) $(DEBUG_CFLAGS) $(LIB3270_CFLAGS) $(GTK_CFLAGS) -o $@ -c $< | ||
92 | + | ||
93 | +$(OBJRLS)/%.o: %.c $(DEPENDS) | ||
94 | + @echo " CC `basename $@`" | ||
95 | + @$(MKDIR) `dirname $@` | ||
96 | + @$(CC) $(CFLAGS) $(LIB3270_CFLAGS) $(GTK_CFLAGS) -o $@ -c $< | ||
97 | + | ||
98 | + | ||
99 | +#---[ Release targets ]-------------------------------------------------------- | ||
100 | + | ||
101 | +Release: $(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@ $(BINRLS)/libhllapi@DLLEXT@ | ||
102 | + | ||
103 | +$(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) | ||
104 | + @echo " CCLD `basename $@`" | ||
105 | + @$(MKDIR) `dirname $@` | ||
106 | + @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) -o $@ $^ $(LIBS) $(PW3270_LIBS) $(GTK_LIBS) | ||
107 | + | ||
108 | +$(BINRLS)/libhllapi@DLLEXT@: $(foreach SRC, $(basename $(HLLAPI_SRC)), $(OBJRLS)/$(SRC).o) | ||
109 | + @echo " CCLD `basename $@`" | ||
110 | + @$(MKDIR) `dirname $@` | ||
111 | + @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @LDLIBFLAGS@ -o $@ $^ $(LIBS) | ||
112 | + | ||
113 | +#---[ Debug targets ]---------------------------------------------------------- | ||
114 | + | ||
115 | +Debug: $(BINDBG)/plugins/$(MODULE_NAME)@DLLEXT@ $(BINDBG)/libhllapi@DLLEXT@ | ||
116 | + | ||
117 | +$(BINDBG)/plugins/$(MODULE_NAME)@DLLEXT@: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) | ||
118 | + @echo " CCLD `basename $@`" | ||
119 | + @$(MKDIR) `dirname $@` | ||
120 | + @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) -o $@ $^ $(LIBS) $(PW3270_LIBS) $(GTK_LIBS) | ||
121 | + | ||
122 | +$(BINDBG)/libhllapi@DLLEXT@: $(foreach SRC, $(basename $(HLLAPI_SRC)), $(OBJDBG)/$(SRC).o) | ||
123 | + @echo " CCLD `basename $@`" | ||
124 | + @$(MKDIR) `dirname $@` | ||
125 | + @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @LDLIBFLAGS@ -o $@ $^ $(LIBS) | ||
126 | + | ||
127 | +#---[ Misc targets ]----------------------------------------------------------- | ||
128 | + | ||
129 | +$(BINDBG)/testprogram@EXEEXT@: testprogram.c $(BINDBG)/libhllapi@DLLEXT@ | ||
130 | + @echo " CCLD `basename $@`" | ||
131 | + @$(MKDIR) `dirname $@` | ||
132 | + @$(CC) $(CFLAGS) $(PW3270_CFLAGS) -L$(BINDBG) $(DEBUG_CFLAGS) -lhllapi -o $@ testprogram.c | ||
133 | + | ||
134 | +test: $(BINDBG)/testprogram@EXEEXT@ | ||
135 | + | ||
136 | +run: $(BINDBG)/testprogram@EXEEXT@ | ||
137 | + @cd $(BINDBG) ; ./testprogram@EXEEXT@ | ||
138 | + | ||
139 | +install: $(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@ | ||
140 | + @$(MKDIR) $(DESTDIR)$(libdir)/$(PACKAGE_NAME)-plugins | ||
141 | + @$(INSTALL_PROGRAM) $(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@ $(DESTDIR)$(libdir)/$(PACKAGE_NAME)-plugins | ||
142 | + | ||
143 | +$(DEBDIR)/$(MODULE_NAME).install: Makefile | ||
144 | + @$(MKDIR) `dirname $@` | ||
145 | + @rm -f $@ | ||
146 | + @echo $(libdir)/$(PACKAGE_NAME)-plugins/$(MODULE_NAME)@DLLEXT@ > $@ | ||
147 | + | ||
148 | +clean: | ||
149 | + @rm -fr $(OBJDIR) | ||
150 | + @rm -fr $(BINDIR) | ||
151 | + @rm -f testprogram@EXEEXT@ | ||
152 | + @find . -name "*~" -exec rm -f {} \; |
@@ -0,0 +1,463 @@ | @@ -0,0 +1,463 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como calls.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + #include <windows.h> | ||
31 | + #include <lib3270.h> | ||
32 | + #include <malloc.h> | ||
33 | + #include <string.h> | ||
34 | + #include <errno.h> | ||
35 | + #include <pw3270/hllapi.h> | ||
36 | + #include <stdio.h> | ||
37 | + #include <lib3270/log.h> | ||
38 | + #include "client.h" | ||
39 | + | ||
40 | + #undef trace | ||
41 | + #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } } | ||
42 | + | ||
43 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
44 | + | ||
45 | + HMODULE hModule = NULL; | ||
46 | + void * hSession = NULL; | ||
47 | + | ||
48 | + static void * (*session_new)(const char *model) = NULL; | ||
49 | + static void (*session_free)(void *h) = NULL; | ||
50 | + static const char * (*get_revision)(void) = NULL; | ||
51 | + static int (*host_connect)(void *h,const char *n, int wait) = NULL; | ||
52 | + static int (*host_is_connected)(void *h) = NULL; | ||
53 | + static int (*wait_for_ready)(void *h, int seconds) = NULL; | ||
54 | + static void (*host_disconnect)(void *h) = NULL; | ||
55 | + static int (*script_sleep)(void *h, int seconds) = NULL; | ||
56 | + static LIB3270_MESSAGE (*get_message)(void *h) = NULL; | ||
57 | + static char * (*get_text)(void *h, int row, int col, int len) = NULL; | ||
58 | + static char * (*get_text_at_offset)(void *h, int offset, int len) = NULL; | ||
59 | + | ||
60 | + static void * (*release_memory)(void *p) = NULL; | ||
61 | + static int (*action_enter)(void *h) = NULL; | ||
62 | + static int (*set_text_at)(void *h, int row, int col, const unsigned char *str) = NULL; | ||
63 | + static int (*cmp_text_at)(void *h, int row, int col, const char *text) = NULL; | ||
64 | + static int (*pfkey)(void *hSession, int key) = NULL; | ||
65 | + static int (*pakey)(void *hSession, int key) = NULL; | ||
66 | + static int (*getcursor)(void *hSession) = NULL; | ||
67 | + static int (*setcursor)(void *hSession, int baddr) = NULL; | ||
68 | + static int (*emulate_input)(void *hSession, const char *s, int len, int pasting) = NULL; | ||
69 | + static int (*erase_eof)(void *hSession) = NULL; | ||
70 | + | ||
71 | + static const struct _entry_point | ||
72 | + { | ||
73 | + void **call; | ||
74 | + void * pipe; | ||
75 | + const char * name; | ||
76 | + } entry_point[] = | ||
77 | + { | ||
78 | + { (void **) &session_new, (void *) hllapi_pipe_init, "lib3270_session_new" }, | ||
79 | + { (void **) &session_free, (void *) hllapi_pipe_deinit, "lib3270_session_free" }, | ||
80 | + { (void **) &get_revision, (void *) hllapi_pipe_get_revision, "lib3270_get_revision" }, | ||
81 | + { (void **) &host_connect, (void *) hllapi_pipe_connect, "lib3270_connect" }, | ||
82 | + { (void **) &host_disconnect, (void *) hllapi_pipe_disconnect, "lib3270_disconnect" }, | ||
83 | + { (void **) &host_is_connected, (void *) hllapi_pipe_is_connected, "lib3270_in_tn3270e" }, | ||
84 | + { (void **) &wait_for_ready, (void *) hllapi_pipe_wait_for_ready, "lib3270_wait_for_ready" }, | ||
85 | + { (void **) &script_sleep, (void *) hllapi_pipe_sleep, "lib3270_wait" }, | ||
86 | + { (void **) &get_message, (void *) hllapi_pipe_get_message, "lib3270_get_program_message" }, | ||
87 | + { (void **) &get_text, (void *) hllapi_pipe_get_text_at, "lib3270_get_text_at" }, | ||
88 | + { (void **) &release_memory, (void *) hllapi_pipe_release_memory, "lib3270_free" }, | ||
89 | + { (void **) &action_enter, (void *) hllapi_pipe_enter, "lib3270_enter" }, | ||
90 | + { (void **) &set_text_at, (void *) hllapi_pipe_set_text_at, "lib3270_set_string_at" }, | ||
91 | + { (void **) &cmp_text_at, (void *) hllapi_pipe_cmp_text_at, "lib3270_cmp_text_at" }, | ||
92 | + { (void **) &pfkey, (void *) hllapi_pipe_pfkey, "lib3270_pfkey" }, | ||
93 | + { (void **) &pakey, (void *) hllapi_pipe_pakey, "lib3270_pakey" }, | ||
94 | + { (void **) &setcursor, (void *) hllapi_pipe_setcursor, "lib3270_set_cursor_address" }, | ||
95 | + { (void **) &getcursor, (void *) hllapi_pipe_getcursor, "lib3270_get_cursor_address" }, | ||
96 | + { (void **) &get_text_at_offset, (void *) hllapi_pipe_get_text, "lib3270_get_text" }, | ||
97 | + { (void **) &emulate_input, (void *) hllapi_pipe_emulate_input, "lib3270_emulate_input" }, | ||
98 | + { (void **) &erase_eof, (void *) hllapi_pipe_erase_eof, "lib3270_eraseeof" }, | ||
99 | + { NULL, NULL, NULL } | ||
100 | + }; | ||
101 | + | ||
102 | +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx | ||
103 | +#ifndef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
104 | + #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000 | ||
105 | +#endif // LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
106 | + | ||
107 | +#ifndef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
108 | + #define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100 | ||
109 | +#endif // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
110 | + | ||
111 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
112 | + | ||
113 | + __declspec (dllexport) DWORD __stdcall hllapi_init(LPSTR mode) | ||
114 | + { | ||
115 | + if(!mode) | ||
116 | + return EINVAL; | ||
117 | + | ||
118 | + trace("%s(%s)",__FUNCTION__,(char *) mode); | ||
119 | + | ||
120 | + if(mode && *mode) | ||
121 | + { | ||
122 | + // Get pointers to the pipe based calls | ||
123 | + int f; | ||
124 | + | ||
125 | + trace("%s: Loading pipe based calls",__FUNCTION__); | ||
126 | + for(f=0;entry_point[f].name;f++) | ||
127 | + *entry_point[f].call = entry_point[f].pipe; | ||
128 | + | ||
129 | + } | ||
130 | + else | ||
131 | + { | ||
132 | + // Direct mode, load lib3270.dll, get pointers to the calls | ||
133 | + static const char *dllname = "lib3270.dll." PACKAGE_VERSION; | ||
134 | + | ||
135 | + int f; | ||
136 | + HMODULE kernel; | ||
137 | + HANDLE cookie = NULL; | ||
138 | + DWORD rc; | ||
139 | + HANDLE (*AddDllDirectory)(PCWSTR NewDirectory); | ||
140 | + BOOL (*RemoveDllDirectory)(HANDLE Cookie); | ||
141 | + UINT errorMode; | ||
142 | + char datadir[4096]; | ||
143 | + | ||
144 | + trace("hModule=%p",hModule); | ||
145 | + if(hModule) | ||
146 | + return EBUSY; | ||
147 | + | ||
148 | + kernel = LoadLibrary("kernel32.dll"); | ||
149 | + AddDllDirectory = (HANDLE (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); | ||
150 | + RemoveDllDirectory = (BOOL (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); | ||
151 | + | ||
152 | + // Notify user in case of error loading protocol DLL | ||
153 | + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx | ||
154 | + errorMode = SetErrorMode(1); | ||
155 | + | ||
156 | + memset(datadir,' ',4095); | ||
157 | + datadir[4095] = 0; | ||
158 | + | ||
159 | + if(hllapi_get_datadir(datadir)) | ||
160 | + { | ||
161 | + char buffer[4096]; | ||
162 | + wchar_t path[4096]; | ||
163 | + | ||
164 | + mbstowcs(path, datadir, 4095); | ||
165 | + trace("Datadir=[%s] AddDllDirectory=%p RemoveDllDirectory=%p\n",datadir,AddDllDirectory,RemoveDllDirectory); | ||
166 | + if(AddDllDirectory) | ||
167 | + cookie = AddDllDirectory(path); | ||
168 | + | ||
169 | +#ifdef DEBUG | ||
170 | + snprintf(buffer,4096,"%s\\.bin\\Debug\\%s",datadir,dllname); | ||
171 | +#else | ||
172 | + snprintf(buffer,4096,"%s\\%s",datadir,dllname); | ||
173 | +#endif // DEBUG | ||
174 | + | ||
175 | + hModule = LoadLibrary(buffer); | ||
176 | + | ||
177 | + trace("%s hModule=%p rc=%d",buffer,hModule,(int) GetLastError()); | ||
178 | + | ||
179 | + if(hModule == NULL) | ||
180 | + { | ||
181 | + // Enable DLL error popup and try again with full path | ||
182 | + SetErrorMode(0); | ||
183 | + hModule = LoadLibraryEx(buffer,NULL,LOAD_LIBRARY_SEARCH_DEFAULT_DIRS|LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); | ||
184 | + } | ||
185 | + | ||
186 | + rc = GetLastError(); | ||
187 | + | ||
188 | + trace("%s hModule=%p rc=%d",buffer,hModule,(int) rc); | ||
189 | + } | ||
190 | + else | ||
191 | + { | ||
192 | + hModule = LoadLibrary(dllname); | ||
193 | + rc = GetLastError(); | ||
194 | + } | ||
195 | + | ||
196 | + SetErrorMode(errorMode); | ||
197 | + | ||
198 | + trace("%s hModule=%p rc=%d",dllname,hModule,(int) rc); | ||
199 | + | ||
200 | + if(cookie && RemoveDllDirectory) | ||
201 | + RemoveDllDirectory(cookie); | ||
202 | + | ||
203 | + if(kernel) | ||
204 | + FreeLibrary(kernel); | ||
205 | + | ||
206 | + if(!hModule) | ||
207 | + return rc; | ||
208 | + | ||
209 | + // Get library entry pointers | ||
210 | + for(f=0;entry_point[f].name;f++) | ||
211 | + { | ||
212 | + void *ptr = (void *) GetProcAddress(hModule,entry_point[f].name); | ||
213 | + | ||
214 | + trace("%d %s=%p\n",f,entry_point[f].name,ptr); | ||
215 | + | ||
216 | + if(!ptr) | ||
217 | + { | ||
218 | + fprintf(stderr,"Can´t load \"%s\"\n",entry_point[f].name); | ||
219 | + hllapi_deinit(); | ||
220 | + return ENOENT; | ||
221 | + } | ||
222 | + *entry_point[f].call = ptr; | ||
223 | + } | ||
224 | + | ||
225 | + } | ||
226 | + // Get session handle | ||
227 | + hSession = session_new((const char *) mode); | ||
228 | + trace("%s ok hSession=%p\n",__FUNCTION__,hSession); | ||
229 | + | ||
230 | + return hSession ? 0 : -1; | ||
231 | + } | ||
232 | + | ||
233 | + __declspec (dllexport) DWORD __stdcall hllapi_deinit(void) | ||
234 | + { | ||
235 | + int f; | ||
236 | + | ||
237 | + // Release session | ||
238 | + if(hSession && session_free) | ||
239 | + session_free(hSession); | ||
240 | + | ||
241 | + for(f=0;entry_point[f].name;f++) | ||
242 | + *entry_point[f].call = NULL; | ||
243 | + | ||
244 | + if(hModule != NULL) | ||
245 | + { | ||
246 | + FreeLibrary(hModule); | ||
247 | + hModule = NULL; | ||
248 | + } | ||
249 | + | ||
250 | + return 0; | ||
251 | + } | ||
252 | + | ||
253 | + __declspec (dllexport) DWORD __stdcall hllapi_get_revision(void) | ||
254 | + { | ||
255 | + if(!get_revision) | ||
256 | + return 0; | ||
257 | + return (DWORD) atoi(get_revision()); | ||
258 | + } | ||
259 | + | ||
260 | + __declspec (dllexport) DWORD __stdcall hllapi_connect(LPSTR uri, WORD wait) | ||
261 | + { | ||
262 | + if(!(host_connect && hSession && uri)) | ||
263 | + return EINVAL; | ||
264 | + | ||
265 | + return host_connect(hSession,uri,wait); | ||
266 | + } | ||
267 | + | ||
268 | + __declspec (dllexport) DWORD __stdcall hllapi_is_connected(void) | ||
269 | + { | ||
270 | + if(!(host_is_connected && hSession)) | ||
271 | + return EINVAL; | ||
272 | + | ||
273 | + return host_is_connected(hSession); | ||
274 | + } | ||
275 | + | ||
276 | + __declspec (dllexport) DWORD __stdcall hllapi_disconnect(void) | ||
277 | + { | ||
278 | + if(!(host_disconnect && hSession)) | ||
279 | + return EINVAL; | ||
280 | + | ||
281 | + host_disconnect(hSession); | ||
282 | + | ||
283 | + return 0; | ||
284 | + } | ||
285 | + | ||
286 | + __declspec (dllexport) DWORD __stdcall hllapi_wait_for_ready(WORD seconds) | ||
287 | + { | ||
288 | + if(!(wait_for_ready && hSession)) | ||
289 | + return EINVAL; | ||
290 | + | ||
291 | + trace("%s seconds=%d\n", __FUNCTION__, (int) seconds); | ||
292 | + | ||
293 | + return (DWORD) wait_for_ready(hSession,(int) seconds); | ||
294 | + } | ||
295 | + | ||
296 | + __declspec (dllexport) DWORD __stdcall hllapi_wait(WORD seconds) | ||
297 | + { | ||
298 | + if(!(script_sleep && hSession)) | ||
299 | + return EINVAL; | ||
300 | + | ||
301 | + return (DWORD) script_sleep(hSession,(int) seconds); | ||
302 | + } | ||
303 | + | ||
304 | + __declspec (dllexport) DWORD __stdcall hllapi_get_message_id(void) | ||
305 | + { | ||
306 | + if(!(get_message && hSession)) | ||
307 | + return EINVAL; | ||
308 | + return (DWORD) get_message(hSession); | ||
309 | + } | ||
310 | + | ||
311 | + __declspec (dllexport) DWORD __stdcall hllapi_get_screen_at(WORD row, WORD col, LPSTR buffer) | ||
312 | + { | ||
313 | + char * text; | ||
314 | + int len; | ||
315 | + | ||
316 | + if(!(get_text && release_memory && hSession)) | ||
317 | + return EINVAL; | ||
318 | + | ||
319 | + trace("%s row=%d col=%d buffer=%p",__FUNCTION__,row,col,buffer); | ||
320 | + len = strlen(buffer); | ||
321 | + | ||
322 | + trace(" len=%d",len); | ||
323 | + | ||
324 | + text = get_text(hSession,row,col,len); | ||
325 | + | ||
326 | + trace(" text=%p errno=%d %s\n",text,errno,strerror(errno)); | ||
327 | + | ||
328 | + if(!text) | ||
329 | + return EINVAL; | ||
330 | + | ||
331 | + strncpy(buffer,text,len); | ||
332 | + release_memory(text); | ||
333 | + | ||
334 | + trace("text:\n%s\n",buffer); | ||
335 | + | ||
336 | + return 0; | ||
337 | + } | ||
338 | + | ||
339 | + __declspec (dllexport) DWORD __stdcall hllapi_enter(void) | ||
340 | + { | ||
341 | + if(!(action_enter && hSession)) | ||
342 | + return EINVAL; | ||
343 | + | ||
344 | + return (DWORD) action_enter(hSession); | ||
345 | + } | ||
346 | + | ||
347 | + __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text) | ||
348 | + { | ||
349 | + if(!(set_text_at && hSession)) | ||
350 | + return EINVAL; | ||
351 | + | ||
352 | + return (DWORD) set_text_at(hSession,row,col,(const unsigned char *) text); | ||
353 | + } | ||
354 | + | ||
355 | + __declspec (dllexport) DWORD __stdcall hllapi_cmp_text_at(WORD row, WORD col, LPSTR text) | ||
356 | + { | ||
357 | + if(!(cmp_text_at && hSession)) | ||
358 | + return EINVAL; | ||
359 | + | ||
360 | + return (DWORD) cmp_text_at(hSession,row,col,(const char *) text); | ||
361 | + } | ||
362 | + | ||
363 | + __declspec (dllexport) DWORD __stdcall hllapi_pfkey(WORD key) | ||
364 | + { | ||
365 | + if(!(pfkey && hSession)) | ||
366 | + return EINVAL; | ||
367 | + | ||
368 | + return (DWORD) pfkey(hSession,key); | ||
369 | + } | ||
370 | + | ||
371 | + __declspec (dllexport) DWORD __stdcall hllapi_pakey(WORD key) | ||
372 | + { | ||
373 | + if(!(pfkey && hSession)) | ||
374 | + return EINVAL; | ||
375 | + | ||
376 | + return (DWORD) pakey(hSession,key); | ||
377 | + } | ||
378 | + | ||
379 | + __declspec (dllexport) DWORD __stdcall hllapi_get_datadir(LPSTR datadir) | ||
380 | + { | ||
381 | + HKEY hKey = 0; | ||
382 | + unsigned long datalen = strlen(datadir); | ||
383 | + | ||
384 | + *datadir = 0; | ||
385 | + | ||
386 | + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | ||
387 | + { | ||
388 | + unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | ||
389 | + if(RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) datadir,&datalen) != ERROR_SUCCESS) | ||
390 | + *datadir = 0; | ||
391 | + RegCloseKey(hKey); | ||
392 | + } | ||
393 | + | ||
394 | + return *datadir; | ||
395 | + } | ||
396 | + | ||
397 | + __declspec (dllexport) DWORD __stdcall hllapi_setcursor(WORD pos) | ||
398 | + { | ||
399 | + if(!(setcursor && hSession)) | ||
400 | + return EINVAL; | ||
401 | + trace("%s(%d)",__FUNCTION__,pos); | ||
402 | + return setcursor(hSession,pos-1); | ||
403 | + } | ||
404 | + | ||
405 | + __declspec (dllexport) DWORD __stdcall hllapi_getcursor() | ||
406 | + { | ||
407 | + if(!(getcursor && hSession)) | ||
408 | + return -EINVAL; | ||
409 | + return getcursor(hSession)+1; | ||
410 | + } | ||
411 | + | ||
412 | + __declspec (dllexport) DWORD __stdcall hllapi_get_screen(WORD pos, LPSTR buffer, WORD len) | ||
413 | + { | ||
414 | + char *text; | ||
415 | + | ||
416 | + trace("%s(%d,%d)",__FUNCTION__,pos,len); | ||
417 | + | ||
418 | + if(len < 0) | ||
419 | + len = strlen(buffer); | ||
420 | + | ||
421 | + if(!(get_text_at_offset && hSession)) | ||
422 | + return EINVAL; | ||
423 | + | ||
424 | + if(len > strlen(buffer)) | ||
425 | + len = strlen(buffer); | ||
426 | + | ||
427 | + trace("len=%d",len); | ||
428 | + text = get_text_at_offset(hSession,pos-1,len); | ||
429 | + | ||
430 | + trace("text=\n%s\n",text); | ||
431 | + | ||
432 | + if(!text) | ||
433 | + return -1; | ||
434 | + | ||
435 | + memcpy(buffer,text,len); | ||
436 | + | ||
437 | + release_memory(text); | ||
438 | + | ||
439 | + return 0; | ||
440 | + } | ||
441 | + | ||
442 | + __declspec (dllexport) DWORD __stdcall hllapi_emulate_input(LPSTR buffer, WORD len, WORD pasting) | ||
443 | + { | ||
444 | + | ||
445 | + if(!(emulate_input && hSession)) | ||
446 | + return EINVAL; | ||
447 | + trace("%s",__FUNCTION__); | ||
448 | + return emulate_input(hSession, buffer, len, pasting); | ||
449 | + } | ||
450 | + | ||
451 | + __declspec (dllexport) DWORD __stdcall hllapi_erase_eof(void) | ||
452 | + { | ||
453 | + if(!erase_eof && hSession) | ||
454 | + return EINVAL; | ||
455 | + trace("%s",__FUNCTION__); | ||
456 | + return erase_eof(hSession); | ||
457 | + } | ||
458 | + | ||
459 | + __declspec (dllexport) DWORD __stdcall hllapi_print(void) | ||
460 | + { | ||
461 | + #warning Implementar | ||
462 | + return -1; | ||
463 | + } |
@@ -0,0 +1,63 @@ | @@ -0,0 +1,63 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como private.h e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + #include <windows.h> | ||
31 | + #include <pw3270/hllapi.h> | ||
32 | + | ||
33 | + #ifndef ETIMEDOUT | ||
34 | + #define ETIMEDOUT 1238 | ||
35 | + #endif // ETIMEDOUT | ||
36 | + | ||
37 | + #define PIPE_BUFFER_LENGTH 8192 | ||
38 | + | ||
39 | + #define set_active(x) /* x */ | ||
40 | + | ||
41 | + void * hllapi_pipe_init(const char *id); | ||
42 | + void hllapi_pipe_deinit(void *h); | ||
43 | + const char * hllapi_pipe_get_revision(void); | ||
44 | + void hllapi_pipe_release_memory(void *p); | ||
45 | + int hllapi_pipe_connect(void *h, const char *n, int wait); | ||
46 | + void hllapi_pipe_disconnect(void *h); | ||
47 | + LIB3270_MESSAGE hllapi_pipe_get_message(void *h); | ||
48 | + char * hllapi_pipe_get_text_at(void *h, int row, int col, int len); | ||
49 | + char * hllapi_pipe_get_text(void *h, int offset, int len); | ||
50 | + int hllapi_pipe_enter(void *h); | ||
51 | + int hllapi_pipe_erase_eof(void *h); | ||
52 | + int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str); | ||
53 | + int hllapi_pipe_cmp_text_at(void *h, int row, int col, const char *text); | ||
54 | + int hllapi_pipe_pfkey(void *h, int key); | ||
55 | + int hllapi_pipe_pakey(void *h, int key); | ||
56 | + int hllapi_pipe_wait_for_ready(void *h, int seconds); | ||
57 | + int hllapi_pipe_sleep(void *h, int seconds); | ||
58 | + int hllapi_pipe_is_connected(void *h); | ||
59 | + int hllapi_pipe_getcursor(void *h); | ||
60 | + int hllapi_pipe_setcursor(void *h, int baddr); | ||
61 | + int hllapi_pipe_emulate_input(void *hSession, const char *s, int len, int pasting); | ||
62 | + | ||
63 | + |
@@ -0,0 +1,291 @@ | @@ -0,0 +1,291 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como hllapi.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + #include <lib3270.h> | ||
31 | + #include <malloc.h> | ||
32 | + #include <string.h> | ||
33 | + #include <errno.h> | ||
34 | + #include <pw3270/hllapi.h> | ||
35 | + #include <stdio.h> | ||
36 | + #include <lib3270/log.h> | ||
37 | + | ||
38 | + #undef trace | ||
39 | + #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } } | ||
40 | + | ||
41 | +/*--[ Prototipes ]-----------------------------------------------------------------------------------*/ | ||
42 | + | ||
43 | + static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc); | ||
44 | + static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc); | ||
45 | + static int get_library_revision(char *buffer, unsigned short *length, unsigned short *rc); | ||
46 | + static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc); | ||
47 | + | ||
48 | + static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); | ||
49 | + static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); | ||
50 | + static int input_string(char *buffer, unsigned short *length, unsigned short *rc); | ||
51 | + | ||
52 | + static int invalid_request(char *buffer, unsigned short *length, unsigned short *rc); | ||
53 | + | ||
54 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
55 | + | ||
56 | + static const struct _hllapi_call | ||
57 | + { | ||
58 | + unsigned long func; | ||
59 | + int (*exec)(char *buffer, unsigned short *length, unsigned short *rc); | ||
60 | + } hllapi_call[] = | ||
61 | + { | ||
62 | + { HLLAPI_CMD_CONNECTPS, connect_ps }, | ||
63 | + { HLLAPI_CMD_DISCONNECTPS, disconnect_ps }, | ||
64 | + { HLLAPI_CMD_GETREVISION, get_library_revision }, | ||
65 | + { HLLAPI_CMD_QUERYCURSOR, get_cursor_position }, | ||
66 | + { HLLAPI_CMD_SETCURSOR, set_cursor_position }, | ||
67 | + { HLLAPI_CMD_COPYPSTOSTR, copy_ps_to_str }, | ||
68 | + { HLLAPI_CMD_INPUTSTRING, input_string }, | ||
69 | + { HLLAPI_CMD_WAIT, invalid_request }, | ||
70 | + { HLLAPI_CMD_COPYPS, invalid_request }, | ||
71 | + { HLLAPI_CMD_SEARCHPS, invalid_request }, | ||
72 | + { HLLAPI_CMD_COPYSTRTOPS, invalid_request }, | ||
73 | + { HLLAPI_CMD_SENDFILE, invalid_request }, | ||
74 | + { HLLAPI_CMD_RECEIVEFILE, invalid_request }, | ||
75 | + | ||
76 | + }; | ||
77 | + | ||
78 | + static const char control_char = '@'; | ||
79 | + | ||
80 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
81 | + | ||
82 | +#ifdef _WIN32 | ||
83 | + __declspec (dllexport) int __stdcall hllapi(LPWORD func, LPSTR buffer, LPWORD length, LPWORD rc) | ||
84 | +#else | ||
85 | + LIB3270_EXPORT int hllapi(const unsigned long *func, char *buffer, unsigned short *length, unsigned short *rc) | ||
86 | +#endif // _WIN32 | ||
87 | +{ | ||
88 | + int f; | ||
89 | + | ||
90 | + trace("%s(%d)",__FUNCTION__,*func); | ||
91 | + | ||
92 | + for(f=0;f< (sizeof (hllapi_call) / sizeof ((hllapi_call)[0]));f++) | ||
93 | + { | ||
94 | + if(hllapi_call[f].func == *func) | ||
95 | + return hllapi_call[f].exec(buffer,length,rc); | ||
96 | + } | ||
97 | + | ||
98 | + return invalid_request(buffer, length, rc); | ||
99 | +} | ||
100 | + | ||
101 | +static int invalid_request(char *buffer, unsigned short *length, unsigned short *rc) | ||
102 | +{ | ||
103 | + *rc = HLLAPI_STATUS_BAD_PARAMETER; | ||
104 | + return *rc; | ||
105 | +} | ||
106 | + | ||
107 | +static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc) | ||
108 | +{ | ||
109 | + char *tempbuffer = NULL; | ||
110 | + | ||
111 | + trace("%s: len=%d buflen=%d",__FUNCTION__,*length,strlen(buffer)); | ||
112 | + | ||
113 | + if(strlen(buffer) > *length) | ||
114 | + buffer[*length] = 0; | ||
115 | + | ||
116 | + if(!strrchr(buffer,':')) | ||
117 | + { | ||
118 | + int sz = strlen(buffer); | ||
119 | + | ||
120 | + tempbuffer = malloc(sz+2); | ||
121 | + strcpy(tempbuffer,buffer); | ||
122 | + tempbuffer[sz-1] = ':'; | ||
123 | + tempbuffer[sz] = buffer[sz-1]; | ||
124 | + tempbuffer[sz+1] = 0; | ||
125 | + buffer = tempbuffer; | ||
126 | + } | ||
127 | + | ||
128 | + if(hllapi_init(buffer) == 0) | ||
129 | + *rc = HLLAPI_STATUS_SUCESS; | ||
130 | + else | ||
131 | + *rc = HLLAPI_STATUS_UNAVAILABLE; | ||
132 | + | ||
133 | + if(tempbuffer) | ||
134 | + free(tempbuffer); | ||
135 | + | ||
136 | + return 0; | ||
137 | +} | ||
138 | + | ||
139 | +static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc) | ||
140 | +{ | ||
141 | + *rc = hllapi_deinit(); | ||
142 | + return 0; | ||
143 | +} | ||
144 | + | ||
145 | +static int get_library_revision(char *buffer, unsigned short *length, unsigned short *rc) | ||
146 | +{ | ||
147 | + *rc = hllapi_get_revision(); | ||
148 | + return 0; | ||
149 | +} | ||
150 | + | ||
151 | +static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc) | ||
152 | +{ | ||
153 | + int pos = hllapi_getcursor(); | ||
154 | + | ||
155 | + trace("%s(%d)",__FUNCTION__,pos); | ||
156 | + | ||
157 | + if(pos < 0) | ||
158 | + return -1; | ||
159 | + | ||
160 | + *rc = pos; | ||
161 | + return 0; | ||
162 | +} | ||
163 | + | ||
164 | +static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc) | ||
165 | +{ | ||
166 | + trace("%s(%d)",__FUNCTION__,*rc); | ||
167 | + *rc = hllapi_setcursor(*rc); | ||
168 | + return 0; | ||
169 | +} | ||
170 | + | ||
171 | +static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc) | ||
172 | +{ | ||
173 | + // Length Length of the target data string. | ||
174 | + // PS Position Position within the host presentation space of the first byte in your target data string. | ||
175 | + return hllapi_get_screen(*rc,buffer,*length); | ||
176 | +} | ||
177 | + | ||
178 | +static int input_string(char *input, unsigned short *length, unsigned short *rc) | ||
179 | +{ | ||
180 | + size_t szText; | ||
181 | + char * text; | ||
182 | + | ||
183 | + if(!input) | ||
184 | + { | ||
185 | + *rc = HLLAPI_STATUS_BAD_PARAMETER; | ||
186 | + return HLLAPI_STATUS_BAD_PARAMETER; | ||
187 | + } | ||
188 | + | ||
189 | + szText = strlen(input); | ||
190 | + | ||
191 | + if(*length > 0 && *length < szText) | ||
192 | + szText = *length; | ||
193 | + | ||
194 | + text = malloc(szText+2); | ||
195 | + memcpy(text,input,szText); | ||
196 | + text[szText] = 0; | ||
197 | + | ||
198 | + *rc = 0; | ||
199 | + | ||
200 | + if(strchr(text,control_char)) | ||
201 | + { | ||
202 | + // Convert control char | ||
203 | + char * buffer = text; | ||
204 | + char * ptr; | ||
205 | + | ||
206 | + for(ptr = strchr(text,control_char);ptr;ptr = strchr(buffer,control_char)) | ||
207 | + { | ||
208 | + *(ptr++) = 0; | ||
209 | + | ||
210 | + hllapi_emulate_input(buffer,-1,0); | ||
211 | + | ||
212 | + switch(*(ptr++)) | ||
213 | + { | ||
214 | + case 'P': // Print | ||
215 | + *rc = hllapi_print(); | ||
216 | + break; | ||
217 | + | ||
218 | + case 'E': // Enter | ||
219 | + hllapi_enter(); | ||
220 | + break; | ||
221 | + | ||
222 | + case 'F': // Erase EOF | ||
223 | + hllapi_erase_eof(); | ||
224 | + break; | ||
225 | + | ||
226 | + case '1': // PF1 | ||
227 | + hllapi_pfkey(1); | ||
228 | + break; | ||
229 | + | ||
230 | + case '2': // PF2 | ||
231 | + hllapi_pfkey(2); | ||
232 | + break; | ||
233 | + | ||
234 | + case '3': // PF3 | ||
235 | + hllapi_pfkey(3); | ||
236 | + break; | ||
237 | + | ||
238 | + case '4': // PF4 | ||
239 | + hllapi_pfkey(4); | ||
240 | + break; | ||
241 | + | ||
242 | + case '5': // PF5 | ||
243 | + hllapi_pfkey(5); | ||
244 | + break; | ||
245 | + | ||
246 | + case '6': // PF6 | ||
247 | + hllapi_pfkey(6); | ||
248 | + break; | ||
249 | + | ||
250 | + case '7': // PF7 | ||
251 | + hllapi_pfkey(7); | ||
252 | + break; | ||
253 | + | ||
254 | + case '8': // PF8 | ||
255 | + hllapi_pfkey(8); | ||
256 | + break; | ||
257 | + | ||
258 | + case '9': // PF9 | ||
259 | + hllapi_pfkey(9); | ||
260 | + break; | ||
261 | + | ||
262 | + case 'a': // PF10 | ||
263 | + hllapi_pfkey(10); | ||
264 | + break; | ||
265 | + | ||
266 | + case 'b': // PF11 | ||
267 | + hllapi_pfkey(11); | ||
268 | + break; | ||
269 | + | ||
270 | + case 'c': // PF12 | ||
271 | + hllapi_pfkey(12); | ||
272 | + break; | ||
273 | + } | ||
274 | + | ||
275 | + buffer = ptr; | ||
276 | + | ||
277 | + } | ||
278 | + | ||
279 | + hllapi_emulate_input(buffer,-1,0); | ||
280 | + | ||
281 | + } | ||
282 | + else | ||
283 | + { | ||
284 | + hllapi_emulate_input(text,szText,0); | ||
285 | + } | ||
286 | + | ||
287 | + free(text); | ||
288 | + | ||
289 | + return 0; | ||
290 | +} | ||
291 | + |
@@ -0,0 +1,84 @@ | @@ -0,0 +1,84 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | ||
2 | +<CodeBlocks_project_file> | ||
3 | + <FileVersion major="1" minor="6" /> | ||
4 | + <Project> | ||
5 | + <Option title="pw3270 HLLAPI" /> | ||
6 | + <Option makefile_is_custom="1" /> | ||
7 | + <Option pch_mode="2" /> | ||
8 | + <Option compiler="gcc" /> | ||
9 | + <Build> | ||
10 | + <Target title="Debug"> | ||
11 | + <Option output=".bin/Debug/pw3270 HLLAPI" prefix_auto="1" extension_auto="1" /> | ||
12 | + <Option object_output=".obj/Debug/" /> | ||
13 | + <Option type="1" /> | ||
14 | + <Option compiler="gcc" /> | ||
15 | + <Compiler> | ||
16 | + <Add option="-g" /> | ||
17 | + </Compiler> | ||
18 | + </Target> | ||
19 | + <Target title="Release"> | ||
20 | + <Option output=".bin/Release/pw3270 HLLAPI" prefix_auto="1" extension_auto="1" /> | ||
21 | + <Option object_output=".obj/Release/" /> | ||
22 | + <Option type="1" /> | ||
23 | + <Option compiler="gcc" /> | ||
24 | + <Compiler> | ||
25 | + <Add option="-O2" /> | ||
26 | + </Compiler> | ||
27 | + <Linker> | ||
28 | + <Add option="-s" /> | ||
29 | + </Linker> | ||
30 | + </Target> | ||
31 | + <Target title="test"> | ||
32 | + <Option output=".bin/Debug/testprogram" prefix_auto="1" extension_auto="1" /> | ||
33 | + <Option object_output=".obj/Debug/" /> | ||
34 | + <Option type="1" /> | ||
35 | + <Option compiler="gcc" /> | ||
36 | + <Compiler> | ||
37 | + <Add option="-g" /> | ||
38 | + </Compiler> | ||
39 | + <Environment> | ||
40 | + <Variable name="LIB3270_CFLAGS" value='"-I../../../src/include"' /> | ||
41 | + <Variable name="LIB3270_LIBS" value='"-L../../../.bin/Debug -l3270"' /> | ||
42 | + <Variable name="PW3270_LIBS" value='"-L../../../.bin/Debug -lpw3270 -l3270"' /> | ||
43 | + </Environment> | ||
44 | + <MakeCommands> | ||
45 | + <Build command="$make LIB3270_MODE=Debug -f $makefile $target" /> | ||
46 | + <CompileFile command="$make -f $makefile $file" /> | ||
47 | + <Clean command="$make -f $makefile clean$target" /> | ||
48 | + <DistClean command="$make -f $makefile distclean$target" /> | ||
49 | + <AskRebuildNeeded command="$make -q -f $makefile $target" /> | ||
50 | + <SilentBuild command="$make LIB3270_MODE=Debug -f $makefile $target > $(CMD_NULL)" /> | ||
51 | + </MakeCommands> | ||
52 | + </Target> | ||
53 | + </Build> | ||
54 | + <Compiler> | ||
55 | + <Add option="-Wall" /> | ||
56 | + </Compiler> | ||
57 | + <Unit filename="Makefile.in" /> | ||
58 | + <Unit filename="calls.c"> | ||
59 | + <Option compilerVar="CC" /> | ||
60 | + </Unit> | ||
61 | + <Unit filename="client.h" /> | ||
62 | + <Unit filename="hllapi.c"> | ||
63 | + <Option compilerVar="CC" /> | ||
64 | + </Unit> | ||
65 | + <Unit filename="packets.h" /> | ||
66 | + <Unit filename="pluginmain.c"> | ||
67 | + <Option compilerVar="CC" /> | ||
68 | + </Unit> | ||
69 | + <Unit filename="remote.c"> | ||
70 | + <Option compilerVar="CC" /> | ||
71 | + </Unit> | ||
72 | + <Unit filename="remotectl.h" /> | ||
73 | + <Unit filename="server.h" /> | ||
74 | + <Unit filename="testprogram.c"> | ||
75 | + <Option compilerVar="CC" /> | ||
76 | + </Unit> | ||
77 | + <Extensions> | ||
78 | + <code_completion /> | ||
79 | + <envvars /> | ||
80 | + <debugger /> | ||
81 | + <lib_finder disable_auto="1" /> | ||
82 | + </Extensions> | ||
83 | + </Project> | ||
84 | +</CodeBlocks_project_file> |
@@ -0,0 +1,152 @@ | @@ -0,0 +1,152 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como packets.h e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + typedef enum _hllapi_packet | ||
31 | + { | ||
32 | + HLLAPI_PACKET_CONNECT, | ||
33 | + HLLAPI_PACKET_DISCONNECT, | ||
34 | + HLLAPI_PACKET_GET_PROGRAM_MESSAGE, | ||
35 | + HLLAPI_PACKET_GET_TEXT_AT_OFFSET, | ||
36 | + HLLAPI_PACKET_GET_TEXT_AT, | ||
37 | + HLLAPI_PACKET_SET_TEXT_AT, | ||
38 | + HLLAPI_PACKET_CMP_TEXT_AT, | ||
39 | + HLLAPI_PACKET_ENTER, | ||
40 | + HLLAPI_PACKET_PFKEY, | ||
41 | + HLLAPI_PACKET_PAKEY, | ||
42 | + HLLAPI_PACKET_SET_CURSOR_POSITION, | ||
43 | + HLLAPI_PACKET_GET_CURSOR_POSITION, | ||
44 | + HLLAPI_PACKET_INPUT_STRING, | ||
45 | + HLLAPI_PACKET_IS_CONNECTED, | ||
46 | + HLLAPI_PACKET_SET_CURSOR, | ||
47 | + HLLAPI_PACKET_GET_CURSOR, | ||
48 | + HLLAPI_PACKET_EMULATE_INPUT, | ||
49 | + HLLAPI_PACKET_ERASE_EOF, | ||
50 | + | ||
51 | + HLLAPI_PACKET_INVALID | ||
52 | + | ||
53 | + } HLLAPI_PACKET; | ||
54 | + | ||
55 | +#pragma pack(1) | ||
56 | + | ||
57 | +struct hllapi_packet_result | ||
58 | +{ | ||
59 | + int rc; | ||
60 | +}; | ||
61 | + | ||
62 | +struct hllapi_packet_text_result | ||
63 | +{ | ||
64 | + int rc; | ||
65 | + char text[1]; | ||
66 | +}; | ||
67 | + | ||
68 | +struct hllapi_packet_query | ||
69 | +{ | ||
70 | + unsigned char packet_id; | ||
71 | +}; | ||
72 | + | ||
73 | +struct hllapi_packet_connect | ||
74 | +{ | ||
75 | + unsigned char packet_id; | ||
76 | + unsigned char wait; | ||
77 | + char hostname[1]; | ||
78 | +}; | ||
79 | + | ||
80 | +struct hllapi_packet_keycode | ||
81 | +{ | ||
82 | + unsigned char packet_id; | ||
83 | + unsigned short keycode; | ||
84 | +}; | ||
85 | + | ||
86 | +struct hllapi_packet_cursor | ||
87 | +{ | ||
88 | + unsigned char packet_id; | ||
89 | + unsigned short row; | ||
90 | + unsigned short col; | ||
91 | +}; | ||
92 | + | ||
93 | +struct hllapi_packet_text | ||
94 | +{ | ||
95 | + unsigned char packet_id; | ||
96 | + char text[1]; | ||
97 | +}; | ||
98 | + | ||
99 | +struct hllapi_packet_at | ||
100 | +{ | ||
101 | + unsigned char packet_id; | ||
102 | + unsigned short row; | ||
103 | + unsigned short col; | ||
104 | + unsigned short len; | ||
105 | +}; | ||
106 | + | ||
107 | +struct hllapi_packet_text_at | ||
108 | +{ | ||
109 | + unsigned char packet_id; | ||
110 | + unsigned short row; | ||
111 | + unsigned short col; | ||
112 | + char text[1]; | ||
113 | +}; | ||
114 | + | ||
115 | +struct hllapi_packet_query_at | ||
116 | +{ | ||
117 | + unsigned char packet_id; | ||
118 | + unsigned short row; | ||
119 | + unsigned short col; | ||
120 | + unsigned short len; | ||
121 | +}; | ||
122 | + | ||
123 | +struct hllapi_packet_wait | ||
124 | +{ | ||
125 | + unsigned char packet_id; | ||
126 | + int timeout; | ||
127 | +}; | ||
128 | + | ||
129 | +struct hllapi_packet_addr | ||
130 | +{ | ||
131 | + unsigned char packet_id; | ||
132 | + unsigned short addr; | ||
133 | +}; | ||
134 | + | ||
135 | +struct hllapi_packet_query_offset | ||
136 | +{ | ||
137 | + unsigned char packet_id; | ||
138 | + unsigned short addr; | ||
139 | + unsigned short len; | ||
140 | +}; | ||
141 | + | ||
142 | +struct hllapi_packet_emulate_input | ||
143 | +{ | ||
144 | + unsigned char packet_id; | ||
145 | + unsigned short len; | ||
146 | + unsigned char pasting; | ||
147 | + char text[1]; | ||
148 | +}; | ||
149 | + | ||
150 | + | ||
151 | +#pragma pack() | ||
152 | + |
@@ -0,0 +1,385 @@ | @@ -0,0 +1,385 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como pipesource.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * licinio@bb.com.br (Licínio Luis Branco) | ||
28 | + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | ||
29 | + * | ||
30 | + */ | ||
31 | + | ||
32 | + #include <pw3270.h> | ||
33 | + #include <pw3270/v3270.h> | ||
34 | + | ||
35 | + #include <windows.h> | ||
36 | + #include <stdarg.h> | ||
37 | + #include "remotectl.h" | ||
38 | + | ||
39 | +/*---[ Defines ]----------------------------------------------------------------------------*/ | ||
40 | + | ||
41 | + #pragma pack(1) | ||
42 | + | ||
43 | + typedef struct _pipe_source | ||
44 | + { | ||
45 | + GSource gsrc; | ||
46 | + HANDLE hPipe; | ||
47 | + | ||
48 | + enum _PIPE_STATE | ||
49 | + { | ||
50 | + PIPE_STATE_WAITING, | ||
51 | + PIPE_STATE_READ, | ||
52 | + PIPE_STATE_PENDING_READ, | ||
53 | + | ||
54 | + PIPE_STATE_UNDEFINED, | ||
55 | + } state; | ||
56 | + | ||
57 | + OVERLAPPED overlap; | ||
58 | + unsigned char buffer[PIPE_BUFFER_LENGTH+1]; | ||
59 | + } pipe_source; | ||
60 | + | ||
61 | + #pragma pack() | ||
62 | + | ||
63 | +/*---[ GSource ]----------------------------------------------------------------------------*/ | ||
64 | + | ||
65 | +static void wait_for_client(pipe_source *source) | ||
66 | +{ | ||
67 | + set_active(FALSE); | ||
68 | + if(ConnectNamedPipe(source->hPipe,&source->overlap)) | ||
69 | + { | ||
70 | + popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | ||
71 | + return; | ||
72 | + } | ||
73 | + | ||
74 | + switch(GetLastError()) | ||
75 | + { | ||
76 | + // The overlapped connection in progress. | ||
77 | + case ERROR_IO_PENDING: | ||
78 | + // trace("%s: ERROR_IO_PENDING",__FUNCTION__); | ||
79 | + source->state = PIPE_STATE_WAITING; | ||
80 | + break; | ||
81 | + | ||
82 | + // Client is already connected, so signal an event. | ||
83 | + case ERROR_PIPE_CONNECTED: | ||
84 | + trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); | ||
85 | + set_active(TRUE); | ||
86 | + if(SetEvent(source->overlap.hEvent)) | ||
87 | + break; | ||
88 | + | ||
89 | + // If an error occurs during the connect operation... | ||
90 | + default: | ||
91 | + popup_lasterror("%s", _( "ConnectNamedPipe failed" )); | ||
92 | + } | ||
93 | + | ||
94 | + } | ||
95 | + | ||
96 | + static gboolean IO_prepare(GSource *source, gint *timeout) | ||
97 | + { | ||
98 | + /* | ||
99 | + * Called before all the file descriptors are polled. | ||
100 | + * If the source can determine that it is ready here | ||
101 | + * (without waiting for the results of the poll() call) | ||
102 | + * it should return TRUE. | ||
103 | + * | ||
104 | + * It can also return a timeout_ value which should be the maximum | ||
105 | + * timeout (in milliseconds) which should be passed to the poll() call. | ||
106 | + * The actual timeout used will be -1 if all sources returned -1, | ||
107 | + * or it will be the minimum of all the timeout_ values | ||
108 | + * returned which were >= 0. | ||
109 | + * | ||
110 | + */ | ||
111 | + if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
112 | + { | ||
113 | + // trace("%s: source=%p",__FUNCTION__,source); | ||
114 | + return TRUE; | ||
115 | + } | ||
116 | + | ||
117 | + *timeout = 10; | ||
118 | + return FALSE; | ||
119 | + } | ||
120 | + | ||
121 | + static gboolean IO_check(GSource *source) | ||
122 | + { | ||
123 | + /* | ||
124 | + * Called after all the file descriptors are polled. | ||
125 | + * The source should return TRUE if it is ready to be dispatched. | ||
126 | + * Note that some time may have passed since the previous prepare | ||
127 | + * function was called, so the source should be checked again here. | ||
128 | + * | ||
129 | + */ | ||
130 | + if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
131 | + return TRUE; | ||
132 | + | ||
133 | + return FALSE; | ||
134 | + } | ||
135 | + | ||
136 | + static void process_input(pipe_source *source, DWORD cbRead) | ||
137 | + { | ||
138 | + HLLAPI_DATA * data = (HLLAPI_DATA *) source->buffer; | ||
139 | + QUERY * qry = g_malloc0(sizeof(QUERY)+cbRead+1); | ||
140 | + | ||
141 | + qry->hPipe = source->hPipe; | ||
142 | + qry->text = (const gchar *) (qry+1); | ||
143 | + | ||
144 | + if(data->id == HLLAPI_REQUEST_QUERY) | ||
145 | + { | ||
146 | + // HLLAPI query | ||
147 | + qry->cmd = (int) data->func; | ||
148 | + qry->pos = (int) data->rc; | ||
149 | + qry->length = data->value; | ||
150 | + memcpy((gchar *)(qry->text),data->string,qry->length); | ||
151 | + } | ||
152 | + else | ||
153 | + { | ||
154 | + qry->cmd = -1; | ||
155 | + } | ||
156 | + | ||
157 | + enqueue_request(qry); | ||
158 | + } | ||
159 | + | ||
160 | + void request_complete(QUERY *qry, int rc, const gchar *text) | ||
161 | + { | ||
162 | + request_buffer(qry,rc,strlen(text),(const gpointer) text); | ||
163 | + } | ||
164 | + | ||
165 | + void request_status(QUERY *qry, int rc) | ||
166 | + { | ||
167 | + if(rc) | ||
168 | + { | ||
169 | + const gchar *msg = strerror(rc); | ||
170 | + request_buffer(qry, rc, strlen(msg), (const gpointer) msg); | ||
171 | + } | ||
172 | + else | ||
173 | + { | ||
174 | + request_buffer(qry, rc, 0, NULL); | ||
175 | + } | ||
176 | + } | ||
177 | + | ||
178 | + void request_value(QUERY *qry, int rc, unsigned int value) | ||
179 | + { | ||
180 | + HLLAPI_DATA data; | ||
181 | + | ||
182 | + memset(&data,0,sizeof(data)); | ||
183 | + data.id = HLLAPI_RESPONSE_VALUE; | ||
184 | + data.func = qry->cmd; | ||
185 | + data.rc = rc; | ||
186 | + data.value = value; | ||
187 | + | ||
188 | +#ifdef WIN32 | ||
189 | + { | ||
190 | + DWORD wrote = sizeof(data); | ||
191 | + WriteFile(qry->hPipe,&data,wrote,&wrote,NULL); | ||
192 | + trace("Wrote=%d len=%d",(int) wrote, sizeof(data)); | ||
193 | + } | ||
194 | +#endif // WIN32 | ||
195 | + | ||
196 | + g_free(qry); | ||
197 | + | ||
198 | + | ||
199 | + } | ||
200 | + | ||
201 | + void request_buffer(QUERY *qry, int rc, size_t szBuffer, const gpointer buffer) | ||
202 | + { | ||
203 | + size_t sz; | ||
204 | + HLLAPI_DATA *data; | ||
205 | + | ||
206 | + if(buffer) | ||
207 | + { | ||
208 | + sz = sizeof(HLLAPI_DATA)+szBuffer; | ||
209 | + data = g_malloc0(sz); | ||
210 | + data->id = HLLAPI_RESPONSE_TEXT; | ||
211 | + memcpy(data->string,buffer,szBuffer); | ||
212 | + } | ||
213 | + else | ||
214 | + { | ||
215 | + sz = sizeof(HLLAPI_DATA); | ||
216 | + data = g_malloc0(sz); | ||
217 | + data->id = HLLAPI_RESPONSE_VALUE; | ||
218 | + } | ||
219 | + | ||
220 | + data->func = qry->cmd; | ||
221 | + data->rc = rc; | ||
222 | + data->value = szBuffer; | ||
223 | + | ||
224 | + trace("rc=%d data->len=%d",rc,(int) szBuffer); | ||
225 | + | ||
226 | +#ifdef WIN32 | ||
227 | + { | ||
228 | + DWORD wrote = sz; | ||
229 | + WriteFile(qry->hPipe,data,wrote,&wrote,NULL); | ||
230 | + trace("Wrote=%d len=%d",(int) wrote, (int) sz); | ||
231 | + } | ||
232 | +#endif // WIN32 | ||
233 | + | ||
234 | + g_free(data); | ||
235 | + g_free(qry); | ||
236 | + | ||
237 | + } | ||
238 | + | ||
239 | + static void read_input_pipe(pipe_source *source) | ||
240 | + { | ||
241 | + DWORD cbRead = 0; | ||
242 | + | ||
243 | + if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0) | ||
244 | + process_input(source,cbRead); | ||
245 | + | ||
246 | + // The read operation is still pending. | ||
247 | + switch(GetLastError()) | ||
248 | + { | ||
249 | + case 0: | ||
250 | + break; | ||
251 | + | ||
252 | + case ERROR_IO_PENDING: | ||
253 | + // trace("%s: PIPE_STATE_PENDING_READ",__FUNCTION__); | ||
254 | + source->state = PIPE_STATE_PENDING_READ; | ||
255 | + break; | ||
256 | + | ||
257 | + case ERROR_PIPE_LISTENING: | ||
258 | + // trace("%s: ERROR_PIPE_LISTENING",__FUNCTION__); | ||
259 | + source->state = PIPE_STATE_READ; | ||
260 | + break; | ||
261 | + | ||
262 | + case ERROR_BROKEN_PIPE: | ||
263 | + trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); | ||
264 | + | ||
265 | + if(!DisconnectNamedPipe(source->hPipe)) | ||
266 | + { | ||
267 | + set_active(FALSE); | ||
268 | + popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); | ||
269 | + } | ||
270 | + else | ||
271 | + { | ||
272 | + wait_for_client(source); | ||
273 | + } | ||
274 | + break; | ||
275 | + | ||
276 | + case ERROR_PIPE_NOT_CONNECTED: | ||
277 | + trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); | ||
278 | + set_active(FALSE); | ||
279 | + break; | ||
280 | + | ||
281 | + default: | ||
282 | + if(source->hPipe != INVALID_HANDLE_VALUE) | ||
283 | + popup_lasterror("%s",_( "Error receiving message from pipe" ) ); | ||
284 | + } | ||
285 | + | ||
286 | + } | ||
287 | + | ||
288 | + static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data) | ||
289 | + { | ||
290 | + /* | ||
291 | + * Called to dispatch the event source, | ||
292 | + * after it has returned TRUE in either its prepare or its check function. | ||
293 | + * The dispatch function is passed in a callback function and data. | ||
294 | + * The callback function may be NULL if the source was never connected | ||
295 | + * to a callback using g_source_set_callback(). The dispatch function | ||
296 | + * should call the callback function with user_data and whatever additional | ||
297 | + * parameters are needed for this type of event source. | ||
298 | + */ | ||
299 | + BOOL fSuccess; | ||
300 | + DWORD cbRead = 0; | ||
301 | +// DWORD dwErr = 0; | ||
302 | + | ||
303 | + fSuccess = GetOverlappedResult(((pipe_source *) source)->hPipe,&((pipe_source *) source)->overlap,&cbRead,FALSE ); | ||
304 | + | ||
305 | + // trace("%s: source=%p data=%p Result=%s cbRead=%d",__FUNCTION__,source,data,fSuccess ? "Success" : "Unsuccess",(int) cbRead); | ||
306 | + | ||
307 | + switch(((pipe_source *) source)->state) | ||
308 | + { | ||
309 | + case PIPE_STATE_WAITING: | ||
310 | + if(fSuccess) | ||
311 | + { | ||
312 | + trace("Pipe connected (cbRet=%d)",(int) cbRead); | ||
313 | + set_active(TRUE); | ||
314 | + ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
315 | + } | ||
316 | + else | ||
317 | + { | ||
318 | + popup_lasterror("%s", _( "Pipe connection failed" )); | ||
319 | + } | ||
320 | + break; | ||
321 | + | ||
322 | + case PIPE_STATE_READ: | ||
323 | + // trace("Reading pipe (cbRead=%d)",(int) cbRead); | ||
324 | + read_input_pipe( (pipe_source *) source); | ||
325 | + break; | ||
326 | + | ||
327 | + case PIPE_STATE_PENDING_READ: | ||
328 | + if(fSuccess && cbRead > 0) | ||
329 | + process_input((pipe_source *) source,cbRead); | ||
330 | + ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
331 | + break; | ||
332 | + | ||
333 | +//#ifdef DEBUG | ||
334 | +// default: | ||
335 | +// trace("%s: source=%p data=%p Unexpected mode %d",__FUNCTION__,source,data,((pipe_source *) source)->state); | ||
336 | +//#endif | ||
337 | + } | ||
338 | + | ||
339 | + return TRUE; | ||
340 | + } | ||
341 | + | ||
342 | + static void IO_finalize(GSource *source) | ||
343 | + { | ||
344 | +// trace("%s: source=%p",__FUNCTION__,source); | ||
345 | + | ||
346 | + if( ((pipe_source *) source)->hPipe != INVALID_HANDLE_VALUE) | ||
347 | + { | ||
348 | + CloseHandle(((pipe_source *) source)->hPipe); | ||
349 | + ((pipe_source *) source)->hPipe = INVALID_HANDLE_VALUE; | ||
350 | + } | ||
351 | + | ||
352 | + } | ||
353 | + | ||
354 | + static gboolean IO_closure(gpointer data) | ||
355 | + { | ||
356 | +// trace("%s: data=%p",__FUNCTION__,data); | ||
357 | + return 0; | ||
358 | + } | ||
359 | + | ||
360 | + | ||
361 | + void init_source_pipe(HANDLE hPipe) | ||
362 | + { | ||
363 | + static GSourceFuncs pipe_source_funcs = | ||
364 | + { | ||
365 | + IO_prepare, | ||
366 | + IO_check, | ||
367 | + IO_dispatch, | ||
368 | + IO_finalize, | ||
369 | + IO_closure, | ||
370 | + NULL | ||
371 | + }; | ||
372 | + | ||
373 | + pipe_source *source = (pipe_source *) g_source_new(&pipe_source_funcs,sizeof(pipe_source)); | ||
374 | + | ||
375 | + source->hPipe = hPipe; | ||
376 | + source->state = PIPE_STATE_WAITING; | ||
377 | + source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); | ||
378 | + | ||
379 | + g_source_attach((GSource *) source,NULL); | ||
380 | + | ||
381 | + wait_for_client(source); | ||
382 | + | ||
383 | + return; | ||
384 | + } | ||
385 | + |
@@ -0,0 +1,818 @@ | @@ -0,0 +1,818 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como pluginmain.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + * Agradecimento: | ||
29 | + * | ||
30 | + * Hélio Passos | ||
31 | + * | ||
32 | + */ | ||
33 | + | ||
34 | + #include "server.h" | ||
35 | + #include "packets.h" | ||
36 | + #include <lib3270/actions.h> | ||
37 | + | ||
38 | +/*--[ Defines ]--------------------------------------------------------------------------------------*/ | ||
39 | + | ||
40 | + #pragma pack(1) | ||
41 | + | ||
42 | + typedef struct _pipe_source | ||
43 | + { | ||
44 | + GSource gsrc; | ||
45 | + HANDLE hPipe; | ||
46 | + | ||
47 | + enum _PIPE_STATE | ||
48 | + { | ||
49 | + PIPE_STATE_WAITING, | ||
50 | + PIPE_STATE_READ, | ||
51 | + PIPE_STATE_PENDING_READ, | ||
52 | + PIPE_STATE_UNDEFINED, | ||
53 | + } state; | ||
54 | + | ||
55 | + OVERLAPPED overlap; | ||
56 | + unsigned char buffer[PIPE_BUFFER_LENGTH+1]; | ||
57 | + } pipe_source; | ||
58 | + | ||
59 | + #pragma pack() | ||
60 | + | ||
61 | + | ||
62 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
63 | + | ||
64 | + static const gchar control_char = '@'; | ||
65 | + | ||
66 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
67 | + | ||
68 | + static void IO_accept(pipe_source *source) | ||
69 | + { | ||
70 | + set_active(FALSE); | ||
71 | + | ||
72 | + if(ConnectNamedPipe(source->hPipe,&source->overlap)) | ||
73 | + { | ||
74 | + popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | ||
75 | + return; | ||
76 | + } | ||
77 | + | ||
78 | + switch(GetLastError()) | ||
79 | + { | ||
80 | + // The overlapped connection in progress. | ||
81 | + case ERROR_IO_PENDING: | ||
82 | + // trace("%s: ERROR_IO_PENDING",__FUNCTION__); | ||
83 | + source->state = PIPE_STATE_WAITING; | ||
84 | + break; | ||
85 | + | ||
86 | + // Client is already connected, so signal an event. | ||
87 | + case ERROR_PIPE_CONNECTED: | ||
88 | + trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); | ||
89 | + set_active(TRUE); | ||
90 | + if(SetEvent(source->overlap.hEvent)) | ||
91 | + break; | ||
92 | + | ||
93 | + // If an error occurs during the connect operation... | ||
94 | + default: | ||
95 | + popup_lasterror("%s", _( "ConnectNamedPipe failed" )); | ||
96 | + } | ||
97 | + | ||
98 | + } | ||
99 | + | ||
100 | + static gboolean IO_prepare(GSource *source, gint *timeout) | ||
101 | + { | ||
102 | + /* | ||
103 | + * Called before all the file descriptors are polled. | ||
104 | + * If the source can determine that it is ready here | ||
105 | + * (without waiting for the results of the poll() call) | ||
106 | + * it should return TRUE. | ||
107 | + * | ||
108 | + * It can also return a timeout_ value which should be the maximum | ||
109 | + * timeout (in milliseconds) which should be passed to the poll() call. | ||
110 | + * The actual timeout used will be -1 if all sources returned -1, | ||
111 | + * or it will be the minimum of all the timeout_ values | ||
112 | + * returned which were >= 0. | ||
113 | + * | ||
114 | + */ | ||
115 | + if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
116 | + return TRUE; | ||
117 | + | ||
118 | + *timeout = 10; | ||
119 | + return FALSE; | ||
120 | + } | ||
121 | + | ||
122 | + static gboolean IO_check(GSource *source) | ||
123 | + { | ||
124 | + /* | ||
125 | + * Called after all the file descriptors are polled. | ||
126 | + * The source should return TRUE if it is ready to be dispatched. | ||
127 | + * Note that some time may have passed since the previous prepare | ||
128 | + * function was called, so the source should be checked again here. | ||
129 | + * | ||
130 | + */ | ||
131 | + if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
132 | + return TRUE; | ||
133 | + | ||
134 | + return FALSE; | ||
135 | + } | ||
136 | + | ||
137 | + static void send_text(pipe_source *source, char *text) | ||
138 | + { | ||
139 | + struct hllapi_packet_text *pkt; | ||
140 | + DWORD szBlock; | ||
141 | + | ||
142 | + if(text) | ||
143 | + { | ||
144 | + szBlock = sizeof(struct hllapi_packet_text)+strlen(text); | ||
145 | + pkt = g_malloc0(szBlock); | ||
146 | + pkt->packet_id = 0; | ||
147 | + strcpy(pkt->text,text); | ||
148 | + lib3270_free(text); | ||
149 | + } | ||
150 | + else | ||
151 | + { | ||
152 | + szBlock = sizeof(struct hllapi_packet_text); | ||
153 | + pkt = g_malloc0(szBlock); | ||
154 | + pkt->packet_id = errno ? errno : -1; | ||
155 | + } | ||
156 | + | ||
157 | + WriteFile(source->hPipe,pkt,szBlock,&szBlock,NULL); | ||
158 | + | ||
159 | + g_free(pkt); | ||
160 | + } | ||
161 | + | ||
162 | + static void send_result(pipe_source *source, int rc) | ||
163 | + { | ||
164 | + struct hllapi_packet_result pkt = { rc }; | ||
165 | + DWORD wrote = sizeof(pkt); | ||
166 | + WriteFile(source->hPipe,&pkt,wrote,&wrote,NULL); | ||
167 | + } | ||
168 | + | ||
169 | + static void process_input(pipe_source *source, DWORD cbRead) | ||
170 | + { | ||
171 | + | ||
172 | + trace("%s id=%d",__FUNCTION__,((struct hllapi_packet_query *) source->buffer)->packet_id); | ||
173 | + | ||
174 | + switch(((struct hllapi_packet_query *) source->buffer)->packet_id) | ||
175 | + { | ||
176 | + case HLLAPI_PACKET_CONNECT: | ||
177 | + send_result(source,lib3270_connect( lib3270_get_default_session_handle(), | ||
178 | + ((struct hllapi_packet_connect *) source->buffer)->hostname, | ||
179 | + ((struct hllapi_packet_connect *) source->buffer)->wait)); | ||
180 | + break; | ||
181 | + | ||
182 | + case HLLAPI_PACKET_DISCONNECT: | ||
183 | + send_result(source,lib3270_disconnect(lib3270_get_default_session_handle())); | ||
184 | + break; | ||
185 | + | ||
186 | + case HLLAPI_PACKET_GET_PROGRAM_MESSAGE: | ||
187 | + send_result(source,lib3270_get_program_message(lib3270_get_default_session_handle())); | ||
188 | + break; | ||
189 | + | ||
190 | + case HLLAPI_PACKET_IS_CONNECTED: | ||
191 | + send_result(source,lib3270_in_tn3270e(lib3270_get_default_session_handle())); | ||
192 | + break; | ||
193 | + | ||
194 | + case HLLAPI_PACKET_ENTER: | ||
195 | + send_result(source,lib3270_enter(lib3270_get_default_session_handle())); | ||
196 | + break; | ||
197 | + | ||
198 | + case HLLAPI_PACKET_ERASE_EOF: | ||
199 | + send_result(source,lib3270_eraseeof(lib3270_get_default_session_handle())); | ||
200 | + break; | ||
201 | + | ||
202 | + case HLLAPI_PACKET_PFKEY: | ||
203 | + send_result(source,lib3270_pfkey( lib3270_get_default_session_handle(), | ||
204 | + ((struct hllapi_packet_keycode *) source->buffer)->keycode)); | ||
205 | + break; | ||
206 | + | ||
207 | + case HLLAPI_PACKET_PAKEY: | ||
208 | + send_result(source,lib3270_pakey( lib3270_get_default_session_handle(), | ||
209 | + ((struct hllapi_packet_keycode *) source->buffer)->keycode)); | ||
210 | + break; | ||
211 | + | ||
212 | + case HLLAPI_PACKET_SET_CURSOR_POSITION: | ||
213 | + send_result(source,lib3270_set_cursor_position( lib3270_get_default_session_handle(), | ||
214 | + ((struct hllapi_packet_cursor *) source->buffer)->row, | ||
215 | + ((struct hllapi_packet_cursor *) source->buffer)->col)); | ||
216 | + break; | ||
217 | + | ||
218 | + case HLLAPI_PACKET_SET_TEXT_AT: | ||
219 | + send_result(source,lib3270_set_text_at( lib3270_get_default_session_handle(), | ||
220 | + ((struct hllapi_packet_text_at *) source->buffer)->row, | ||
221 | + ((struct hllapi_packet_text_at *) source->buffer)->col, | ||
222 | + (unsigned char *) ((struct hllapi_packet_text_at *) source->buffer)->text)); | ||
223 | + break; | ||
224 | + | ||
225 | + case HLLAPI_PACKET_GET_TEXT_AT: | ||
226 | + send_text(source,lib3270_get_text_at( lib3270_get_default_session_handle(), | ||
227 | + ((struct hllapi_packet_at *) source->buffer)->row, | ||
228 | + ((struct hllapi_packet_at *) source->buffer)->col, | ||
229 | + ((struct hllapi_packet_at *) source->buffer)->len)); | ||
230 | + break; | ||
231 | + | ||
232 | + case HLLAPI_PACKET_GET_TEXT_AT_OFFSET: | ||
233 | + send_text(source,lib3270_get_text( lib3270_get_default_session_handle(), | ||
234 | + ((struct hllapi_packet_query_offset *) source->buffer)->addr, | ||
235 | + ((struct hllapi_packet_query_offset *) source->buffer)->len)); | ||
236 | + break; | ||
237 | + | ||
238 | + case HLLAPI_PACKET_CMP_TEXT_AT: | ||
239 | + send_result(source,lib3270_cmp_text_at( lib3270_get_default_session_handle(), | ||
240 | + ((struct hllapi_packet_text_at *) source->buffer)->row, | ||
241 | + ((struct hllapi_packet_text_at *) source->buffer)->col, | ||
242 | + ((struct hllapi_packet_text_at *) source->buffer)->text)); | ||
243 | + break; | ||
244 | + | ||
245 | + case HLLAPI_PACKET_INPUT_STRING: | ||
246 | + send_result(source,lib3270_input_string(lib3270_get_default_session_handle(), | ||
247 | + (unsigned char *) ((struct hllapi_packet_text *) source->buffer)->text)); | ||
248 | + break; | ||
249 | + | ||
250 | + case HLLAPI_PACKET_EMULATE_INPUT: | ||
251 | + send_result(source,lib3270_emulate_input(lib3270_get_default_session_handle(), | ||
252 | + (const char *) ((struct hllapi_packet_emulate_input *) source->buffer)->text, | ||
253 | + (int) ((struct hllapi_packet_emulate_input *) source->buffer)->len, | ||
254 | + (int) ((struct hllapi_packet_emulate_input *) source->buffer)->pasting)); | ||
255 | + break; | ||
256 | + | ||
257 | + case HLLAPI_PACKET_SET_CURSOR: | ||
258 | + send_result(source,lib3270_set_cursor_address(lib3270_get_default_session_handle(), | ||
259 | + ((struct hllapi_packet_addr *) source->buffer)->addr)); | ||
260 | + break; | ||
261 | + | ||
262 | + case HLLAPI_PACKET_GET_CURSOR: | ||
263 | + send_result(source,lib3270_get_cursor_address(lib3270_get_default_session_handle())); | ||
264 | + break; | ||
265 | + | ||
266 | + | ||
267 | + default: | ||
268 | + send_result(source, EINVAL); | ||
269 | + g_message("Invalid remote request (id=%d)",source->buffer[0]); | ||
270 | + } | ||
271 | + | ||
272 | + } | ||
273 | + | ||
274 | + static void read_input_pipe(pipe_source *source) | ||
275 | + { | ||
276 | + DWORD cbRead = 0; | ||
277 | + | ||
278 | + if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0) | ||
279 | + process_input(source,cbRead); | ||
280 | + | ||
281 | + // The read operation is still pending. | ||
282 | + switch(GetLastError()) | ||
283 | + { | ||
284 | + case 0: | ||
285 | + break; | ||
286 | + | ||
287 | + case ERROR_IO_PENDING: | ||
288 | + // trace("%s: PIPE_STATE_PENDING_READ",__FUNCTION__); | ||
289 | + source->state = PIPE_STATE_PENDING_READ; | ||
290 | + break; | ||
291 | + | ||
292 | + case ERROR_PIPE_LISTENING: | ||
293 | + // trace("%s: ERROR_PIPE_LISTENING",__FUNCTION__); | ||
294 | + source->state = PIPE_STATE_READ; | ||
295 | + break; | ||
296 | + | ||
297 | + case ERROR_BROKEN_PIPE: | ||
298 | + trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); | ||
299 | + | ||
300 | + if(!DisconnectNamedPipe(source->hPipe)) | ||
301 | + { | ||
302 | + set_active(FALSE); | ||
303 | + popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); | ||
304 | + } | ||
305 | + else | ||
306 | + { | ||
307 | + IO_accept(source); | ||
308 | + } | ||
309 | + break; | ||
310 | + | ||
311 | + case ERROR_PIPE_NOT_CONNECTED: | ||
312 | + trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); | ||
313 | + set_active(FALSE); | ||
314 | + break; | ||
315 | + | ||
316 | + default: | ||
317 | + if(source->hPipe != INVALID_HANDLE_VALUE) | ||
318 | + popup_lasterror("%s",_( "Error receiving message from pipe" ) ); | ||
319 | + } | ||
320 | + | ||
321 | + } | ||
322 | + | ||
323 | + static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data) | ||
324 | + { | ||
325 | + /* | ||
326 | + * Called to dispatch the event source, | ||
327 | + * after it has returned TRUE in either its prepare or its check function. | ||
328 | + * The dispatch function is passed in a callback function and data. | ||
329 | + * The callback function may be NULL if the source was never connected | ||
330 | + * to a callback using g_source_set_callback(). The dispatch function | ||
331 | + * should call the callback function with user_data and whatever additional | ||
332 | + * parameters are needed for this type of event source. | ||
333 | + */ | ||
334 | + BOOL fSuccess; | ||
335 | + DWORD cbRead = 0; | ||
336 | +// DWORD dwErr = 0; | ||
337 | + | ||
338 | + fSuccess = GetOverlappedResult(((pipe_source *) source)->hPipe,&((pipe_source *) source)->overlap,&cbRead,FALSE ); | ||
339 | + | ||
340 | + // trace("%s: source=%p data=%p Result=%s cbRead=%d",__FUNCTION__,source,data,fSuccess ? "Success" : "Unsuccess",(int) cbRead); | ||
341 | + | ||
342 | + switch(((pipe_source *) source)->state) | ||
343 | + { | ||
344 | + case PIPE_STATE_WAITING: | ||
345 | + if(fSuccess) | ||
346 | + { | ||
347 | + trace("Pipe connected (cbRet=%d)",(int) cbRead); | ||
348 | + set_active(TRUE); | ||
349 | + ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
350 | + } | ||
351 | + else | ||
352 | + { | ||
353 | + popup_lasterror("%s", _( "Pipe connection failed" )); | ||
354 | + } | ||
355 | + break; | ||
356 | + | ||
357 | + case PIPE_STATE_READ: | ||
358 | + // trace("Reading pipe (cbRead=%d)",(int) cbRead); | ||
359 | + read_input_pipe( (pipe_source *) source); | ||
360 | + break; | ||
361 | + | ||
362 | + case PIPE_STATE_PENDING_READ: | ||
363 | + if(fSuccess && cbRead > 0) | ||
364 | + process_input((pipe_source *) source,cbRead); | ||
365 | + ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
366 | + break; | ||
367 | + | ||
368 | + case PIPE_STATE_UNDEFINED: | ||
369 | + break; | ||
370 | + | ||
371 | +//#ifdef DEBUG | ||
372 | +// default: | ||
373 | +// trace("%s: source=%p data=%p Unexpected mode %d",__FUNCTION__,source,data,((pipe_source *) source)->state); | ||
374 | +//#endif | ||
375 | + } | ||
376 | + | ||
377 | + return TRUE; | ||
378 | + } | ||
379 | + | ||
380 | + static void IO_finalize(GSource *source) | ||
381 | + { | ||
382 | +// trace("%s: source=%p",__FUNCTION__,source); | ||
383 | + | ||
384 | + if( ((pipe_source *) source)->hPipe != INVALID_HANDLE_VALUE) | ||
385 | + { | ||
386 | + CloseHandle(((pipe_source *) source)->hPipe); | ||
387 | + ((pipe_source *) source)->hPipe = INVALID_HANDLE_VALUE; | ||
388 | + } | ||
389 | + | ||
390 | + } | ||
391 | + | ||
392 | + static gboolean IO_closure(gpointer data) | ||
393 | + { | ||
394 | +// trace("%s: data=%p",__FUNCTION__,data); | ||
395 | + return 0; | ||
396 | + } | ||
397 | + | ||
398 | + void popup_lasterror(const gchar *fmt, ...) | ||
399 | + { | ||
400 | + char buffer[4096]; | ||
401 | + va_list arg_ptr; | ||
402 | + int sz; | ||
403 | + DWORD errcode = GetLastError(); | ||
404 | + char *ptr; | ||
405 | + LPVOID lpMsgBuf = 0; | ||
406 | + | ||
407 | + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); | ||
408 | + | ||
409 | + for(ptr=lpMsgBuf;*ptr && *ptr != '\n';ptr++); | ||
410 | + *ptr = 0; | ||
411 | + | ||
412 | + va_start(arg_ptr, fmt); | ||
413 | + vsnprintf(buffer,4095,fmt,arg_ptr); | ||
414 | + va_end(arg_ptr); | ||
415 | + | ||
416 | + sz = strlen(buffer); | ||
417 | + snprintf(buffer+sz,4096-sz,": %s\n(rc=%d)",lpMsgBuf,(int) errcode); | ||
418 | + | ||
419 | + printf("%s\n",buffer); | ||
420 | + | ||
421 | +#ifdef DEBUG | ||
422 | + fprintf(stderr,"%s\n",buffer); | ||
423 | + fflush(stderr); | ||
424 | +#endif | ||
425 | + | ||
426 | + LocalFree(lpMsgBuf); | ||
427 | + } | ||
428 | + | ||
429 | + LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) | ||
430 | + { | ||
431 | + char id; | ||
432 | + | ||
433 | + for(id='A';id < 'Z';id++) | ||
434 | + { | ||
435 | + gchar * pipename = g_strdup_printf("\\\\.\\pipe\\%s_%c",pw3270_get_session_name(window),id); | ||
436 | + gchar * ptr; | ||
437 | + HANDLE hPipe; | ||
438 | + | ||
439 | + for(ptr=pipename;*ptr;ptr++) | ||
440 | + *ptr = g_ascii_tolower(*ptr); | ||
441 | + | ||
442 | + hPipe = CreateNamedPipe( TEXT(pipename), // pipe name | ||
443 | + PIPE_ACCESS_DUPLEX | // read/write access | ||
444 | + FILE_FLAG_OVERLAPPED, // overlapped mode | ||
445 | + PIPE_TYPE_MESSAGE | // pipe type | ||
446 | + PIPE_READMODE_MESSAGE | // pipe mode | ||
447 | + PIPE_WAIT, // blocking mode | ||
448 | + 1, // number of instances | ||
449 | + PIPE_BUFFER_LENGTH, // output buffer size | ||
450 | + PIPE_BUFFER_LENGTH, // input buffer size | ||
451 | + NMPWAIT_USE_DEFAULT_WAIT, // client time-out | ||
452 | + NULL); // default security attributes | ||
453 | + | ||
454 | + trace("%s = %p",pipename,hPipe); | ||
455 | + g_free(pipename); | ||
456 | + | ||
457 | + if(hPipe != INVALID_HANDLE_VALUE) | ||
458 | + { | ||
459 | + static GSourceFuncs pipe_source_funcs = | ||
460 | + { | ||
461 | + IO_prepare, | ||
462 | + IO_check, | ||
463 | + IO_dispatch, | ||
464 | + IO_finalize, | ||
465 | + IO_closure, | ||
466 | + NULL | ||
467 | + }; | ||
468 | + pipe_source * source; | ||
469 | + gchar * session = g_strdup_printf("%s:%c",pw3270_get_session_name(window),id); | ||
470 | + | ||
471 | + pw3270_set_session_name(window,session); | ||
472 | + g_free(session); | ||
473 | + | ||
474 | + source = (pipe_source *) g_source_new(&pipe_source_funcs,sizeof(pipe_source)); | ||
475 | + | ||
476 | + source->hPipe = hPipe; | ||
477 | + source->state = PIPE_STATE_WAITING; | ||
478 | + source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); | ||
479 | + | ||
480 | + g_source_attach((GSource *) source,NULL); | ||
481 | + IO_accept(source); | ||
482 | + | ||
483 | + return 0; | ||
484 | + } | ||
485 | + | ||
486 | + } | ||
487 | + | ||
488 | + popup_lasterror( "%s", _( "Can´t create remote control pipe" )); | ||
489 | + | ||
490 | + return -1; | ||
491 | + } | ||
492 | + | ||
493 | + LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) | ||
494 | + { | ||
495 | + | ||
496 | + return 0; | ||
497 | + } | ||
498 | + | ||
499 | +/* | ||
500 | + static void cmd_connectps(QUERY *qry) | ||
501 | + { | ||
502 | + g_message("%s","HLLAPI ConnectPS request received"); | ||
503 | + request_status(qry,v3270_set_script(pw3270_get_terminal_widget(NULL),'H',TRUE)); | ||
504 | + } | ||
505 | + | ||
506 | + static void cmd_disconnectps(QUERY *qry) | ||
507 | + { | ||
508 | + g_message("%s","HLLAPI DisconnectPS request received"); | ||
509 | + request_status(qry,0); | ||
510 | + } | ||
511 | + | ||
512 | + static void cmd_getrevision(QUERY *qry) | ||
513 | + { | ||
514 | + request_complete(qry,0,lib3270_get_revision()); | ||
515 | + } | ||
516 | + | ||
517 | + static void cmd_setcursor(QUERY *qry) | ||
518 | + { | ||
519 | + int rc = ENOTCONN; | ||
520 | + | ||
521 | + if(lib3270_connected(qry->hSession)) | ||
522 | + { | ||
523 | + trace("%s: pos=%d row=%d col=%d",__FUNCTION__,rc,rc/80,rc%80); | ||
524 | + lib3270_set_cursor_address(qry->hSession,qry->pos -1); | ||
525 | + rc = 0; | ||
526 | + } | ||
527 | + | ||
528 | + request_status(qry,rc); | ||
529 | + } | ||
530 | + | ||
531 | + static void cmd_sendstring(QUERY *qry) | ||
532 | + { | ||
533 | + gchar * text; | ||
534 | + GError * error = NULL; | ||
535 | + gsize bytes_read; | ||
536 | + gsize bytes_written; | ||
537 | + const gchar * charset; | ||
538 | + | ||
539 | + if(!lib3270_connected(qry->hSession)) | ||
540 | + { | ||
541 | + request_status(qry,ENOTCONN); | ||
542 | + return; | ||
543 | + } | ||
544 | + | ||
545 | + g_get_charset(&charset); | ||
546 | + | ||
547 | + text = g_convert(qry->text,qry->length,lib3270_get_charset(qry->hSession),charset,&bytes_read,&bytes_written,&error); | ||
548 | + if(text) | ||
549 | + { | ||
550 | + int rc = 0; | ||
551 | + | ||
552 | + if(strchr(text,control_char)) | ||
553 | + { | ||
554 | + // Convert control char | ||
555 | + gchar * buffer = text; | ||
556 | + char * ptr; | ||
557 | + | ||
558 | + for(ptr = strchr(text,control_char);ptr;ptr = strchr(buffer,control_char)) | ||
559 | + { | ||
560 | + *(ptr++) = 0; | ||
561 | + | ||
562 | + lib3270_emulate_input(qry->hSession,buffer,-1,0); | ||
563 | + | ||
564 | + switch(*(ptr++)) | ||
565 | + { | ||
566 | + case 'P': // Print | ||
567 | + rc = pw3270_print(pw3270_get_terminal_widget(NULL), NULL, GTK_PRINT_OPERATION_ACTION_PRINT, PW3270_SRC_ALL); | ||
568 | + break; | ||
569 | + | ||
570 | + case 'E': // Enter | ||
571 | + lib3270_enter(qry->hSession); | ||
572 | + break; | ||
573 | + | ||
574 | + case 'F': // Erase EOF | ||
575 | + lib3270_eraseeof(qry->hSession); | ||
576 | + break; | ||
577 | + | ||
578 | + case '1': // PF1 | ||
579 | + lib3270_pfkey(qry->hSession,1); | ||
580 | + break; | ||
581 | + | ||
582 | + case '2': // PF2 | ||
583 | + lib3270_pfkey(qry->hSession,2); | ||
584 | + break; | ||
585 | + | ||
586 | + case '3': // PF3 | ||
587 | + lib3270_pfkey(qry->hSession,3); | ||
588 | + break; | ||
589 | + | ||
590 | + case '4': // PF4 | ||
591 | + lib3270_pfkey(qry->hSession,4); | ||
592 | + break; | ||
593 | + | ||
594 | + case '5': // PF5 | ||
595 | + lib3270_pfkey(qry->hSession,5); | ||
596 | + break; | ||
597 | + | ||
598 | + case '6': // PF6 | ||
599 | + lib3270_pfkey(qry->hSession,6); | ||
600 | + break; | ||
601 | + | ||
602 | + case '7': // PF7 | ||
603 | + lib3270_pfkey(qry->hSession,7); | ||
604 | + break; | ||
605 | + | ||
606 | + case '8': // PF8 | ||
607 | + lib3270_pfkey(qry->hSession,8); | ||
608 | + break; | ||
609 | + | ||
610 | + case '9': // PF9 | ||
611 | + lib3270_pfkey(qry->hSession,9); | ||
612 | + break; | ||
613 | + | ||
614 | + case 'a': // PF10 | ||
615 | + lib3270_pfkey(qry->hSession,10); | ||
616 | + break; | ||
617 | + | ||
618 | + case 'b': // PF11 | ||
619 | + lib3270_pfkey(qry->hSession,11); | ||
620 | + break; | ||
621 | + | ||
622 | + case 'c': // PF12 | ||
623 | + lib3270_pfkey(qry->hSession,12); | ||
624 | + break; | ||
625 | + } | ||
626 | + | ||
627 | + } | ||
628 | + | ||
629 | + lib3270_emulate_input(qry->hSession,buffer,-1,0); | ||
630 | + | ||
631 | + } | ||
632 | + else | ||
633 | + { | ||
634 | + lib3270_emulate_input(qry->hSession,text,strlen(text),0); | ||
635 | + } | ||
636 | + g_free(text); | ||
637 | + | ||
638 | + request_status(qry,rc); | ||
639 | + | ||
640 | + return; | ||
641 | + } | ||
642 | + | ||
643 | + request_complete(qry, error->code, error->message); | ||
644 | + g_error_free(error); | ||
645 | + | ||
646 | + } | ||
647 | + | ||
648 | + struct wait | ||
649 | + { | ||
650 | + QUERY * qry; | ||
651 | + time_t end; | ||
652 | + }; | ||
653 | + | ||
654 | + static gboolean do_wait(struct wait *w) | ||
655 | + { | ||
656 | + if(lib3270_get_program_message(w->qry->hSession) == LIB3270_MESSAGE_NONE) | ||
657 | + { | ||
658 | + request_status(w->qry,0); | ||
659 | + return FALSE; | ||
660 | + } | ||
661 | + | ||
662 | + if(time(0) > w->end) | ||
663 | + { | ||
664 | + trace("%s: TIMEOUT",__FUNCTION__); | ||
665 | + request_status(w->qry,ETIMEDOUT); | ||
666 | + return FALSE; | ||
667 | + } | ||
668 | + | ||
669 | + return TRUE; | ||
670 | + } | ||
671 | + | ||
672 | + static void cmd_wait(QUERY *qry) | ||
673 | + { | ||
674 | + struct wait *w; | ||
675 | + | ||
676 | + if(lib3270_get_program_message(qry->hSession) == LIB3270_MESSAGE_NONE) | ||
677 | + { | ||
678 | + request_status(qry,0); | ||
679 | + return; | ||
680 | + } | ||
681 | + | ||
682 | + w = g_malloc0(sizeof(struct wait)); | ||
683 | + w->qry = qry; | ||
684 | + w->end = time(0)+pw3270_get_integer(pw3270_get_toplevel(),"hllapi","wait",2); | ||
685 | + | ||
686 | + g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) 300, (GSourceFunc) do_wait, w, g_free); | ||
687 | + } | ||
688 | + | ||
689 | + static void cmd_copypstostr(QUERY *qry) | ||
690 | + { | ||
691 | + int rows; | ||
692 | + int cols; | ||
693 | + unsigned short * attr; | ||
694 | + unsigned char * text; | ||
695 | + int rc; | ||
696 | + unsigned char * buffer; | ||
697 | + size_t length; | ||
698 | + | ||
699 | + if(!lib3270_connected(qry->hSession)) | ||
700 | + { | ||
701 | + request_status(qry,ENOTCONN); | ||
702 | + return; | ||
703 | + } | ||
704 | + | ||
705 | + lib3270_get_screen_size(qry->hSession,&rows,&cols); | ||
706 | + | ||
707 | + if(qry->pos < 1 || (qry->pos+qry->length) >= (rows*cols)) | ||
708 | + { | ||
709 | + request_status(qry,EINVAL); | ||
710 | + return; | ||
711 | + } | ||
712 | + | ||
713 | + qry->pos--; | ||
714 | + | ||
715 | + length = (qry->length * sizeof(unsigned short)) + qry->length + 2; | ||
716 | + text = buffer = g_malloc0(length+1); | ||
717 | + attr = (unsigned short *) (text+qry->length+1); | ||
718 | + | ||
719 | + trace("%s: pos=%d length=%d",__FUNCTION__,qry->pos,qry->length); | ||
720 | + rc = lib3270_get_contents(qry->hSession,qry->pos,qry->pos+(qry->length-1),text,attr); | ||
721 | + | ||
722 | + if(rc) | ||
723 | + { | ||
724 | + request_status(qry,rc); | ||
725 | + } | ||
726 | + else | ||
727 | + { | ||
728 | + const gchar * charset; | ||
729 | + gchar * local; | ||
730 | + gsize bytes_read; | ||
731 | + gsize bytes_written; | ||
732 | + GError * error = NULL; | ||
733 | + | ||
734 | + trace("Text: [%s]",text); | ||
735 | + | ||
736 | + g_get_charset(&charset); | ||
737 | + | ||
738 | + local = g_convert((const gchar *) text,-1,charset,lib3270_get_charset(qry->hSession),&bytes_read,&bytes_written,&error); | ||
739 | + | ||
740 | + if(!local) | ||
741 | + { | ||
742 | + request_complete(qry,error->code,error->message); | ||
743 | + g_error_free(error); | ||
744 | + } | ||
745 | + else | ||
746 | + { | ||
747 | + strncpy((char *) text,(const char *) local,qry->length); | ||
748 | + | ||
749 | + trace("response: [%s] len=%d",buffer,length); | ||
750 | + request_buffer(qry,0,length,buffer); | ||
751 | + g_free(local); | ||
752 | + } | ||
753 | + } | ||
754 | + | ||
755 | + g_free(buffer); | ||
756 | + } | ||
757 | + | ||
758 | + static void cmd_querycursor(QUERY *qry) | ||
759 | + { | ||
760 | + request_value(qry,0,lib3270_get_cursor_address(qry->hSession)); | ||
761 | + } | ||
762 | + | ||
763 | + void enqueue_request(QUERY *qry) | ||
764 | + { | ||
765 | + static const struct _cmd | ||
766 | + { | ||
767 | + int cmd; | ||
768 | + void (*exec)(QUERY *qry); | ||
769 | + } cmd[] = | ||
770 | + { | ||
771 | + { HLLAPI_CMD_CONNECTPS, cmd_connectps }, // 1 | ||
772 | + { HLLAPI_CMD_DISCONNECTPS, cmd_disconnectps }, // 2 | ||
773 | + { HLLAPI_CMD_INPUTSTRING, cmd_sendstring }, // 3 | ||
774 | + { HLLAPI_CMD_WAIT, cmd_wait }, // 4 | ||
775 | +// { HLLAPI_CMD_COPYPS, }, // 5 | ||
776 | +// { HLLAPI_CMD_SEARCHPS, }, // 6 | ||
777 | + { HLLAPI_CMD_QUERYCURSOR, cmd_querycursor }, // 7 | ||
778 | + | ||
779 | + { HLLAPI_CMD_COPYPSTOSTR, cmd_copypstostr }, // 8 | ||
780 | + | ||
781 | +// { HLLAPI_CMD_COPYSTRTOPS }, // 15 | ||
782 | + | ||
783 | + { HLLAPI_CMD_SETCURSOR, cmd_setcursor }, // 40 | ||
784 | + | ||
785 | +// { HLLAPI_CMD_SENDFILE }, // 90 | ||
786 | +// { HLLAPI_CMD_RECEIVEFILE }, | ||
787 | + | ||
788 | + | ||
789 | + { HLLAPI_CMD_GETREVISION, cmd_getrevision }, | ||
790 | + }; | ||
791 | + | ||
792 | + | ||
793 | + | ||
794 | + int f; | ||
795 | + | ||
796 | + trace("HLLAPI function %d",(int) qry->cmd); | ||
797 | + | ||
798 | + qry->hSession = lib3270_get_default_session_handle(); | ||
799 | + | ||
800 | + for(f=0;f<G_N_ELEMENTS(cmd);f++) | ||
801 | + { | ||
802 | + if(cmd[f].cmd == qry->cmd) | ||
803 | + { | ||
804 | + cmd[f].exec(qry); | ||
805 | + return; | ||
806 | + } | ||
807 | + } | ||
808 | + | ||
809 | + g_warning("Unexpected HLLAPI function %d",(int) qry->cmd); | ||
810 | + request_status(qry,EINVAL); | ||
811 | + } | ||
812 | + | ||
813 | + G_GNUC_INTERNAL void set_active(gboolean on) | ||
814 | + { | ||
815 | + v3270_set_script(pw3270_get_terminal_widget(NULL),'H',on); | ||
816 | + } | ||
817 | + | ||
818 | +*/ |
@@ -0,0 +1,363 @@ | @@ -0,0 +1,363 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como calls.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + #include <lib3270.h> | ||
31 | + #include <malloc.h> | ||
32 | + #include <string.h> | ||
33 | + #include <errno.h> | ||
34 | + #include <stdio.h> | ||
35 | + #include <time.h> | ||
36 | + #include <lib3270/log.h> | ||
37 | + | ||
38 | + #include "client.h" | ||
39 | + #include "packets.h" | ||
40 | + | ||
41 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
42 | + | ||
43 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
44 | + | ||
45 | + void * hllapi_pipe_init(const char *id) | ||
46 | + { | ||
47 | + HANDLE hPipe = INVALID_HANDLE_VALUE; | ||
48 | + static DWORD dwMode = PIPE_READMODE_MESSAGE; | ||
49 | + char buffer[4096]; | ||
50 | + char * name = strdup(id); | ||
51 | + char * ptr; | ||
52 | + | ||
53 | + trace("%s(%s)",__FUNCTION__,id); | ||
54 | + | ||
55 | + for(ptr=name;*ptr;ptr++) | ||
56 | + { | ||
57 | + if(*ptr == ':') | ||
58 | + *ptr = '_'; | ||
59 | + } | ||
60 | + | ||
61 | + snprintf(buffer,4095,"\\\\.\\pipe\\%s",name); | ||
62 | + | ||
63 | + free(name); | ||
64 | + | ||
65 | + trace("Opening \"%s\"",buffer); | ||
66 | + | ||
67 | + if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) | ||
68 | + { | ||
69 | + trace("%s: Pipe not found",__FUNCTION__); | ||
70 | + errno = ENOENT; | ||
71 | + return NULL; | ||
72 | + } | ||
73 | + | ||
74 | + hPipe = CreateFile(buffer,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | ||
75 | + | ||
76 | + if(hPipe == INVALID_HANDLE_VALUE) | ||
77 | + { | ||
78 | + errno = GetLastError(); | ||
79 | + return NULL; | ||
80 | + } | ||
81 | + | ||
82 | + if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) | ||
83 | + { | ||
84 | + errno = GetLastError(); | ||
85 | + return NULL; | ||
86 | + } | ||
87 | + | ||
88 | + trace("hPipe=%p",(void *) hPipe); | ||
89 | + return hPipe; | ||
90 | + } | ||
91 | + | ||
92 | + void hllapi_pipe_deinit(void *h) | ||
93 | + { | ||
94 | + trace("%s(%p)",__FUNCTION__,h); | ||
95 | + | ||
96 | + if(!h) | ||
97 | + return; | ||
98 | + | ||
99 | + CloseHandle((HANDLE) h); | ||
100 | + } | ||
101 | + | ||
102 | + const char * hllapi_pipe_get_revision(void) | ||
103 | + { | ||
104 | + return PACKAGE_REVISION; | ||
105 | + } | ||
106 | + | ||
107 | + int hllapi_pipe_connect(void *h, const char *n, int wait) | ||
108 | + { | ||
109 | + struct hllapi_packet_connect * pkt; | ||
110 | + struct hllapi_packet_result response; | ||
111 | + DWORD cbSize; | ||
112 | + | ||
113 | + if(!n) | ||
114 | + n = ""; | ||
115 | + | ||
116 | + cbSize = sizeof(struct hllapi_packet_connect)+strlen(n); | ||
117 | + pkt = malloc(cbSize); | ||
118 | + | ||
119 | + pkt->packet_id = HLLAPI_PACKET_CONNECT; | ||
120 | + pkt->wait = (unsigned char) wait; | ||
121 | + strcpy(pkt->hostname,n); | ||
122 | + | ||
123 | + trace("Sending %s",pkt->hostname); | ||
124 | + | ||
125 | + if(!TransactNamedPipe((HANDLE) h,(LPVOID) pkt, cbSize, &response, sizeof(response), &cbSize,NULL)) | ||
126 | + { | ||
127 | + errno = GetLastError(); | ||
128 | + response.rc = -1; | ||
129 | + } | ||
130 | + | ||
131 | + free(pkt); | ||
132 | + | ||
133 | + return response.rc; | ||
134 | + } | ||
135 | + | ||
136 | + void hllapi_pipe_disconnect(void *h) | ||
137 | + { | ||
138 | + static const struct hllapi_packet_query query = { HLLAPI_PACKET_DISCONNECT }; | ||
139 | + struct hllapi_packet_result response; | ||
140 | + DWORD cbSize = sizeof(query); | ||
141 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
142 | + } | ||
143 | + | ||
144 | + LIB3270_MESSAGE hllapi_pipe_get_message(void *h) | ||
145 | + { | ||
146 | + static const struct hllapi_packet_query query = { HLLAPI_PACKET_GET_PROGRAM_MESSAGE }; | ||
147 | + struct hllapi_packet_result response; | ||
148 | + DWORD cbSize = sizeof(query); | ||
149 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
150 | + return (LIB3270_MESSAGE) response.rc; | ||
151 | + } | ||
152 | + | ||
153 | + char * hllapi_pipe_get_text_at(void *h, int row, int col, int len) | ||
154 | + { | ||
155 | + struct hllapi_packet_query_at query = { HLLAPI_PACKET_GET_TEXT_AT, }; | ||
156 | + struct hllapi_packet_text * response; | ||
157 | + DWORD cbSize = sizeof(struct hllapi_packet_text)+len; | ||
158 | + char * text = NULL; | ||
159 | + | ||
160 | + response = malloc(cbSize+2); | ||
161 | + memset(response,0,cbSize+2); | ||
162 | + | ||
163 | + if(!TransactNamedPipe((HANDLE) h,(LPVOID) &query, sizeof(struct hllapi_packet_query_at), &response, cbSize, &cbSize,NULL)) | ||
164 | + return NULL; | ||
165 | + | ||
166 | + if(response->packet_id) | ||
167 | + errno = response->packet_id; | ||
168 | + else | ||
169 | + text = strdup(response->text); | ||
170 | + | ||
171 | + free(response); | ||
172 | + return text; | ||
173 | + } | ||
174 | + | ||
175 | + int hllapi_pipe_enter(void *h) | ||
176 | + { | ||
177 | + static const struct hllapi_packet_query query = { HLLAPI_PACKET_ENTER }; | ||
178 | + struct hllapi_packet_result response; | ||
179 | + DWORD cbSize = sizeof(query); | ||
180 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
181 | + return response.rc; | ||
182 | + } | ||
183 | + | ||
184 | + int hllapi_pipe_erase_eof(void *h) | ||
185 | + { | ||
186 | + static const struct hllapi_packet_query query = { HLLAPI_PACKET_ERASE_EOF }; | ||
187 | + struct hllapi_packet_result response; | ||
188 | + DWORD cbSize = sizeof(query); | ||
189 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
190 | + return response.rc; | ||
191 | + } | ||
192 | + | ||
193 | + | ||
194 | + int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str) | ||
195 | + { | ||
196 | + struct hllapi_packet_text_at * query; | ||
197 | + struct hllapi_packet_result response; | ||
198 | + DWORD cbSize = sizeof(struct hllapi_packet_text_at)+strlen((const char *) str); | ||
199 | + | ||
200 | + query = malloc(cbSize); | ||
201 | + query->packet_id = HLLAPI_PACKET_SET_TEXT_AT; | ||
202 | + query->row = row; | ||
203 | + query->col = col; | ||
204 | + strcpy(query->text,(const char *) str); | ||
205 | + | ||
206 | + TransactNamedPipe((HANDLE) h,(LPVOID) query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
207 | + | ||
208 | + free(query); | ||
209 | + | ||
210 | + return response.rc; | ||
211 | + } | ||
212 | + | ||
213 | + int hllapi_pipe_cmp_text_at(void *h, int row, int col, const char *text) | ||
214 | + { | ||
215 | + struct hllapi_packet_text_at * query; | ||
216 | + struct hllapi_packet_result response; | ||
217 | + DWORD cbSize = sizeof(struct hllapi_packet_text_at)+strlen(text); | ||
218 | + | ||
219 | + query = malloc(cbSize); | ||
220 | + query->packet_id = HLLAPI_PACKET_CMP_TEXT_AT; | ||
221 | + query->row = row; | ||
222 | + query->col = col; | ||
223 | + strcpy(query->text,text); | ||
224 | + | ||
225 | + TransactNamedPipe((HANDLE) h,(LPVOID) query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
226 | + | ||
227 | + free(query); | ||
228 | + | ||
229 | + return response.rc; | ||
230 | + } | ||
231 | + | ||
232 | + int hllapi_pipe_pfkey(void *h, int key) | ||
233 | + { | ||
234 | + struct hllapi_packet_keycode query = { HLLAPI_PACKET_PFKEY, key }; | ||
235 | + struct hllapi_packet_result response; | ||
236 | + DWORD cbSize = sizeof(query); | ||
237 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
238 | + return response.rc; | ||
239 | + } | ||
240 | + | ||
241 | + int hllapi_pipe_pakey(void *h, int key) | ||
242 | + { | ||
243 | + struct hllapi_packet_keycode query = { HLLAPI_PACKET_PAKEY, key }; | ||
244 | + struct hllapi_packet_result response; | ||
245 | + DWORD cbSize = sizeof(query); | ||
246 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
247 | + return response.rc; | ||
248 | + } | ||
249 | + | ||
250 | + void hllapi_pipe_release_memory(void *p) | ||
251 | + { | ||
252 | + free(p); | ||
253 | + } | ||
254 | + | ||
255 | + int hllapi_pipe_wait_for_ready(void *h, int seconds) | ||
256 | + { | ||
257 | + time_t end = time(0)+seconds; | ||
258 | + | ||
259 | + while(time(0) < end) | ||
260 | + { | ||
261 | + if(!hllapi_pipe_is_connected(h)) | ||
262 | + return ENOTCONN; | ||
263 | + | ||
264 | + if(hllapi_pipe_get_message(h) == 0) | ||
265 | + return 0; | ||
266 | + Sleep(250); | ||
267 | + } | ||
268 | + | ||
269 | + return ETIMEDOUT; | ||
270 | + } | ||
271 | + | ||
272 | + int hllapi_pipe_is_connected(void *h) | ||
273 | + { | ||
274 | + static const struct hllapi_packet_query query = { HLLAPI_PACKET_IS_CONNECTED }; | ||
275 | + struct hllapi_packet_result response; | ||
276 | + DWORD cbSize = sizeof(query); | ||
277 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
278 | + return (LIB3270_MESSAGE) response.rc; | ||
279 | + } | ||
280 | + | ||
281 | + int hllapi_pipe_sleep(void *h, int seconds) | ||
282 | + { | ||
283 | + time_t end = time(0)+seconds; | ||
284 | + | ||
285 | + while(time(0) < end) | ||
286 | + { | ||
287 | + if(!hllapi_pipe_is_connected(h)) | ||
288 | + return ENOTCONN; | ||
289 | + Sleep(500); | ||
290 | + } | ||
291 | + | ||
292 | + return 0; | ||
293 | + } | ||
294 | + | ||
295 | + int hllapi_pipe_getcursor(void *h) | ||
296 | + { | ||
297 | + static const struct hllapi_packet_query query = { HLLAPI_PACKET_GET_CURSOR }; | ||
298 | + struct hllapi_packet_result response; | ||
299 | + DWORD cbSize = sizeof(query); | ||
300 | + | ||
301 | + trace("%s",__FUNCTION__); | ||
302 | + | ||
303 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
304 | + return (LIB3270_MESSAGE) response.rc; | ||
305 | + | ||
306 | + } | ||
307 | + | ||
308 | + int hllapi_pipe_setcursor(void *h, int baddr) | ||
309 | + { | ||
310 | + struct hllapi_packet_addr query = { HLLAPI_PACKET_SET_CURSOR, baddr }; | ||
311 | + struct hllapi_packet_result response; | ||
312 | + DWORD cbSize = sizeof(query); | ||
313 | + | ||
314 | + trace("%s(%d)",__FUNCTION__,query.addr); | ||
315 | + | ||
316 | + TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
317 | + return response.rc; | ||
318 | + } | ||
319 | + | ||
320 | + char * hllapi_pipe_get_text(void *h, int offset, int len) | ||
321 | + { | ||
322 | + struct hllapi_packet_query_offset query = { HLLAPI_PACKET_GET_TEXT_AT_OFFSET, offset, len }; | ||
323 | + struct hllapi_packet_text * response; | ||
324 | + DWORD cbSize = sizeof(struct hllapi_packet_text)+len; | ||
325 | + char * text = NULL; | ||
326 | + | ||
327 | + trace("cbSize=%d",(int) cbSize); | ||
328 | + | ||
329 | + response = malloc(cbSize+2); | ||
330 | + memset(response,0,cbSize+2); | ||
331 | + | ||
332 | + if(!TransactNamedPipe((HANDLE) h,(LPVOID) &query, sizeof(query), response, cbSize, &cbSize,NULL)) | ||
333 | + return NULL; | ||
334 | + | ||
335 | + trace("rc=%d",response->packet_id); | ||
336 | + | ||
337 | + if(response->packet_id) | ||
338 | + errno = response->packet_id; | ||
339 | + else | ||
340 | + text = strdup(response->text); | ||
341 | + | ||
342 | + free(response); | ||
343 | + return text; | ||
344 | + } | ||
345 | + | ||
346 | + int hllapi_pipe_emulate_input(void *h, const char *text, int len, int pasting) | ||
347 | + { | ||
348 | + struct hllapi_packet_emulate_input * query; | ||
349 | + struct hllapi_packet_result response; | ||
350 | + DWORD cbSize = sizeof(struct hllapi_packet_emulate_input)+strlen(text); | ||
351 | + | ||
352 | + query = malloc(cbSize); | ||
353 | + query->packet_id = HLLAPI_PACKET_EMULATE_INPUT; | ||
354 | + query->len = len; | ||
355 | + query->pasting = pasting; | ||
356 | + strcpy(query->text,text); | ||
357 | + | ||
358 | + TransactNamedPipe((HANDLE) h,(LPVOID) query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
359 | + | ||
360 | + free(query); | ||
361 | + | ||
362 | + return response.rc; | ||
363 | + } |
@@ -0,0 +1,85 @@ | @@ -0,0 +1,85 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como remotectl.h e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + * Agradecimento: | ||
29 | + * | ||
30 | + * Hélio Passos | ||
31 | + * | ||
32 | + */ | ||
33 | + | ||
34 | + #define ENABLE_NLS | ||
35 | + #define GETTEXT_PACKAGE PACKAGE_NAME | ||
36 | + | ||
37 | + #include <libintl.h> | ||
38 | + #include <glib/gi18n.h> | ||
39 | + #include <gtk/gtk.h> | ||
40 | + | ||
41 | + #include <lib3270.h> | ||
42 | + #include <lib3270/log.h> | ||
43 | + #include <pw3270/hllapi.h> | ||
44 | + | ||
45 | + typedef struct _remotequery | ||
46 | + { | ||
47 | +#ifdef WIN32 | ||
48 | + HANDLE hPipe; /**< Pipe handle (for response) */ | ||
49 | +#endif // WIN32 | ||
50 | + | ||
51 | + H3270 * hSession; /**< 3270 Session */ | ||
52 | + int cmd; /**< Command */ | ||
53 | + int rc; /**< Response status */ | ||
54 | + | ||
55 | + int pos; | ||
56 | + unsigned short length; /**< Query string length */ | ||
57 | + const gchar * text; /**< Query string */ | ||
58 | + | ||
59 | + } QUERY; | ||
60 | + | ||
61 | + G_GNUC_INTERNAL void set_active(gboolean on); | ||
62 | + G_GNUC_INTERNAL void enqueue_request(QUERY *qry); | ||
63 | + G_GNUC_INTERNAL void request_complete(QUERY *qry, int rc, const gchar *text); | ||
64 | + | ||
65 | + G_GNUC_INTERNAL void request_status(QUERY *qry, int rc); | ||
66 | + G_GNUC_INTERNAL void request_value(QUERY *qry, int rc, unsigned int value); | ||
67 | + G_GNUC_INTERNAL void request_buffer(QUERY *qry, int rc, size_t sz, const gpointer buffer); | ||
68 | + | ||
69 | +// int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc); | ||
70 | + | ||
71 | + | ||
72 | +#ifdef WIN32 | ||
73 | + | ||
74 | + #define PIPE_BUFFER_LENGTH 8192 | ||
75 | + | ||
76 | + void init_source_pipe(HANDLE hPipe); | ||
77 | + void popup_lasterror(const gchar *fmt, ...); | ||
78 | + | ||
79 | +#endif // WIN32 | ||
80 | + | ||
81 | + | ||
82 | + | ||
83 | + | ||
84 | + | ||
85 | + |
@@ -0,0 +1,51 @@ | @@ -0,0 +1,51 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como server.h e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + #include <lib3270/config.h> | ||
31 | + #define ENABLE_NLS | ||
32 | + #define GETTEXT_PACKAGE PACKAGE_NAME | ||
33 | + | ||
34 | + #include <libintl.h> | ||
35 | + #include <glib/gi18n.h> | ||
36 | + #include <gtk/gtk.h> | ||
37 | + | ||
38 | + #include <lib3270.h> | ||
39 | + #include <lib3270/log.h> | ||
40 | + #include <pw3270.h> | ||
41 | + #include <pw3270/hllapi.h> | ||
42 | + | ||
43 | + #include <windows.h> | ||
44 | + | ||
45 | + #define PIPE_BUFFER_LENGTH HLLAPI_MAXLENGTH+30 | ||
46 | + | ||
47 | + #define set_active(x) /* x */ | ||
48 | + | ||
49 | + | ||
50 | + G_GNUC_INTERNAL void popup_lasterror(const gchar *fmt, ...); | ||
51 | + |
@@ -0,0 +1,139 @@ | @@ -0,0 +1,139 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como testprogram.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * | ||
28 | + */ | ||
29 | + | ||
30 | + #include <windows.h> | ||
31 | + #include <stdio.h> | ||
32 | + #include <time.h> | ||
33 | + #include <pw3270/hllapi.h> | ||
34 | + | ||
35 | + #define BUFFER_LENGTH 8000 | ||
36 | + | ||
37 | +/*---[ Implement ]--------------------------------------------------------------------------------*/ | ||
38 | + | ||
39 | + int main(int numpar, char *param[]) | ||
40 | + { | ||
41 | + const char *session = "pw3270:a"; | ||
42 | + | ||
43 | + printf("init(%s)=%d\n",session,(int) hllapi_init((LPSTR) session)); | ||
44 | + printf("revision=%d\n",(int) hllapi_get_revision()); | ||
45 | + printf("connect=%d\n",(int) hllapi_connect("fandezhi.efglobe.com:23",0)); | ||
46 | + printf("wait=%d\n",(int) hllapi_wait(3)); | ||
47 | + printf("connected=%s\n",(int) hllapi_is_connected() ? "Yes" : "No"); | ||
48 | + | ||
49 | +// printf("disconnect=%d\n",(int) hllapi_disconnect("fandezhi.efglobe.com:23",1)); | ||
50 | + | ||
51 | + | ||
52 | + printf("deinit=%d\n",(int) hllapi_deinit()); | ||
53 | + | ||
54 | +/* | ||
55 | + DWORD revision; | ||
56 | + int rc; | ||
57 | + | ||
58 | + rc = hllapi_init(""); | ||
59 | + if(rc) | ||
60 | + { | ||
61 | + printf("Init exits with rc=%d\n",rc); | ||
62 | + return rc; | ||
63 | + } | ||
64 | + | ||
65 | + if(!hllapi_get_revision(&revision)) | ||
66 | + printf("Library revision is %d\n",(int) revision); | ||
67 | + | ||
68 | + | ||
69 | + printf("Deinit exits with rc=%d\n",rc); | ||
70 | + rc = hllapi_deinit(); | ||
71 | +*/ | ||
72 | + return 0; | ||
73 | + } | ||
74 | + | ||
75 | +/* | ||
76 | + int main(int numpar, char *param[]) | ||
77 | + { | ||
78 | + char buffer[BUFFER_LENGTH]; | ||
79 | + unsigned short rc; | ||
80 | + unsigned short len; | ||
81 | + unsigned long fn; | ||
82 | + | ||
83 | + static const struct _cmd | ||
84 | + { | ||
85 | + const char * name; | ||
86 | + unsigned short fn; | ||
87 | + const char * arg; | ||
88 | + } cmd[] = | ||
89 | + { | ||
90 | + { "GetRevision", HLLAPI_CMD_GETREVISION, " " }, | ||
91 | + { "ConnectPS", HLLAPI_CMD_CONNECTPS, "pw3270A" }, | ||
92 | + { "InputString", HLLAPI_CMD_INPUTSTRING, "test" }, | ||
93 | + | ||
94 | + }; | ||
95 | + | ||
96 | + int f; | ||
97 | + | ||
98 | + | ||
99 | + for(f=0;f< (sizeof(cmd)/sizeof(struct _cmd)); f++) | ||
100 | + { | ||
101 | + len = strlen(cmd[f].arg); | ||
102 | + memcpy(buffer,cmd[f].arg,len); | ||
103 | + hllapi((LPWORD) &cmd[f].fn,buffer,&len,&rc); | ||
104 | + printf("%s exits with rc=%d\n[%s]\n",cmd[f].name,rc,buffer); | ||
105 | + } | ||
106 | + | ||
107 | + len = 80; | ||
108 | + rc = 1040; | ||
109 | + fn = HLLAPI_CMD_COPYPSTOSTR; | ||
110 | + hllapi((LPWORD) &fn,buffer,&len,&rc); | ||
111 | + printf("%s exits with rc=%d\n%s\n","HLLAPI_CMD_COPYPSTOSTR",rc,buffer); | ||
112 | + | ||
113 | + // Performance | ||
114 | + len = strlen(cmd[0].arg); | ||
115 | + memcpy(buffer,cmd[0].arg,len); | ||
116 | + if(hllapi((LPWORD) &cmd[0].fn,buffer,&len,&rc) == 0 && rc == 0) | ||
117 | + { | ||
118 | + time_t end = time(0) + 5; | ||
119 | + int qtd = 0; | ||
120 | + do | ||
121 | + { | ||
122 | + qtd++; | ||
123 | + } while(hllapi((LPWORD) &cmd[0].fn,buffer,&len,&rc) == 0 && rc == 0 && time(0)<end); | ||
124 | + printf("%d interacoes em 5 segundos (rc=%d)\n",qtd,rc); | ||
125 | + | ||
126 | + } | ||
127 | + | ||
128 | + // Disconnect | ||
129 | + len = 10; | ||
130 | + rc = 1; | ||
131 | + fn = HLLAPI_CMD_DISCONNECTPS; | ||
132 | + *buffer = 0; | ||
133 | + hllapi((LPWORD) &fn,buffer,&len,&rc); | ||
134 | + printf("%s exits with rc=%d\n[%s]\n","HLLAPI_CMD_DISCONNECTPS",rc,buffer); | ||
135 | + | ||
136 | + | ||
137 | + return 0; | ||
138 | + } | ||
139 | +*/ |
src/plugins/remotectl/Makefile.in
@@ -1,152 +0,0 @@ | @@ -1,152 +0,0 @@ | ||
1 | -# | ||
2 | -# "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | -# (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | -# aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | -# | ||
6 | -# Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | -# | ||
8 | -# Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | -# os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | -# Free Software Foundation. | ||
11 | -# | ||
12 | -# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | -# GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | -# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | -# obter mais detalhes. | ||
16 | -# | ||
17 | -# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | -# programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | -# Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | -# | ||
21 | -# Contatos: | ||
22 | -# | ||
23 | -# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
24 | -# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | ||
25 | -# licinio@bb.com.br (Licínio Luis Branco) | ||
26 | -# kraucer@bb.com.br (Kraucer Fernandes Mazuco) | ||
27 | -# | ||
28 | - | ||
29 | -#---[ Sources ]---------------------------------------------------------------- | ||
30 | - | ||
31 | -MODULE_NAME=remotectl | ||
32 | -DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile | ||
33 | -PLUGIN_SRC=pluginmain.c | ||
34 | -HLLAPI_SRC=hllapi.c calls.c remote.c | ||
35 | - | ||
36 | -#---[ Paths ]------------------------------------------------------------------ | ||
37 | - | ||
38 | -ROOTDIR ?= . | ||
39 | -OBJDIR ?= $(ROOTDIR)/.obj | ||
40 | -BINDIR ?= $(ROOTDIR)/.bin | ||
41 | -BINDBG ?= $(BINDIR)/Debug | ||
42 | -BINRLS ?= $(BINDIR)/Release | ||
43 | - | ||
44 | -OBJDBG = $(OBJDIR)/Debug | ||
45 | -OBJRLS = $(OBJDIR)/Release | ||
46 | -OBJEXT = o | ||
47 | - | ||
48 | -#---[ Tools ]------------------------------------------------------------------ | ||
49 | - | ||
50 | -MKDIR=@MKDIR_P@ | ||
51 | -CC=@CC@ | ||
52 | -LD=@CC@ | ||
53 | -MSGCAT=@MSGCAT@ | ||
54 | -XGETTEXT=@XGETTEXT@ | ||
55 | - | ||
56 | -#---[ Rules ]------------------------------------------------------------------ | ||
57 | - | ||
58 | -DLL_FLAGS=@DLL_FLAGS@ | ||
59 | -DEBUG_CFLAGS=-DDEBUG=1 -g -Wall | ||
60 | - | ||
61 | -LIB3270_MODE ?= Default | ||
62 | - | ||
63 | -ifeq ($(LIB3270_MODE),Debug) | ||
64 | - PW3270_LIBS=-L../../../.bin/Debug@DLLDIR@ -lpw3270 -l3270 | ||
65 | - PW3270_CFLAGS=-I../../../src/include | ||
66 | - LIB3270_LIBS=-L../../../.bin/Debug@DLLDIR@ -l3270 | ||
67 | - LIB3270_CFLAGS=-I../../../src/include | ||
68 | -endif | ||
69 | - | ||
70 | -ifeq ($(LIB3270_MODE),Release) | ||
71 | - PW3270_LIBS=-L../../../.bin/Release@DLLDIR@ -lpw3270 -l3270 | ||
72 | - PW3270_CFLAGS=-I../../../src/include | ||
73 | - LIB3270_LIBS=-L../../../.bin/Release@DLLDIR@ -l3270 | ||
74 | - LIB3270_CFLAGS=-I../../../src/include | ||
75 | -endif | ||
76 | - | ||
77 | -ifeq ($(LIB3270_MODE),Default) | ||
78 | - LIB3270_LIBS ?= `pkg-config --libs lib3270` | ||
79 | - LIB3270_CFLAGS ?= `pkg-config --cflags lib3270` | ||
80 | - PW3270_LIBS ?= `pkg-config --libs pw3270 lib3270` | ||
81 | - PW3270_CFLAGS ?= `pkg-config --cflags pw3270 lib3270` | ||
82 | -endif | ||
83 | - | ||
84 | - | ||
85 | -GTK_CFLAGS ?= @GTK_CFLAGS@ @GTKMAC_CFLAGS@ | ||
86 | -GTK_LIBS ?= @GTK_LIBS@ @GTKMAC_LIBS@ | ||
87 | - | ||
88 | -$(OBJDBG)/%.o: %.c $(DEPENDS) | ||
89 | - @echo " CC `basename $@`" | ||
90 | - @$(MKDIR) `dirname $@` | ||
91 | - @$(CC) $(CFLAGS) $(DEBUG_CFLAGS) $(LIB3270_CFLAGS) $(GTK_CFLAGS) -o $@ -c $< | ||
92 | - | ||
93 | -$(OBJRLS)/%.o: %.c $(DEPENDS) | ||
94 | - @echo " CC `basename $@`" | ||
95 | - @$(MKDIR) `dirname $@` | ||
96 | - @$(CC) $(CFLAGS) $(LIB3270_CFLAGS) $(GTK_CFLAGS) -o $@ -c $< | ||
97 | - | ||
98 | - | ||
99 | -#---[ Release targets ]-------------------------------------------------------- | ||
100 | - | ||
101 | -Release: $(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@ $(BINRLS)/libhllapi@DLLEXT@ | ||
102 | - | ||
103 | -$(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) | ||
104 | - @echo " CCLD `basename $@`" | ||
105 | - @$(MKDIR) `dirname $@` | ||
106 | - @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) -o $@ $^ $(LIBS) $(PW3270_LIBS) $(GTK_LIBS) | ||
107 | - | ||
108 | -$(BINRLS)/libhllapi@DLLEXT@: $(foreach SRC, $(basename $(HLLAPI_SRC)), $(OBJRLS)/$(SRC).o) | ||
109 | - @echo " CCLD `basename $@`" | ||
110 | - @$(MKDIR) `dirname $@` | ||
111 | - @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @LDLIBFLAGS@ -o $@ $^ $(LIBS) | ||
112 | - | ||
113 | -#---[ Debug targets ]---------------------------------------------------------- | ||
114 | - | ||
115 | -Debug: $(BINDBG)/plugins/$(MODULE_NAME)@DLLEXT@ $(BINDBG)/libhllapi@DLLEXT@ | ||
116 | - | ||
117 | -$(BINDBG)/plugins/$(MODULE_NAME)@DLLEXT@: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) | ||
118 | - @echo " CCLD `basename $@`" | ||
119 | - @$(MKDIR) `dirname $@` | ||
120 | - @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) -o $@ $^ $(LIBS) $(PW3270_LIBS) $(GTK_LIBS) | ||
121 | - | ||
122 | -$(BINDBG)/libhllapi@DLLEXT@: $(foreach SRC, $(basename $(HLLAPI_SRC)), $(OBJDBG)/$(SRC).o) | ||
123 | - @echo " CCLD `basename $@`" | ||
124 | - @$(MKDIR) `dirname $@` | ||
125 | - @$(LD) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @LDLIBFLAGS@ -o $@ $^ $(LIBS) | ||
126 | - | ||
127 | -#---[ Misc targets ]----------------------------------------------------------- | ||
128 | - | ||
129 | -$(BINDBG)/testprogram@EXEEXT@: testprogram.c $(BINDBG)/libhllapi@DLLEXT@ | ||
130 | - @echo " CCLD `basename $@`" | ||
131 | - @$(MKDIR) `dirname $@` | ||
132 | - @$(CC) $(CFLAGS) $(PW3270_CFLAGS) -L$(BINDBG) $(DEBUG_CFLAGS) -lhllapi -o $@ testprogram.c | ||
133 | - | ||
134 | -test: $(BINDBG)/testprogram@EXEEXT@ | ||
135 | - | ||
136 | -run: $(BINDBG)/testprogram@EXEEXT@ | ||
137 | - @cd $(BINDBG) ; ./testprogram@EXEEXT@ | ||
138 | - | ||
139 | -install: $(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@ | ||
140 | - @$(MKDIR) $(DESTDIR)$(libdir)/$(PACKAGE_NAME)-plugins | ||
141 | - @$(INSTALL_PROGRAM) $(BINRLS)/plugins/$(MODULE_NAME)@DLLEXT@ $(DESTDIR)$(libdir)/$(PACKAGE_NAME)-plugins | ||
142 | - | ||
143 | -$(DEBDIR)/$(MODULE_NAME).install: Makefile | ||
144 | - @$(MKDIR) `dirname $@` | ||
145 | - @rm -f $@ | ||
146 | - @echo $(libdir)/$(PACKAGE_NAME)-plugins/$(MODULE_NAME)@DLLEXT@ > $@ | ||
147 | - | ||
148 | -clean: | ||
149 | - @rm -fr $(OBJDIR) | ||
150 | - @rm -fr $(BINDIR) | ||
151 | - @rm -f testprogram@EXEEXT@ | ||
152 | - @find . -name "*~" -exec rm -f {} \; |
src/plugins/remotectl/calls.c
@@ -1,436 +0,0 @@ | @@ -1,436 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como calls.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - #include <windows.h> | ||
31 | - #include <lib3270.h> | ||
32 | - #include <malloc.h> | ||
33 | - #include <string.h> | ||
34 | - #include <errno.h> | ||
35 | - #include <pw3270/hllapi.h> | ||
36 | - #include <stdio.h> | ||
37 | - #include <lib3270/log.h> | ||
38 | - #include "client.h" | ||
39 | - | ||
40 | - #undef trace | ||
41 | - #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } } | ||
42 | - | ||
43 | -/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
44 | - | ||
45 | - HMODULE hModule = NULL; | ||
46 | - void * hSession = NULL; | ||
47 | - | ||
48 | - static void * (*session_new)(const char *model) = NULL; | ||
49 | - static void (*session_free)(void *h) = NULL; | ||
50 | - static const char * (*get_revision)(void) = NULL; | ||
51 | - static int (*host_connect)(void *h,const char *n, int wait) = NULL; | ||
52 | - static int (*host_is_connected)(void *h) = NULL; | ||
53 | - static int (*wait_for_ready)(void *h, int seconds) = NULL; | ||
54 | - static void (*host_disconnect)(void *h) = NULL; | ||
55 | - static int (*script_sleep)(void *h, int seconds) = NULL; | ||
56 | - static LIB3270_MESSAGE (*get_message)(void *h) = NULL; | ||
57 | - static char * (*get_text)(void *h, int row, int col, int len) = NULL; | ||
58 | - static char * (*get_text_at_offset)(void *h, int offset, int len) = NULL; | ||
59 | - | ||
60 | - static void * (*release_memory)(void *p) = NULL; | ||
61 | - static int (*action_enter)(void *h) = NULL; | ||
62 | - static int (*set_text_at)(void *h, int row, int col, const unsigned char *str) = NULL; | ||
63 | - static int (*cmp_text_at)(void *h, int row, int col, const char *text) = NULL; | ||
64 | - static int (*pfkey)(void *hSession, int key) = NULL; | ||
65 | - static int (*pakey)(void *hSession, int key) = NULL; | ||
66 | - static int (*getcursor)(void *hSession) = NULL; | ||
67 | - static int (*setcursor)(void *hSession, int baddr) = NULL; | ||
68 | - | ||
69 | - static const struct _entry_point | ||
70 | - { | ||
71 | - void **call; | ||
72 | - void * pipe; | ||
73 | - const char * name; | ||
74 | - } entry_point[] = | ||
75 | - { | ||
76 | - { (void **) &session_new, (void *) hllapi_pipe_init, "lib3270_session_new" }, | ||
77 | - { (void **) &session_free, (void *) hllapi_pipe_deinit, "lib3270_session_free" }, | ||
78 | - { (void **) &get_revision, (void *) hllapi_pipe_get_revision, "lib3270_get_revision" }, | ||
79 | - { (void **) &host_connect, (void *) hllapi_pipe_connect, "lib3270_connect" }, | ||
80 | - { (void **) &host_disconnect, (void *) hllapi_pipe_disconnect, "lib3270_disconnect" }, | ||
81 | - { (void **) &host_is_connected, (void *) hllapi_pipe_is_connected, "lib3270_in_tn3270e" }, | ||
82 | - { (void **) &wait_for_ready, (void *) hllapi_pipe_wait_for_ready, "lib3270_wait_for_ready" }, | ||
83 | - { (void **) &script_sleep, (void *) hllapi_pipe_sleep, "lib3270_wait" }, | ||
84 | - { (void **) &get_message, (void *) hllapi_pipe_get_message, "lib3270_get_program_message" }, | ||
85 | - { (void **) &get_text, (void *) hllapi_pipe_get_text_at, "lib3270_get_text_at" }, | ||
86 | - { (void **) &release_memory, (void *) hllapi_pipe_release_memory, "lib3270_free" }, | ||
87 | - { (void **) &action_enter, (void *) hllapi_pipe_enter, "lib3270_enter" }, | ||
88 | - { (void **) &set_text_at, (void *) hllapi_pipe_set_text_at, "lib3270_set_string_at" }, | ||
89 | - { (void **) &cmp_text_at, (void *) hllapi_pipe_cmp_text_at, "lib3270_cmp_text_at" }, | ||
90 | - { (void **) &pfkey, (void *) hllapi_pipe_pfkey, "lib3270_pfkey" }, | ||
91 | - { (void **) &pakey, (void *) hllapi_pipe_pakey, "lib3270_pakey" }, | ||
92 | - { (void **) &setcursor, (void *) hllapi_pipe_setcursor, "lib3270_set_cursor_address" }, | ||
93 | - { (void **) &getcursor, (void *) hllapi_pipe_getcursor, "lib3270_get_cursor_address" }, | ||
94 | - { (void **) &get_text_at_offset, (void *) hllapi_pipe_get_text, "lib3270_get_text" }, | ||
95 | - { NULL, NULL } | ||
96 | - }; | ||
97 | - | ||
98 | -// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx | ||
99 | -#ifndef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
100 | - #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000 | ||
101 | -#endif // LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
102 | - | ||
103 | -#ifndef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
104 | - #define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100 | ||
105 | -#endif // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
106 | - | ||
107 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
108 | - | ||
109 | - __declspec (dllexport) DWORD __stdcall hllapi_init(LPSTR mode) | ||
110 | - { | ||
111 | - if(!mode) | ||
112 | - return EINVAL; | ||
113 | - | ||
114 | - trace("%s(%s)",__FUNCTION__,(char *) mode); | ||
115 | - | ||
116 | - if(mode && *mode) | ||
117 | - { | ||
118 | - // Get pointers to the pipe based calls | ||
119 | - int f; | ||
120 | - | ||
121 | - trace("%s: Loading pipe based calls",__FUNCTION__); | ||
122 | - for(f=0;entry_point[f].name;f++) | ||
123 | - *entry_point[f].call = entry_point[f].pipe; | ||
124 | - | ||
125 | - } | ||
126 | - else | ||
127 | - { | ||
128 | - // Direct mode, load lib3270.dll, get pointers to the calls | ||
129 | - static const char *dllname = "lib3270.dll." PACKAGE_VERSION; | ||
130 | - | ||
131 | - int f; | ||
132 | - HMODULE kernel; | ||
133 | - HANDLE cookie = NULL; | ||
134 | - DWORD rc; | ||
135 | - HANDLE (*AddDllDirectory)(PCWSTR NewDirectory); | ||
136 | - BOOL (*RemoveDllDirectory)(HANDLE Cookie); | ||
137 | - UINT errorMode; | ||
138 | - char datadir[4096]; | ||
139 | - | ||
140 | - trace("hModule=%p",hModule); | ||
141 | - if(hModule) | ||
142 | - return EBUSY; | ||
143 | - | ||
144 | - kernel = LoadLibrary("kernel32.dll"); | ||
145 | - AddDllDirectory = (HANDLE (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); | ||
146 | - RemoveDllDirectory = (BOOL (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); | ||
147 | - | ||
148 | - // Notify user in case of error loading protocol DLL | ||
149 | - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx | ||
150 | - errorMode = SetErrorMode(1); | ||
151 | - | ||
152 | - memset(datadir,' ',4095); | ||
153 | - datadir[4095] = 0; | ||
154 | - | ||
155 | - if(hllapi_get_datadir(datadir)) | ||
156 | - { | ||
157 | - char buffer[4096]; | ||
158 | - wchar_t path[4096]; | ||
159 | - | ||
160 | - mbstowcs(path, datadir, 4095); | ||
161 | - trace("Datadir=[%s] AddDllDirectory=%p RemoveDllDirectory=%p\n",datadir,AddDllDirectory,RemoveDllDirectory); | ||
162 | - if(AddDllDirectory) | ||
163 | - cookie = AddDllDirectory(path); | ||
164 | - | ||
165 | -#ifdef DEBUG | ||
166 | - snprintf(buffer,4096,"%s\\.bin\\Debug\\%s",datadir,dllname); | ||
167 | -#else | ||
168 | - snprintf(buffer,4096,"%s\\%s",datadir,dllname); | ||
169 | -#endif // DEBUG | ||
170 | - | ||
171 | - hModule = LoadLibrary(buffer); | ||
172 | - | ||
173 | - trace("%s hModule=%p rc=%d",buffer,hModule,(int) GetLastError()); | ||
174 | - | ||
175 | - if(hModule == NULL) | ||
176 | - { | ||
177 | - // Enable DLL error popup and try again with full path | ||
178 | - SetErrorMode(0); | ||
179 | - hModule = LoadLibraryEx(buffer,NULL,LOAD_LIBRARY_SEARCH_DEFAULT_DIRS|LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); | ||
180 | - } | ||
181 | - | ||
182 | - rc = GetLastError(); | ||
183 | - | ||
184 | - trace("%s hModule=%p rc=%d",buffer,hModule,(int) rc); | ||
185 | - } | ||
186 | - else | ||
187 | - { | ||
188 | - hModule = LoadLibrary(dllname); | ||
189 | - rc = GetLastError(); | ||
190 | - } | ||
191 | - | ||
192 | - SetErrorMode(errorMode); | ||
193 | - | ||
194 | - trace("%s hModule=%p rc=%d",dllname,hModule,(int) rc); | ||
195 | - | ||
196 | - if(cookie && RemoveDllDirectory) | ||
197 | - RemoveDllDirectory(cookie); | ||
198 | - | ||
199 | - if(kernel) | ||
200 | - FreeLibrary(kernel); | ||
201 | - | ||
202 | - if(!hModule) | ||
203 | - return rc; | ||
204 | - | ||
205 | - // Get library entry pointers | ||
206 | - for(f=0;entry_point[f].name;f++) | ||
207 | - { | ||
208 | - void *ptr = (void *) GetProcAddress(hModule,entry_point[f].name); | ||
209 | - | ||
210 | - trace("%d %s=%p\n",f,entry_point[f].name,ptr); | ||
211 | - | ||
212 | - if(!ptr) | ||
213 | - { | ||
214 | - fprintf(stderr,"Can´t load \"%s\"\n",entry_point[f].name); | ||
215 | - hllapi_deinit(); | ||
216 | - return ENOENT; | ||
217 | - } | ||
218 | - *entry_point[f].call = ptr; | ||
219 | - } | ||
220 | - | ||
221 | - } | ||
222 | - // Get session handle | ||
223 | - hSession = session_new((const char *) mode); | ||
224 | - trace("%s ok hSession=%p\n",__FUNCTION__,hSession); | ||
225 | - | ||
226 | - return hSession ? 0 : -1; | ||
227 | - } | ||
228 | - | ||
229 | - __declspec (dllexport) DWORD __stdcall hllapi_deinit(void) | ||
230 | - { | ||
231 | - int f; | ||
232 | - | ||
233 | - // Release session | ||
234 | - if(hSession && session_free) | ||
235 | - session_free(hSession); | ||
236 | - | ||
237 | - for(f=0;entry_point[f].name;f++) | ||
238 | - *entry_point[f].call = NULL; | ||
239 | - | ||
240 | - if(hModule != NULL) | ||
241 | - { | ||
242 | - FreeLibrary(hModule); | ||
243 | - hModule = NULL; | ||
244 | - } | ||
245 | - | ||
246 | - return 0; | ||
247 | - } | ||
248 | - | ||
249 | - __declspec (dllexport) DWORD __stdcall hllapi_get_revision(void) | ||
250 | - { | ||
251 | - if(!get_revision) | ||
252 | - return 0; | ||
253 | - return (DWORD) atoi(get_revision()); | ||
254 | - } | ||
255 | - | ||
256 | - __declspec (dllexport) DWORD __stdcall hllapi_connect(LPSTR uri, WORD wait) | ||
257 | - { | ||
258 | - if(!(host_connect && hSession && uri)) | ||
259 | - return EINVAL; | ||
260 | - | ||
261 | - return host_connect(hSession,uri,wait); | ||
262 | - } | ||
263 | - | ||
264 | - __declspec (dllexport) DWORD __stdcall hllapi_is_connected(void) | ||
265 | - { | ||
266 | - if(!(host_is_connected && hSession)) | ||
267 | - return EINVAL; | ||
268 | - | ||
269 | - return host_is_connected(hSession); | ||
270 | - } | ||
271 | - | ||
272 | - __declspec (dllexport) DWORD __stdcall hllapi_disconnect(void) | ||
273 | - { | ||
274 | - if(!(host_disconnect && hSession)) | ||
275 | - return EINVAL; | ||
276 | - | ||
277 | - host_disconnect(hSession); | ||
278 | - | ||
279 | - return 0; | ||
280 | - } | ||
281 | - | ||
282 | - __declspec (dllexport) DWORD __stdcall hllapi_wait_for_ready(WORD seconds) | ||
283 | - { | ||
284 | - if(!(wait_for_ready && hSession)) | ||
285 | - return EINVAL; | ||
286 | - | ||
287 | - trace("%s seconds=%d\n", __FUNCTION__, (int) seconds); | ||
288 | - | ||
289 | - return (DWORD) wait_for_ready(hSession,(int) seconds); | ||
290 | - } | ||
291 | - | ||
292 | - __declspec (dllexport) DWORD __stdcall hllapi_wait(WORD seconds) | ||
293 | - { | ||
294 | - if(!(script_sleep && hSession)) | ||
295 | - return EINVAL; | ||
296 | - | ||
297 | - return (DWORD) script_sleep(hSession,(int) seconds); | ||
298 | - } | ||
299 | - | ||
300 | - __declspec (dllexport) DWORD __stdcall hllapi_get_message_id(void) | ||
301 | - { | ||
302 | - if(!(get_message && hSession)) | ||
303 | - return EINVAL; | ||
304 | - return (DWORD) get_message(hSession); | ||
305 | - } | ||
306 | - | ||
307 | - __declspec (dllexport) DWORD __stdcall hllapi_get_screen_at(WORD row, WORD col, LPSTR buffer) | ||
308 | - { | ||
309 | - char * text; | ||
310 | - int len; | ||
311 | - | ||
312 | - if(!(get_text && release_memory && hSession)) | ||
313 | - return EINVAL; | ||
314 | - | ||
315 | - trace("%s row=%d col=%d buffer=%p",__FUNCTION__,row,col,buffer); | ||
316 | - len = strlen(buffer); | ||
317 | - | ||
318 | - trace(" len=%d",len); | ||
319 | - | ||
320 | - text = get_text(hSession,row,col,len); | ||
321 | - | ||
322 | - trace(" text=%p errno=%d %s\n",text,errno,strerror(errno)); | ||
323 | - | ||
324 | - if(!text) | ||
325 | - return EINVAL; | ||
326 | - | ||
327 | - strncpy(buffer,text,len); | ||
328 | - release_memory(text); | ||
329 | - | ||
330 | - trace("text:\n%s\n",buffer); | ||
331 | - | ||
332 | - return 0; | ||
333 | - } | ||
334 | - | ||
335 | - __declspec (dllexport) DWORD __stdcall hllapi_enter(void) | ||
336 | - { | ||
337 | - if(!(action_enter && hSession)) | ||
338 | - return EINVAL; | ||
339 | - | ||
340 | - return (DWORD) action_enter(hSession); | ||
341 | - } | ||
342 | - | ||
343 | - __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text) | ||
344 | - { | ||
345 | - if(!(set_text_at && hSession)) | ||
346 | - return EINVAL; | ||
347 | - | ||
348 | - return (DWORD) set_text_at(hSession,row,col,(const unsigned char *) text); | ||
349 | - } | ||
350 | - | ||
351 | - __declspec (dllexport) DWORD __stdcall hllapi_cmp_text_at(WORD row, WORD col, LPSTR text) | ||
352 | - { | ||
353 | - if(!(cmp_text_at && hSession)) | ||
354 | - return EINVAL; | ||
355 | - | ||
356 | - return (DWORD) cmp_text_at(hSession,row,col,(const char *) text); | ||
357 | - } | ||
358 | - | ||
359 | - __declspec (dllexport) DWORD __stdcall hllapi_pfkey(WORD key) | ||
360 | - { | ||
361 | - if(!(pfkey && hSession)) | ||
362 | - return EINVAL; | ||
363 | - | ||
364 | - return (DWORD) pfkey(hSession,key); | ||
365 | - } | ||
366 | - | ||
367 | - __declspec (dllexport) DWORD __stdcall hllapi_pakey(WORD key) | ||
368 | - { | ||
369 | - if(!(pfkey && hSession)) | ||
370 | - return EINVAL; | ||
371 | - | ||
372 | - return (DWORD) pakey(hSession,key); | ||
373 | - } | ||
374 | - | ||
375 | - __declspec (dllexport) DWORD __stdcall hllapi_get_datadir(LPSTR datadir) | ||
376 | - { | ||
377 | - HKEY hKey = 0; | ||
378 | - unsigned long datalen = strlen(datadir); | ||
379 | - | ||
380 | - *datadir = 0; | ||
381 | - | ||
382 | - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | ||
383 | - { | ||
384 | - unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | ||
385 | - if(RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) datadir,&datalen) != ERROR_SUCCESS) | ||
386 | - *datadir = 0; | ||
387 | - RegCloseKey(hKey); | ||
388 | - } | ||
389 | - | ||
390 | - return *datadir; | ||
391 | - } | ||
392 | - | ||
393 | - __declspec (dllexport) DWORD __stdcall hllapi_setcursor(WORD pos) | ||
394 | - { | ||
395 | - if(!(setcursor && hSession)) | ||
396 | - return EINVAL; | ||
397 | - trace("%s(%d)",__FUNCTION__,pos); | ||
398 | - return setcursor(hSession,pos-1); | ||
399 | - } | ||
400 | - | ||
401 | - __declspec (dllexport) DWORD __stdcall hllapi_getcursor() | ||
402 | - { | ||
403 | - if(!(getcursor && hSession)) | ||
404 | - return -EINVAL; | ||
405 | - return getcursor(hSession)+1; | ||
406 | - } | ||
407 | - | ||
408 | - __declspec (dllexport) DWORD __stdcall hllapi_get_screen(WORD pos, LPSTR buffer, WORD len) | ||
409 | - { | ||
410 | - char *text; | ||
411 | - | ||
412 | - trace("%s(%d,%d)",__FUNCTION__,pos,len); | ||
413 | - | ||
414 | - if(len < 0) | ||
415 | - len = strlen(buffer); | ||
416 | - | ||
417 | - if(!(get_text_at_offset && hSession)) | ||
418 | - return EINVAL; | ||
419 | - | ||
420 | - if(len > strlen(buffer)) | ||
421 | - len = strlen(buffer); | ||
422 | - | ||
423 | - trace("len=%d",len); | ||
424 | - text = get_text_at_offset(hSession,pos-1,len); | ||
425 | - | ||
426 | - trace("text=\n%s\n",text); | ||
427 | - | ||
428 | - if(!text) | ||
429 | - return -1; | ||
430 | - | ||
431 | - memcpy(buffer,text,len); | ||
432 | - | ||
433 | - release_memory(text); | ||
434 | - | ||
435 | - return 0; | ||
436 | - } |
src/plugins/remotectl/client.h
@@ -1,61 +0,0 @@ | @@ -1,61 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como private.h e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - #include <windows.h> | ||
31 | - #include <pw3270/hllapi.h> | ||
32 | - | ||
33 | - #ifndef ETIMEDOUT | ||
34 | - #define ETIMEDOUT 1238 | ||
35 | - #endif // ETIMEDOUT | ||
36 | - | ||
37 | - #define PIPE_BUFFER_LENGTH 8192 | ||
38 | - | ||
39 | - #define set_active(x) /* x */ | ||
40 | - | ||
41 | - void * hllapi_pipe_init(const char *id); | ||
42 | - void hllapi_pipe_deinit(void *h); | ||
43 | - const char * hllapi_pipe_get_revision(void); | ||
44 | - void hllapi_pipe_release_memory(void *p); | ||
45 | - int hllapi_pipe_connect(void *h, const char *n, int wait); | ||
46 | - void hllapi_pipe_disconnect(void *h); | ||
47 | - LIB3270_MESSAGE hllapi_pipe_get_message(void *h); | ||
48 | - char * hllapi_pipe_get_text_at(void *h, int row, int col, int len); | ||
49 | - char * hllapi_pipe_get_text(void *h, int offset, int len); | ||
50 | - int hllapi_pipe_enter(void *h); | ||
51 | - int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str); | ||
52 | - int hllapi_pipe_cmp_text_at(void *h, int row, int col, const char *text); | ||
53 | - int hllapi_pipe_pfkey(void *h, int key); | ||
54 | - int hllapi_pipe_pakey(void *h, int key); | ||
55 | - int hllapi_pipe_wait_for_ready(void *h, int seconds); | ||
56 | - int hllapi_pipe_sleep(void *h, int seconds); | ||
57 | - int hllapi_pipe_is_connected(void *h); | ||
58 | - int hllapi_pipe_getcursor(void *h); | ||
59 | - int hllapi_pipe_setcursor(void *h, int baddr); | ||
60 | - | ||
61 | - |
src/plugins/remotectl/hllapi.c
@@ -1,354 +0,0 @@ | @@ -1,354 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como hllapi.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - #include <lib3270.h> | ||
31 | - #include <malloc.h> | ||
32 | - #include <string.h> | ||
33 | - #include <errno.h> | ||
34 | - #include <pw3270/hllapi.h> | ||
35 | - #include <stdio.h> | ||
36 | - #include <lib3270/log.h> | ||
37 | - | ||
38 | - #undef trace | ||
39 | - #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } } | ||
40 | - | ||
41 | -/*--[ Prototipes ]-----------------------------------------------------------------------------------*/ | ||
42 | - | ||
43 | - static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc); | ||
44 | - static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc); | ||
45 | - static int get_library_revision(char *buffer, unsigned short *length, unsigned short *rc); | ||
46 | - static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc); | ||
47 | - | ||
48 | - static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); | ||
49 | - static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); | ||
50 | - | ||
51 | -/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
52 | - | ||
53 | - static const struct _hllapi_call | ||
54 | - { | ||
55 | - unsigned long func; | ||
56 | - int (*exec)(char *buffer, unsigned short *length, unsigned short *rc); | ||
57 | - } hllapi_call[] = | ||
58 | - { | ||
59 | - { HLLAPI_CMD_CONNECTPS, connect_ps }, | ||
60 | - { HLLAPI_CMD_DISCONNECTPS, disconnect_ps }, | ||
61 | - { HLLAPI_CMD_GETREVISION, get_library_revision }, | ||
62 | - { HLLAPI_CMD_QUERYCURSOR, get_cursor_position }, | ||
63 | - { HLLAPI_CMD_SETCURSOR, set_cursor_position }, | ||
64 | - { HLLAPI_CMD_COPYPSTOSTR, copy_ps_to_str }, | ||
65 | - }; | ||
66 | - | ||
67 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
68 | - | ||
69 | -#ifdef _WIN32 | ||
70 | - __declspec (dllexport) int __stdcall hllapi(LPWORD func, LPSTR buffer, LPWORD length, LPWORD rc) | ||
71 | -#else | ||
72 | - LIB3270_EXPORT int hllapi(const unsigned long *func, char *buffer, unsigned short *length, unsigned short *rc) | ||
73 | -#endif // _WIN32 | ||
74 | -{ | ||
75 | - int f; | ||
76 | - | ||
77 | - trace("%s(%d)",__FUNCTION__,*func); | ||
78 | - | ||
79 | - for(f=0;f< (sizeof (hllapi_call) / sizeof ((hllapi_call)[0]));f++) | ||
80 | - { | ||
81 | - if(hllapi_call[f].func == *func) | ||
82 | - return hllapi_call[f].exec(buffer,length,rc); | ||
83 | - } | ||
84 | - | ||
85 | - *rc = HLLAPI_STATUS_BAD_PARAMETER; | ||
86 | - | ||
87 | - return *rc; | ||
88 | -} | ||
89 | - | ||
90 | -static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc) | ||
91 | -{ | ||
92 | - char *tempbuffer = NULL; | ||
93 | - | ||
94 | - trace("%s: len=%d buflen=%d",__FUNCTION__,*length,strlen(buffer)); | ||
95 | - | ||
96 | - if(strlen(buffer) > *length) | ||
97 | - buffer[*length] = 0; | ||
98 | - | ||
99 | - if(!strrchr(buffer,':')) | ||
100 | - { | ||
101 | - int sz = strlen(buffer); | ||
102 | - | ||
103 | - tempbuffer = malloc(sz+2); | ||
104 | - strcpy(tempbuffer,buffer); | ||
105 | - tempbuffer[sz-1] = ':'; | ||
106 | - tempbuffer[sz] = buffer[sz-1]; | ||
107 | - tempbuffer[sz+1] = 0; | ||
108 | - buffer = tempbuffer; | ||
109 | - } | ||
110 | - | ||
111 | - if(hllapi_init(buffer) == 0) | ||
112 | - *rc = HLLAPI_STATUS_SUCESS; | ||
113 | - else | ||
114 | - *rc = HLLAPI_STATUS_UNAVAILABLE; | ||
115 | - | ||
116 | - if(tempbuffer) | ||
117 | - free(tempbuffer); | ||
118 | - | ||
119 | - return 0; | ||
120 | -} | ||
121 | - | ||
122 | -static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc) | ||
123 | -{ | ||
124 | - *rc = hllapi_deinit(); | ||
125 | - return 0; | ||
126 | -} | ||
127 | - | ||
128 | -static int get_library_revision(char *buffer, unsigned short *length, unsigned short *rc) | ||
129 | -{ | ||
130 | - *rc = hllapi_get_revision(); | ||
131 | - return 0; | ||
132 | -} | ||
133 | - | ||
134 | -static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc) | ||
135 | -{ | ||
136 | - int pos = hllapi_getcursor(); | ||
137 | - | ||
138 | - trace("%s(%d)",__FUNCTION__,pos); | ||
139 | - | ||
140 | - if(pos < 0) | ||
141 | - return -1; | ||
142 | - | ||
143 | - *rc = pos; | ||
144 | - return 0; | ||
145 | -} | ||
146 | - | ||
147 | -static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc) | ||
148 | -{ | ||
149 | - trace("%s(%d)",__FUNCTION__,*rc); | ||
150 | - *rc = hllapi_setcursor(*rc); | ||
151 | - return 0; | ||
152 | -} | ||
153 | - | ||
154 | -static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc) | ||
155 | -{ | ||
156 | - // Length Length of the target data string. | ||
157 | - // PS Position Position within the host presentation space of the first byte in your target data string. | ||
158 | - return hllapi_get_screen(*rc,buffer,*length); | ||
159 | -} | ||
160 | - | ||
161 | -/* | ||
162 | - static int cmd_connect_ps(const char *name) | ||
163 | - { | ||
164 | -#ifdef WIN32 | ||
165 | - | ||
166 | - static DWORD dwMode = PIPE_READMODE_MESSAGE; | ||
167 | - char PipeName[4096]; | ||
168 | - | ||
169 | - if(hPipe != INVALID_HANDLE_VALUE) | ||
170 | - return 0; | ||
171 | - | ||
172 | - snprintf(PipeName,4095,"\\\\.\\pipe\\%s",name); | ||
173 | - | ||
174 | - if(!WaitNamedPipe(PipeName,NMPWAIT_USE_DEFAULT_WAIT)) | ||
175 | - return ENOENT; | ||
176 | - | ||
177 | - hPipe = CreateFile(PipeName,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | ||
178 | - | ||
179 | - if(hPipe == INVALID_HANDLE_VALUE) | ||
180 | - return GetLastError(); | ||
181 | - | ||
182 | - if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) | ||
183 | - return GetLastError(); | ||
184 | - | ||
185 | - trace("Pipe %ld open",(unsigned long) hPipe); | ||
186 | -#else | ||
187 | - | ||
188 | - #error Not implemented | ||
189 | - | ||
190 | -#endif // WIN32 | ||
191 | - | ||
192 | - return 0; | ||
193 | - } | ||
194 | - | ||
195 | - | ||
196 | - static char * run_query(unsigned long func, const char *arg, size_t *length, unsigned short *rc) | ||
197 | - { | ||
198 | - char *outBuffer = NULL; | ||
199 | - | ||
200 | -#ifdef WIN32 | ||
201 | - | ||
202 | - if(hPipe == INVALID_HANDLE_VALUE) | ||
203 | - { | ||
204 | - trace("%s: Invalid pipe handle",__FUNCTION__); | ||
205 | - *rc = EPERM; | ||
206 | - } | ||
207 | - else | ||
208 | - { | ||
209 | - HLLAPI_DATA *buffer = malloc(HLLAPI_MAXLENGTH+1); | ||
210 | - DWORD cbSize = sizeof(HLLAPI_DATA) + *length; | ||
211 | - HLLAPI_DATA *data = malloc(cbSize+1); | ||
212 | - | ||
213 | - memset(buffer,0,HLLAPI_MAXLENGTH); | ||
214 | - | ||
215 | - data->id = HLLAPI_REQUEST_QUERY; | ||
216 | - data->func = func; | ||
217 | - data->rc = *rc; | ||
218 | - data->value = *length; | ||
219 | - | ||
220 | - if(arg && *length > 0) | ||
221 | - memcpy(data->string,arg,*length); | ||
222 | - | ||
223 | - memset(buffer,0,HLLAPI_MAXLENGTH); | ||
224 | - | ||
225 | - if(!TransactNamedPipe(hPipe,(LPVOID) data,cbSize,buffer,HLLAPI_MAXLENGTH,&cbSize,NULL)) | ||
226 | - { | ||
227 | - trace("Error %d in TransactNamedPipe",(int) GetLastError()); | ||
228 | - *rc = GetLastError(); | ||
229 | - } | ||
230 | - else | ||
231 | - { | ||
232 | - *rc = buffer->rc; | ||
233 | - *length = buffer->value; | ||
234 | - | ||
235 | - trace("buffer->id=%d buffer->value=%d rc=%d",buffer->id,buffer->value,buffer->rc); | ||
236 | - | ||
237 | - if(buffer->value > 0 && buffer->id == HLLAPI_RESPONSE_TEXT) | ||
238 | - { | ||
239 | - outBuffer = malloc(buffer->value+1); | ||
240 | - memcpy(outBuffer,buffer->string,buffer->value); | ||
241 | - outBuffer[buffer->value] = 0; | ||
242 | - | ||
243 | - trace("outBuffer=[%s]",outBuffer); | ||
244 | - } | ||
245 | - } | ||
246 | - | ||
247 | - free(data); | ||
248 | - free(buffer); | ||
249 | - } | ||
250 | - | ||
251 | -#else | ||
252 | - | ||
253 | - #error NOT IMPLEMENTED | ||
254 | - | ||
255 | -#endif // WIN32 | ||
256 | - | ||
257 | - return outBuffer; | ||
258 | - } | ||
259 | - | ||
260 | - static void copyString(char *str, unsigned short *length, const char *msg) | ||
261 | - { | ||
262 | - size_t len = strlen(msg); | ||
263 | - | ||
264 | - if(len > *length) | ||
265 | - len = *length; | ||
266 | - else | ||
267 | - *length = len; | ||
268 | - | ||
269 | - memcpy(str,msg,*length); | ||
270 | - } | ||
271 | - | ||
272 | -#ifdef _WIN32 | ||
273 | - __declspec (dllexport) int __stdcall hllapi(LPWORD func, LPSTR buffer, LPWORD length, LPWORD rc) | ||
274 | -#else | ||
275 | - LIB3270_EXPORT int hllapi(const unsigned long *func, char *buffer, unsigned short *length, unsigned short *rc) | ||
276 | -#endif // _WIN32 | ||
277 | - { | ||
278 | - char * inBuffer = NULL; | ||
279 | - char * outBuffer = NULL; | ||
280 | - size_t szOutBuffer; | ||
281 | - | ||
282 | - if(*length < 0 || *length > HLLAPI_MAXLENGTH) | ||
283 | - { | ||
284 | - *rc = EINVAL; | ||
285 | - return 0; | ||
286 | - } | ||
287 | - | ||
288 | - szOutBuffer = (size_t) *length; | ||
289 | - | ||
290 | - // Copy input argument | ||
291 | - if(*length) | ||
292 | - { | ||
293 | - inBuffer = malloc(*length+1); | ||
294 | - memcpy(inBuffer,buffer,*length); | ||
295 | - inBuffer[*length] = 0; | ||
296 | - } | ||
297 | - | ||
298 | - // Clear output buffer | ||
299 | - memset(buffer,' ',*length); | ||
300 | - buffer[*length] = 0; | ||
301 | - | ||
302 | - switch(*func) | ||
303 | - { | ||
304 | - case HLLAPI_CMD_CONNECTPS: | ||
305 | - *rc = cmd_connect_ps(inBuffer); | ||
306 | - if(!*rc) | ||
307 | - { | ||
308 | - outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); | ||
309 | - if(*rc) | ||
310 | - { | ||
311 | - trace("Closing pipe rc=%d",*rc); | ||
312 | - CloseHandle(hPipe); | ||
313 | - hPipe = INVALID_HANDLE_VALUE; | ||
314 | - } | ||
315 | - } | ||
316 | - break; | ||
317 | - | ||
318 | - case HLLAPI_CMD_DISCONNECTPS: | ||
319 | -#ifdef WIN32 | ||
320 | - if(hPipe == INVALID_HANDLE_VALUE) | ||
321 | - { | ||
322 | - *rc = EINVAL; | ||
323 | - } | ||
324 | - else | ||
325 | - { | ||
326 | - outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); | ||
327 | - CloseHandle(hPipe); | ||
328 | - hPipe = INVALID_HANDLE_VALUE; | ||
329 | - } | ||
330 | -#endif // WIN32 | ||
331 | - break; | ||
332 | - | ||
333 | - default: | ||
334 | - trace("Calling function %d",(int) *func); | ||
335 | - outBuffer = run_query(*func, inBuffer, &szOutBuffer, rc); | ||
336 | - } | ||
337 | - | ||
338 | - if(*rc) | ||
339 | - copyString(buffer,length,strerror(*rc)); | ||
340 | - else if(outBuffer) | ||
341 | - { | ||
342 | - if(szOutBuffer < *length) | ||
343 | - *length = szOutBuffer; | ||
344 | - | ||
345 | - copyString(buffer,length,outBuffer); | ||
346 | - } | ||
347 | - if(outBuffer) | ||
348 | - free(outBuffer); | ||
349 | - | ||
350 | - free(inBuffer); | ||
351 | - return 0; | ||
352 | - } | ||
353 | - | ||
354 | -*/ |
src/plugins/remotectl/hllapi.cbp
@@ -1,84 +0,0 @@ | @@ -1,84 +0,0 @@ | ||
1 | -<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | ||
2 | -<CodeBlocks_project_file> | ||
3 | - <FileVersion major="1" minor="6" /> | ||
4 | - <Project> | ||
5 | - <Option title="pw3270 HLLAPI" /> | ||
6 | - <Option makefile_is_custom="1" /> | ||
7 | - <Option pch_mode="2" /> | ||
8 | - <Option compiler="gcc" /> | ||
9 | - <Build> | ||
10 | - <Target title="Debug"> | ||
11 | - <Option output=".bin/Debug/pw3270 HLLAPI" prefix_auto="1" extension_auto="1" /> | ||
12 | - <Option object_output=".obj/Debug/" /> | ||
13 | - <Option type="1" /> | ||
14 | - <Option compiler="gcc" /> | ||
15 | - <Compiler> | ||
16 | - <Add option="-g" /> | ||
17 | - </Compiler> | ||
18 | - </Target> | ||
19 | - <Target title="Release"> | ||
20 | - <Option output=".bin/Release/pw3270 HLLAPI" prefix_auto="1" extension_auto="1" /> | ||
21 | - <Option object_output=".obj/Release/" /> | ||
22 | - <Option type="1" /> | ||
23 | - <Option compiler="gcc" /> | ||
24 | - <Compiler> | ||
25 | - <Add option="-O2" /> | ||
26 | - </Compiler> | ||
27 | - <Linker> | ||
28 | - <Add option="-s" /> | ||
29 | - </Linker> | ||
30 | - </Target> | ||
31 | - <Target title="test"> | ||
32 | - <Option output=".bin/Debug/testprogram" prefix_auto="1" extension_auto="1" /> | ||
33 | - <Option object_output=".obj/Debug/" /> | ||
34 | - <Option type="1" /> | ||
35 | - <Option compiler="gcc" /> | ||
36 | - <Compiler> | ||
37 | - <Add option="-g" /> | ||
38 | - </Compiler> | ||
39 | - <Environment> | ||
40 | - <Variable name="LIB3270_CFLAGS" value='"-I../../../src/include"' /> | ||
41 | - <Variable name="LIB3270_LIBS" value='"-L../../../.bin/Debug -l3270"' /> | ||
42 | - <Variable name="PW3270_LIBS" value='"-L../../../.bin/Debug -lpw3270 -l3270"' /> | ||
43 | - </Environment> | ||
44 | - <MakeCommands> | ||
45 | - <Build command="$make LIB3270_MODE=Debug -f $makefile $target" /> | ||
46 | - <CompileFile command="$make -f $makefile $file" /> | ||
47 | - <Clean command="$make -f $makefile clean$target" /> | ||
48 | - <DistClean command="$make -f $makefile distclean$target" /> | ||
49 | - <AskRebuildNeeded command="$make -q -f $makefile $target" /> | ||
50 | - <SilentBuild command="$make LIB3270_MODE=Debug -f $makefile $target > $(CMD_NULL)" /> | ||
51 | - </MakeCommands> | ||
52 | - </Target> | ||
53 | - </Build> | ||
54 | - <Compiler> | ||
55 | - <Add option="-Wall" /> | ||
56 | - </Compiler> | ||
57 | - <Unit filename="Makefile.in" /> | ||
58 | - <Unit filename="calls.c"> | ||
59 | - <Option compilerVar="CC" /> | ||
60 | - </Unit> | ||
61 | - <Unit filename="client.h" /> | ||
62 | - <Unit filename="hllapi.c"> | ||
63 | - <Option compilerVar="CC" /> | ||
64 | - </Unit> | ||
65 | - <Unit filename="packets.h" /> | ||
66 | - <Unit filename="pluginmain.c"> | ||
67 | - <Option compilerVar="CC" /> | ||
68 | - </Unit> | ||
69 | - <Unit filename="remote.c"> | ||
70 | - <Option compilerVar="CC" /> | ||
71 | - </Unit> | ||
72 | - <Unit filename="remotectl.h" /> | ||
73 | - <Unit filename="server.h" /> | ||
74 | - <Unit filename="testprogram.c"> | ||
75 | - <Option compilerVar="CC" /> | ||
76 | - </Unit> | ||
77 | - <Extensions> | ||
78 | - <code_completion /> | ||
79 | - <envvars /> | ||
80 | - <debugger /> | ||
81 | - <lib_finder disable_auto="1" /> | ||
82 | - </Extensions> | ||
83 | - </Project> | ||
84 | -</CodeBlocks_project_file> |
src/plugins/remotectl/packets.h
@@ -1,143 +0,0 @@ | @@ -1,143 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como packets.h e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - typedef enum _hllapi_packet | ||
31 | - { | ||
32 | - HLLAPI_PACKET_CONNECT, | ||
33 | - HLLAPI_PACKET_DISCONNECT, | ||
34 | - HLLAPI_PACKET_GET_PROGRAM_MESSAGE, | ||
35 | - HLLAPI_PACKET_GET_TEXT_AT_OFFSET, | ||
36 | - HLLAPI_PACKET_GET_TEXT_AT, | ||
37 | - HLLAPI_PACKET_SET_TEXT_AT, | ||
38 | - HLLAPI_PACKET_CMP_TEXT_AT, | ||
39 | - HLLAPI_PACKET_ENTER, | ||
40 | - HLLAPI_PACKET_PFKEY, | ||
41 | - HLLAPI_PACKET_PAKEY, | ||
42 | - HLLAPI_PACKET_SET_CURSOR_POSITION, | ||
43 | - HLLAPI_PACKET_GET_CURSOR_POSITION, | ||
44 | - HLLAPI_PACKET_INPUT_STRING, | ||
45 | - HLLAPI_PACKET_IS_CONNECTED, | ||
46 | - HLLAPI_PACKET_SET_CURSOR, | ||
47 | - HLLAPI_PACKET_GET_CURSOR, | ||
48 | - | ||
49 | - HLLAPI_PACKET_INVALID | ||
50 | - | ||
51 | - } HLLAPI_PACKET; | ||
52 | - | ||
53 | -#pragma pack(1) | ||
54 | - | ||
55 | -struct hllapi_packet_result | ||
56 | -{ | ||
57 | - int rc; | ||
58 | -}; | ||
59 | - | ||
60 | -struct hllapi_packet_text_result | ||
61 | -{ | ||
62 | - int rc; | ||
63 | - char text[1]; | ||
64 | -}; | ||
65 | - | ||
66 | -struct hllapi_packet_query | ||
67 | -{ | ||
68 | - unsigned char packet_id; | ||
69 | -}; | ||
70 | - | ||
71 | -struct hllapi_packet_connect | ||
72 | -{ | ||
73 | - unsigned char packet_id; | ||
74 | - unsigned char wait; | ||
75 | - char hostname[1]; | ||
76 | -}; | ||
77 | - | ||
78 | -struct hllapi_packet_keycode | ||
79 | -{ | ||
80 | - unsigned char packet_id; | ||
81 | - unsigned short keycode; | ||
82 | -}; | ||
83 | - | ||
84 | -struct hllapi_packet_cursor | ||
85 | -{ | ||
86 | - unsigned char packet_id; | ||
87 | - unsigned short row; | ||
88 | - unsigned short col; | ||
89 | -}; | ||
90 | - | ||
91 | -struct hllapi_packet_text | ||
92 | -{ | ||
93 | - unsigned char packet_id; | ||
94 | - char text[1]; | ||
95 | -}; | ||
96 | - | ||
97 | -struct hllapi_packet_at | ||
98 | -{ | ||
99 | - unsigned char packet_id; | ||
100 | - unsigned short row; | ||
101 | - unsigned short col; | ||
102 | - unsigned short len; | ||
103 | -}; | ||
104 | - | ||
105 | -struct hllapi_packet_text_at | ||
106 | -{ | ||
107 | - unsigned char packet_id; | ||
108 | - unsigned short row; | ||
109 | - unsigned short col; | ||
110 | - char text[1]; | ||
111 | -}; | ||
112 | - | ||
113 | -struct hllapi_packet_query_at | ||
114 | -{ | ||
115 | - unsigned char packet_id; | ||
116 | - unsigned short row; | ||
117 | - unsigned short col; | ||
118 | - unsigned short len; | ||
119 | -}; | ||
120 | - | ||
121 | -struct hllapi_packet_wait | ||
122 | -{ | ||
123 | - unsigned char packet_id; | ||
124 | - int timeout; | ||
125 | -}; | ||
126 | - | ||
127 | -struct hllapi_packet_addr | ||
128 | -{ | ||
129 | - unsigned char packet_id; | ||
130 | - unsigned short addr; | ||
131 | -}; | ||
132 | - | ||
133 | -struct hllapi_packet_query_offset | ||
134 | -{ | ||
135 | - unsigned char packet_id; | ||
136 | - unsigned short addr; | ||
137 | - unsigned short len; | ||
138 | -}; | ||
139 | - | ||
140 | - | ||
141 | - | ||
142 | -#pragma pack() | ||
143 | - |
src/plugins/remotectl/pipesource.c
@@ -1,385 +0,0 @@ | @@ -1,385 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como pipesource.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * licinio@bb.com.br (Licínio Luis Branco) | ||
28 | - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | ||
29 | - * | ||
30 | - */ | ||
31 | - | ||
32 | - #include <pw3270.h> | ||
33 | - #include <pw3270/v3270.h> | ||
34 | - | ||
35 | - #include <windows.h> | ||
36 | - #include <stdarg.h> | ||
37 | - #include "remotectl.h" | ||
38 | - | ||
39 | -/*---[ Defines ]----------------------------------------------------------------------------*/ | ||
40 | - | ||
41 | - #pragma pack(1) | ||
42 | - | ||
43 | - typedef struct _pipe_source | ||
44 | - { | ||
45 | - GSource gsrc; | ||
46 | - HANDLE hPipe; | ||
47 | - | ||
48 | - enum _PIPE_STATE | ||
49 | - { | ||
50 | - PIPE_STATE_WAITING, | ||
51 | - PIPE_STATE_READ, | ||
52 | - PIPE_STATE_PENDING_READ, | ||
53 | - | ||
54 | - PIPE_STATE_UNDEFINED, | ||
55 | - } state; | ||
56 | - | ||
57 | - OVERLAPPED overlap; | ||
58 | - unsigned char buffer[PIPE_BUFFER_LENGTH+1]; | ||
59 | - } pipe_source; | ||
60 | - | ||
61 | - #pragma pack() | ||
62 | - | ||
63 | -/*---[ GSource ]----------------------------------------------------------------------------*/ | ||
64 | - | ||
65 | -static void wait_for_client(pipe_source *source) | ||
66 | -{ | ||
67 | - set_active(FALSE); | ||
68 | - if(ConnectNamedPipe(source->hPipe,&source->overlap)) | ||
69 | - { | ||
70 | - popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | ||
71 | - return; | ||
72 | - } | ||
73 | - | ||
74 | - switch(GetLastError()) | ||
75 | - { | ||
76 | - // The overlapped connection in progress. | ||
77 | - case ERROR_IO_PENDING: | ||
78 | - // trace("%s: ERROR_IO_PENDING",__FUNCTION__); | ||
79 | - source->state = PIPE_STATE_WAITING; | ||
80 | - break; | ||
81 | - | ||
82 | - // Client is already connected, so signal an event. | ||
83 | - case ERROR_PIPE_CONNECTED: | ||
84 | - trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); | ||
85 | - set_active(TRUE); | ||
86 | - if(SetEvent(source->overlap.hEvent)) | ||
87 | - break; | ||
88 | - | ||
89 | - // If an error occurs during the connect operation... | ||
90 | - default: | ||
91 | - popup_lasterror("%s", _( "ConnectNamedPipe failed" )); | ||
92 | - } | ||
93 | - | ||
94 | - } | ||
95 | - | ||
96 | - static gboolean IO_prepare(GSource *source, gint *timeout) | ||
97 | - { | ||
98 | - /* | ||
99 | - * Called before all the file descriptors are polled. | ||
100 | - * If the source can determine that it is ready here | ||
101 | - * (without waiting for the results of the poll() call) | ||
102 | - * it should return TRUE. | ||
103 | - * | ||
104 | - * It can also return a timeout_ value which should be the maximum | ||
105 | - * timeout (in milliseconds) which should be passed to the poll() call. | ||
106 | - * The actual timeout used will be -1 if all sources returned -1, | ||
107 | - * or it will be the minimum of all the timeout_ values | ||
108 | - * returned which were >= 0. | ||
109 | - * | ||
110 | - */ | ||
111 | - if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
112 | - { | ||
113 | - // trace("%s: source=%p",__FUNCTION__,source); | ||
114 | - return TRUE; | ||
115 | - } | ||
116 | - | ||
117 | - *timeout = 10; | ||
118 | - return FALSE; | ||
119 | - } | ||
120 | - | ||
121 | - static gboolean IO_check(GSource *source) | ||
122 | - { | ||
123 | - /* | ||
124 | - * Called after all the file descriptors are polled. | ||
125 | - * The source should return TRUE if it is ready to be dispatched. | ||
126 | - * Note that some time may have passed since the previous prepare | ||
127 | - * function was called, so the source should be checked again here. | ||
128 | - * | ||
129 | - */ | ||
130 | - if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
131 | - return TRUE; | ||
132 | - | ||
133 | - return FALSE; | ||
134 | - } | ||
135 | - | ||
136 | - static void process_input(pipe_source *source, DWORD cbRead) | ||
137 | - { | ||
138 | - HLLAPI_DATA * data = (HLLAPI_DATA *) source->buffer; | ||
139 | - QUERY * qry = g_malloc0(sizeof(QUERY)+cbRead+1); | ||
140 | - | ||
141 | - qry->hPipe = source->hPipe; | ||
142 | - qry->text = (const gchar *) (qry+1); | ||
143 | - | ||
144 | - if(data->id == HLLAPI_REQUEST_QUERY) | ||
145 | - { | ||
146 | - // HLLAPI query | ||
147 | - qry->cmd = (int) data->func; | ||
148 | - qry->pos = (int) data->rc; | ||
149 | - qry->length = data->value; | ||
150 | - memcpy((gchar *)(qry->text),data->string,qry->length); | ||
151 | - } | ||
152 | - else | ||
153 | - { | ||
154 | - qry->cmd = -1; | ||
155 | - } | ||
156 | - | ||
157 | - enqueue_request(qry); | ||
158 | - } | ||
159 | - | ||
160 | - void request_complete(QUERY *qry, int rc, const gchar *text) | ||
161 | - { | ||
162 | - request_buffer(qry,rc,strlen(text),(const gpointer) text); | ||
163 | - } | ||
164 | - | ||
165 | - void request_status(QUERY *qry, int rc) | ||
166 | - { | ||
167 | - if(rc) | ||
168 | - { | ||
169 | - const gchar *msg = strerror(rc); | ||
170 | - request_buffer(qry, rc, strlen(msg), (const gpointer) msg); | ||
171 | - } | ||
172 | - else | ||
173 | - { | ||
174 | - request_buffer(qry, rc, 0, NULL); | ||
175 | - } | ||
176 | - } | ||
177 | - | ||
178 | - void request_value(QUERY *qry, int rc, unsigned int value) | ||
179 | - { | ||
180 | - HLLAPI_DATA data; | ||
181 | - | ||
182 | - memset(&data,0,sizeof(data)); | ||
183 | - data.id = HLLAPI_RESPONSE_VALUE; | ||
184 | - data.func = qry->cmd; | ||
185 | - data.rc = rc; | ||
186 | - data.value = value; | ||
187 | - | ||
188 | -#ifdef WIN32 | ||
189 | - { | ||
190 | - DWORD wrote = sizeof(data); | ||
191 | - WriteFile(qry->hPipe,&data,wrote,&wrote,NULL); | ||
192 | - trace("Wrote=%d len=%d",(int) wrote, sizeof(data)); | ||
193 | - } | ||
194 | -#endif // WIN32 | ||
195 | - | ||
196 | - g_free(qry); | ||
197 | - | ||
198 | - | ||
199 | - } | ||
200 | - | ||
201 | - void request_buffer(QUERY *qry, int rc, size_t szBuffer, const gpointer buffer) | ||
202 | - { | ||
203 | - size_t sz; | ||
204 | - HLLAPI_DATA *data; | ||
205 | - | ||
206 | - if(buffer) | ||
207 | - { | ||
208 | - sz = sizeof(HLLAPI_DATA)+szBuffer; | ||
209 | - data = g_malloc0(sz); | ||
210 | - data->id = HLLAPI_RESPONSE_TEXT; | ||
211 | - memcpy(data->string,buffer,szBuffer); | ||
212 | - } | ||
213 | - else | ||
214 | - { | ||
215 | - sz = sizeof(HLLAPI_DATA); | ||
216 | - data = g_malloc0(sz); | ||
217 | - data->id = HLLAPI_RESPONSE_VALUE; | ||
218 | - } | ||
219 | - | ||
220 | - data->func = qry->cmd; | ||
221 | - data->rc = rc; | ||
222 | - data->value = szBuffer; | ||
223 | - | ||
224 | - trace("rc=%d data->len=%d",rc,(int) szBuffer); | ||
225 | - | ||
226 | -#ifdef WIN32 | ||
227 | - { | ||
228 | - DWORD wrote = sz; | ||
229 | - WriteFile(qry->hPipe,data,wrote,&wrote,NULL); | ||
230 | - trace("Wrote=%d len=%d",(int) wrote, (int) sz); | ||
231 | - } | ||
232 | -#endif // WIN32 | ||
233 | - | ||
234 | - g_free(data); | ||
235 | - g_free(qry); | ||
236 | - | ||
237 | - } | ||
238 | - | ||
239 | - static void read_input_pipe(pipe_source *source) | ||
240 | - { | ||
241 | - DWORD cbRead = 0; | ||
242 | - | ||
243 | - if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0) | ||
244 | - process_input(source,cbRead); | ||
245 | - | ||
246 | - // The read operation is still pending. | ||
247 | - switch(GetLastError()) | ||
248 | - { | ||
249 | - case 0: | ||
250 | - break; | ||
251 | - | ||
252 | - case ERROR_IO_PENDING: | ||
253 | - // trace("%s: PIPE_STATE_PENDING_READ",__FUNCTION__); | ||
254 | - source->state = PIPE_STATE_PENDING_READ; | ||
255 | - break; | ||
256 | - | ||
257 | - case ERROR_PIPE_LISTENING: | ||
258 | - // trace("%s: ERROR_PIPE_LISTENING",__FUNCTION__); | ||
259 | - source->state = PIPE_STATE_READ; | ||
260 | - break; | ||
261 | - | ||
262 | - case ERROR_BROKEN_PIPE: | ||
263 | - trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); | ||
264 | - | ||
265 | - if(!DisconnectNamedPipe(source->hPipe)) | ||
266 | - { | ||
267 | - set_active(FALSE); | ||
268 | - popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); | ||
269 | - } | ||
270 | - else | ||
271 | - { | ||
272 | - wait_for_client(source); | ||
273 | - } | ||
274 | - break; | ||
275 | - | ||
276 | - case ERROR_PIPE_NOT_CONNECTED: | ||
277 | - trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); | ||
278 | - set_active(FALSE); | ||
279 | - break; | ||
280 | - | ||
281 | - default: | ||
282 | - if(source->hPipe != INVALID_HANDLE_VALUE) | ||
283 | - popup_lasterror("%s",_( "Error receiving message from pipe" ) ); | ||
284 | - } | ||
285 | - | ||
286 | - } | ||
287 | - | ||
288 | - static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data) | ||
289 | - { | ||
290 | - /* | ||
291 | - * Called to dispatch the event source, | ||
292 | - * after it has returned TRUE in either its prepare or its check function. | ||
293 | - * The dispatch function is passed in a callback function and data. | ||
294 | - * The callback function may be NULL if the source was never connected | ||
295 | - * to a callback using g_source_set_callback(). The dispatch function | ||
296 | - * should call the callback function with user_data and whatever additional | ||
297 | - * parameters are needed for this type of event source. | ||
298 | - */ | ||
299 | - BOOL fSuccess; | ||
300 | - DWORD cbRead = 0; | ||
301 | -// DWORD dwErr = 0; | ||
302 | - | ||
303 | - fSuccess = GetOverlappedResult(((pipe_source *) source)->hPipe,&((pipe_source *) source)->overlap,&cbRead,FALSE ); | ||
304 | - | ||
305 | - // trace("%s: source=%p data=%p Result=%s cbRead=%d",__FUNCTION__,source,data,fSuccess ? "Success" : "Unsuccess",(int) cbRead); | ||
306 | - | ||
307 | - switch(((pipe_source *) source)->state) | ||
308 | - { | ||
309 | - case PIPE_STATE_WAITING: | ||
310 | - if(fSuccess) | ||
311 | - { | ||
312 | - trace("Pipe connected (cbRet=%d)",(int) cbRead); | ||
313 | - set_active(TRUE); | ||
314 | - ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
315 | - } | ||
316 | - else | ||
317 | - { | ||
318 | - popup_lasterror("%s", _( "Pipe connection failed" )); | ||
319 | - } | ||
320 | - break; | ||
321 | - | ||
322 | - case PIPE_STATE_READ: | ||
323 | - // trace("Reading pipe (cbRead=%d)",(int) cbRead); | ||
324 | - read_input_pipe( (pipe_source *) source); | ||
325 | - break; | ||
326 | - | ||
327 | - case PIPE_STATE_PENDING_READ: | ||
328 | - if(fSuccess && cbRead > 0) | ||
329 | - process_input((pipe_source *) source,cbRead); | ||
330 | - ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
331 | - break; | ||
332 | - | ||
333 | -//#ifdef DEBUG | ||
334 | -// default: | ||
335 | -// trace("%s: source=%p data=%p Unexpected mode %d",__FUNCTION__,source,data,((pipe_source *) source)->state); | ||
336 | -//#endif | ||
337 | - } | ||
338 | - | ||
339 | - return TRUE; | ||
340 | - } | ||
341 | - | ||
342 | - static void IO_finalize(GSource *source) | ||
343 | - { | ||
344 | -// trace("%s: source=%p",__FUNCTION__,source); | ||
345 | - | ||
346 | - if( ((pipe_source *) source)->hPipe != INVALID_HANDLE_VALUE) | ||
347 | - { | ||
348 | - CloseHandle(((pipe_source *) source)->hPipe); | ||
349 | - ((pipe_source *) source)->hPipe = INVALID_HANDLE_VALUE; | ||
350 | - } | ||
351 | - | ||
352 | - } | ||
353 | - | ||
354 | - static gboolean IO_closure(gpointer data) | ||
355 | - { | ||
356 | -// trace("%s: data=%p",__FUNCTION__,data); | ||
357 | - return 0; | ||
358 | - } | ||
359 | - | ||
360 | - | ||
361 | - void init_source_pipe(HANDLE hPipe) | ||
362 | - { | ||
363 | - static GSourceFuncs pipe_source_funcs = | ||
364 | - { | ||
365 | - IO_prepare, | ||
366 | - IO_check, | ||
367 | - IO_dispatch, | ||
368 | - IO_finalize, | ||
369 | - IO_closure, | ||
370 | - NULL | ||
371 | - }; | ||
372 | - | ||
373 | - pipe_source *source = (pipe_source *) g_source_new(&pipe_source_funcs,sizeof(pipe_source)); | ||
374 | - | ||
375 | - source->hPipe = hPipe; | ||
376 | - source->state = PIPE_STATE_WAITING; | ||
377 | - source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); | ||
378 | - | ||
379 | - g_source_attach((GSource *) source,NULL); | ||
380 | - | ||
381 | - wait_for_client(source); | ||
382 | - | ||
383 | - return; | ||
384 | - } | ||
385 | - |
src/plugins/remotectl/pluginmain.c
@@ -1,807 +0,0 @@ | @@ -1,807 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como pluginmain.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - * Agradecimento: | ||
29 | - * | ||
30 | - * Hélio Passos | ||
31 | - * | ||
32 | - */ | ||
33 | - | ||
34 | - #include "server.h" | ||
35 | - #include "packets.h" | ||
36 | - #include <lib3270/actions.h> | ||
37 | - | ||
38 | -/*--[ Defines ]--------------------------------------------------------------------------------------*/ | ||
39 | - | ||
40 | - #pragma pack(1) | ||
41 | - | ||
42 | - typedef struct _pipe_source | ||
43 | - { | ||
44 | - GSource gsrc; | ||
45 | - HANDLE hPipe; | ||
46 | - | ||
47 | - enum _PIPE_STATE | ||
48 | - { | ||
49 | - PIPE_STATE_WAITING, | ||
50 | - PIPE_STATE_READ, | ||
51 | - PIPE_STATE_PENDING_READ, | ||
52 | - PIPE_STATE_UNDEFINED, | ||
53 | - } state; | ||
54 | - | ||
55 | - OVERLAPPED overlap; | ||
56 | - unsigned char buffer[PIPE_BUFFER_LENGTH+1]; | ||
57 | - } pipe_source; | ||
58 | - | ||
59 | - #pragma pack() | ||
60 | - | ||
61 | - | ||
62 | -/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
63 | - | ||
64 | - static const gchar control_char = '@'; | ||
65 | - | ||
66 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
67 | - | ||
68 | - static void IO_accept(pipe_source *source) | ||
69 | - { | ||
70 | - set_active(FALSE); | ||
71 | - | ||
72 | - if(ConnectNamedPipe(source->hPipe,&source->overlap)) | ||
73 | - { | ||
74 | - popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | ||
75 | - return; | ||
76 | - } | ||
77 | - | ||
78 | - switch(GetLastError()) | ||
79 | - { | ||
80 | - // The overlapped connection in progress. | ||
81 | - case ERROR_IO_PENDING: | ||
82 | - // trace("%s: ERROR_IO_PENDING",__FUNCTION__); | ||
83 | - source->state = PIPE_STATE_WAITING; | ||
84 | - break; | ||
85 | - | ||
86 | - // Client is already connected, so signal an event. | ||
87 | - case ERROR_PIPE_CONNECTED: | ||
88 | - trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__); | ||
89 | - set_active(TRUE); | ||
90 | - if(SetEvent(source->overlap.hEvent)) | ||
91 | - break; | ||
92 | - | ||
93 | - // If an error occurs during the connect operation... | ||
94 | - default: | ||
95 | - popup_lasterror("%s", _( "ConnectNamedPipe failed" )); | ||
96 | - } | ||
97 | - | ||
98 | - } | ||
99 | - | ||
100 | - static gboolean IO_prepare(GSource *source, gint *timeout) | ||
101 | - { | ||
102 | - /* | ||
103 | - * Called before all the file descriptors are polled. | ||
104 | - * If the source can determine that it is ready here | ||
105 | - * (without waiting for the results of the poll() call) | ||
106 | - * it should return TRUE. | ||
107 | - * | ||
108 | - * It can also return a timeout_ value which should be the maximum | ||
109 | - * timeout (in milliseconds) which should be passed to the poll() call. | ||
110 | - * The actual timeout used will be -1 if all sources returned -1, | ||
111 | - * or it will be the minimum of all the timeout_ values | ||
112 | - * returned which were >= 0. | ||
113 | - * | ||
114 | - */ | ||
115 | - if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
116 | - return TRUE; | ||
117 | - | ||
118 | - *timeout = 10; | ||
119 | - return FALSE; | ||
120 | - } | ||
121 | - | ||
122 | - static gboolean IO_check(GSource *source) | ||
123 | - { | ||
124 | - /* | ||
125 | - * Called after all the file descriptors are polled. | ||
126 | - * The source should return TRUE if it is ready to be dispatched. | ||
127 | - * Note that some time may have passed since the previous prepare | ||
128 | - * function was called, so the source should be checked again here. | ||
129 | - * | ||
130 | - */ | ||
131 | - if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | ||
132 | - return TRUE; | ||
133 | - | ||
134 | - return FALSE; | ||
135 | - } | ||
136 | - | ||
137 | - static void send_text(pipe_source *source, char *text) | ||
138 | - { | ||
139 | - struct hllapi_packet_text *pkt; | ||
140 | - DWORD szBlock; | ||
141 | - | ||
142 | - if(text) | ||
143 | - { | ||
144 | - szBlock = sizeof(struct hllapi_packet_text)+strlen(text); | ||
145 | - pkt = g_malloc0(szBlock); | ||
146 | - pkt->packet_id = 0; | ||
147 | - strcpy(pkt->text,text); | ||
148 | - lib3270_free(text); | ||
149 | - } | ||
150 | - else | ||
151 | - { | ||
152 | - szBlock = sizeof(struct hllapi_packet_text); | ||
153 | - pkt = g_malloc0(szBlock); | ||
154 | - pkt->packet_id = errno ? errno : -1; | ||
155 | - } | ||
156 | - | ||
157 | - WriteFile(source->hPipe,pkt,szBlock,&szBlock,NULL); | ||
158 | - | ||
159 | - g_free(pkt); | ||
160 | - } | ||
161 | - | ||
162 | - static void send_result(pipe_source *source, int rc) | ||
163 | - { | ||
164 | - struct hllapi_packet_result pkt = { rc }; | ||
165 | - DWORD wrote = sizeof(pkt); | ||
166 | - WriteFile(source->hPipe,&pkt,wrote,&wrote,NULL); | ||
167 | - } | ||
168 | - | ||
169 | - static void process_input(pipe_source *source, DWORD cbRead) | ||
170 | - { | ||
171 | - | ||
172 | - trace("%s id=%d",__FUNCTION__,((struct hllapi_packet_query *) source->buffer)->packet_id); | ||
173 | - | ||
174 | - switch(((struct hllapi_packet_query *) source->buffer)->packet_id) | ||
175 | - { | ||
176 | - case HLLAPI_PACKET_CONNECT: | ||
177 | - send_result(source,lib3270_connect( lib3270_get_default_session_handle(), | ||
178 | - ((struct hllapi_packet_connect *) source->buffer)->hostname, | ||
179 | - ((struct hllapi_packet_connect *) source->buffer)->wait)); | ||
180 | - break; | ||
181 | - | ||
182 | - case HLLAPI_PACKET_DISCONNECT: | ||
183 | - send_result(source,lib3270_disconnect(lib3270_get_default_session_handle())); | ||
184 | - break; | ||
185 | - | ||
186 | - case HLLAPI_PACKET_GET_PROGRAM_MESSAGE: | ||
187 | - send_result(source,lib3270_get_program_message(lib3270_get_default_session_handle())); | ||
188 | - break; | ||
189 | - | ||
190 | - case HLLAPI_PACKET_IS_CONNECTED: | ||
191 | - send_result(source,lib3270_in_tn3270e(lib3270_get_default_session_handle())); | ||
192 | - break; | ||
193 | - | ||
194 | - case HLLAPI_PACKET_ENTER: | ||
195 | - send_result(source,lib3270_enter(lib3270_get_default_session_handle())); | ||
196 | - break; | ||
197 | - | ||
198 | - case HLLAPI_PACKET_PFKEY: | ||
199 | - send_result(source,lib3270_pfkey( lib3270_get_default_session_handle(), | ||
200 | - ((struct hllapi_packet_keycode *) source->buffer)->keycode)); | ||
201 | - break; | ||
202 | - | ||
203 | - case HLLAPI_PACKET_PAKEY: | ||
204 | - send_result(source,lib3270_pakey( lib3270_get_default_session_handle(), | ||
205 | - ((struct hllapi_packet_keycode *) source->buffer)->keycode)); | ||
206 | - break; | ||
207 | - | ||
208 | - case HLLAPI_PACKET_SET_CURSOR_POSITION: | ||
209 | - send_result(source,lib3270_set_cursor_position( lib3270_get_default_session_handle(), | ||
210 | - ((struct hllapi_packet_cursor *) source->buffer)->row, | ||
211 | - ((struct hllapi_packet_cursor *) source->buffer)->col)); | ||
212 | - break; | ||
213 | - | ||
214 | - case HLLAPI_PACKET_SET_TEXT_AT: | ||
215 | - send_result(source,lib3270_set_text_at( lib3270_get_default_session_handle(), | ||
216 | - ((struct hllapi_packet_text_at *) source->buffer)->row, | ||
217 | - ((struct hllapi_packet_text_at *) source->buffer)->col, | ||
218 | - (unsigned char *) ((struct hllapi_packet_text_at *) source->buffer)->text)); | ||
219 | - break; | ||
220 | - | ||
221 | - case HLLAPI_PACKET_GET_TEXT_AT: | ||
222 | - send_text(source,lib3270_get_text_at( lib3270_get_default_session_handle(), | ||
223 | - ((struct hllapi_packet_at *) source->buffer)->row, | ||
224 | - ((struct hllapi_packet_at *) source->buffer)->col, | ||
225 | - ((struct hllapi_packet_at *) source->buffer)->len)); | ||
226 | - break; | ||
227 | - | ||
228 | - case HLLAPI_PACKET_GET_TEXT_AT_OFFSET: | ||
229 | - send_text(source,lib3270_get_text( lib3270_get_default_session_handle(), | ||
230 | - ((struct hllapi_packet_query_offset *) source->buffer)->addr, | ||
231 | - ((struct hllapi_packet_query_offset *) source->buffer)->len)); | ||
232 | - break; | ||
233 | - | ||
234 | - case HLLAPI_PACKET_CMP_TEXT_AT: | ||
235 | - send_result(source,lib3270_cmp_text_at( lib3270_get_default_session_handle(), | ||
236 | - ((struct hllapi_packet_text_at *) source->buffer)->row, | ||
237 | - ((struct hllapi_packet_text_at *) source->buffer)->col, | ||
238 | - ((struct hllapi_packet_text_at *) source->buffer)->text)); | ||
239 | - break; | ||
240 | - | ||
241 | - case HLLAPI_PACKET_INPUT_STRING: | ||
242 | - send_result(source,lib3270_input_string(lib3270_get_default_session_handle(), | ||
243 | - (unsigned char *) ((struct hllapi_packet_text *) source->buffer)->text)); | ||
244 | - break; | ||
245 | - | ||
246 | - case HLLAPI_PACKET_SET_CURSOR: | ||
247 | - send_result(source,lib3270_set_cursor_address(lib3270_get_default_session_handle(), | ||
248 | - ((struct hllapi_packet_addr *) source->buffer)->addr)); | ||
249 | - break; | ||
250 | - | ||
251 | - case HLLAPI_PACKET_GET_CURSOR: | ||
252 | - send_result(source,lib3270_get_cursor_address(lib3270_get_default_session_handle())); | ||
253 | - break; | ||
254 | - | ||
255 | - | ||
256 | - default: | ||
257 | - send_result(source, EINVAL); | ||
258 | - g_message("Invalid remote request (id=%d)",source->buffer[0]); | ||
259 | - } | ||
260 | - | ||
261 | - } | ||
262 | - | ||
263 | - static void read_input_pipe(pipe_source *source) | ||
264 | - { | ||
265 | - DWORD cbRead = 0; | ||
266 | - | ||
267 | - if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0) | ||
268 | - process_input(source,cbRead); | ||
269 | - | ||
270 | - // The read operation is still pending. | ||
271 | - switch(GetLastError()) | ||
272 | - { | ||
273 | - case 0: | ||
274 | - break; | ||
275 | - | ||
276 | - case ERROR_IO_PENDING: | ||
277 | - // trace("%s: PIPE_STATE_PENDING_READ",__FUNCTION__); | ||
278 | - source->state = PIPE_STATE_PENDING_READ; | ||
279 | - break; | ||
280 | - | ||
281 | - case ERROR_PIPE_LISTENING: | ||
282 | - // trace("%s: ERROR_PIPE_LISTENING",__FUNCTION__); | ||
283 | - source->state = PIPE_STATE_READ; | ||
284 | - break; | ||
285 | - | ||
286 | - case ERROR_BROKEN_PIPE: | ||
287 | - trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__); | ||
288 | - | ||
289 | - if(!DisconnectNamedPipe(source->hPipe)) | ||
290 | - { | ||
291 | - set_active(FALSE); | ||
292 | - popup_lasterror("%s",_( "Error in DisconnectNamedPipe" )); | ||
293 | - } | ||
294 | - else | ||
295 | - { | ||
296 | - IO_accept(source); | ||
297 | - } | ||
298 | - break; | ||
299 | - | ||
300 | - case ERROR_PIPE_NOT_CONNECTED: | ||
301 | - trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__); | ||
302 | - set_active(FALSE); | ||
303 | - break; | ||
304 | - | ||
305 | - default: | ||
306 | - if(source->hPipe != INVALID_HANDLE_VALUE) | ||
307 | - popup_lasterror("%s",_( "Error receiving message from pipe" ) ); | ||
308 | - } | ||
309 | - | ||
310 | - } | ||
311 | - | ||
312 | - static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data) | ||
313 | - { | ||
314 | - /* | ||
315 | - * Called to dispatch the event source, | ||
316 | - * after it has returned TRUE in either its prepare or its check function. | ||
317 | - * The dispatch function is passed in a callback function and data. | ||
318 | - * The callback function may be NULL if the source was never connected | ||
319 | - * to a callback using g_source_set_callback(). The dispatch function | ||
320 | - * should call the callback function with user_data and whatever additional | ||
321 | - * parameters are needed for this type of event source. | ||
322 | - */ | ||
323 | - BOOL fSuccess; | ||
324 | - DWORD cbRead = 0; | ||
325 | -// DWORD dwErr = 0; | ||
326 | - | ||
327 | - fSuccess = GetOverlappedResult(((pipe_source *) source)->hPipe,&((pipe_source *) source)->overlap,&cbRead,FALSE ); | ||
328 | - | ||
329 | - // trace("%s: source=%p data=%p Result=%s cbRead=%d",__FUNCTION__,source,data,fSuccess ? "Success" : "Unsuccess",(int) cbRead); | ||
330 | - | ||
331 | - switch(((pipe_source *) source)->state) | ||
332 | - { | ||
333 | - case PIPE_STATE_WAITING: | ||
334 | - if(fSuccess) | ||
335 | - { | ||
336 | - trace("Pipe connected (cbRet=%d)",(int) cbRead); | ||
337 | - set_active(TRUE); | ||
338 | - ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
339 | - } | ||
340 | - else | ||
341 | - { | ||
342 | - popup_lasterror("%s", _( "Pipe connection failed" )); | ||
343 | - } | ||
344 | - break; | ||
345 | - | ||
346 | - case PIPE_STATE_READ: | ||
347 | - // trace("Reading pipe (cbRead=%d)",(int) cbRead); | ||
348 | - read_input_pipe( (pipe_source *) source); | ||
349 | - break; | ||
350 | - | ||
351 | - case PIPE_STATE_PENDING_READ: | ||
352 | - if(fSuccess && cbRead > 0) | ||
353 | - process_input((pipe_source *) source,cbRead); | ||
354 | - ((pipe_source *) source)->state = PIPE_STATE_READ; | ||
355 | - break; | ||
356 | - | ||
357 | - case PIPE_STATE_UNDEFINED: | ||
358 | - break; | ||
359 | - | ||
360 | -//#ifdef DEBUG | ||
361 | -// default: | ||
362 | -// trace("%s: source=%p data=%p Unexpected mode %d",__FUNCTION__,source,data,((pipe_source *) source)->state); | ||
363 | -//#endif | ||
364 | - } | ||
365 | - | ||
366 | - return TRUE; | ||
367 | - } | ||
368 | - | ||
369 | - static void IO_finalize(GSource *source) | ||
370 | - { | ||
371 | -// trace("%s: source=%p",__FUNCTION__,source); | ||
372 | - | ||
373 | - if( ((pipe_source *) source)->hPipe != INVALID_HANDLE_VALUE) | ||
374 | - { | ||
375 | - CloseHandle(((pipe_source *) source)->hPipe); | ||
376 | - ((pipe_source *) source)->hPipe = INVALID_HANDLE_VALUE; | ||
377 | - } | ||
378 | - | ||
379 | - } | ||
380 | - | ||
381 | - static gboolean IO_closure(gpointer data) | ||
382 | - { | ||
383 | -// trace("%s: data=%p",__FUNCTION__,data); | ||
384 | - return 0; | ||
385 | - } | ||
386 | - | ||
387 | - void popup_lasterror(const gchar *fmt, ...) | ||
388 | - { | ||
389 | - char buffer[4096]; | ||
390 | - va_list arg_ptr; | ||
391 | - int sz; | ||
392 | - DWORD errcode = GetLastError(); | ||
393 | - char *ptr; | ||
394 | - LPVOID lpMsgBuf = 0; | ||
395 | - | ||
396 | - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); | ||
397 | - | ||
398 | - for(ptr=lpMsgBuf;*ptr && *ptr != '\n';ptr++); | ||
399 | - *ptr = 0; | ||
400 | - | ||
401 | - va_start(arg_ptr, fmt); | ||
402 | - vsnprintf(buffer,4095,fmt,arg_ptr); | ||
403 | - va_end(arg_ptr); | ||
404 | - | ||
405 | - sz = strlen(buffer); | ||
406 | - snprintf(buffer+sz,4096-sz,": %s\n(rc=%d)",lpMsgBuf,(int) errcode); | ||
407 | - | ||
408 | - printf("%s\n",buffer); | ||
409 | - | ||
410 | -#ifdef DEBUG | ||
411 | - fprintf(stderr,"%s\n",buffer); | ||
412 | - fflush(stderr); | ||
413 | -#endif | ||
414 | - | ||
415 | - LocalFree(lpMsgBuf); | ||
416 | - } | ||
417 | - | ||
418 | - LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) | ||
419 | - { | ||
420 | - char id; | ||
421 | - | ||
422 | - for(id='A';id < 'Z';id++) | ||
423 | - { | ||
424 | - gchar * pipename = g_strdup_printf("\\\\.\\pipe\\%s_%c",pw3270_get_session_name(window),id); | ||
425 | - gchar * ptr; | ||
426 | - HANDLE hPipe; | ||
427 | - | ||
428 | - for(ptr=pipename;*ptr;ptr++) | ||
429 | - *ptr = g_ascii_tolower(*ptr); | ||
430 | - | ||
431 | - hPipe = CreateNamedPipe( TEXT(pipename), // pipe name | ||
432 | - PIPE_ACCESS_DUPLEX | // read/write access | ||
433 | - FILE_FLAG_OVERLAPPED, // overlapped mode | ||
434 | - PIPE_TYPE_MESSAGE | // pipe type | ||
435 | - PIPE_READMODE_MESSAGE | // pipe mode | ||
436 | - PIPE_WAIT, // blocking mode | ||
437 | - 1, // number of instances | ||
438 | - PIPE_BUFFER_LENGTH, // output buffer size | ||
439 | - PIPE_BUFFER_LENGTH, // input buffer size | ||
440 | - NMPWAIT_USE_DEFAULT_WAIT, // client time-out | ||
441 | - NULL); // default security attributes | ||
442 | - | ||
443 | - trace("%s = %p",pipename,hPipe); | ||
444 | - g_free(pipename); | ||
445 | - | ||
446 | - if(hPipe != INVALID_HANDLE_VALUE) | ||
447 | - { | ||
448 | - static GSourceFuncs pipe_source_funcs = | ||
449 | - { | ||
450 | - IO_prepare, | ||
451 | - IO_check, | ||
452 | - IO_dispatch, | ||
453 | - IO_finalize, | ||
454 | - IO_closure, | ||
455 | - NULL | ||
456 | - }; | ||
457 | - pipe_source * source; | ||
458 | - gchar * session = g_strdup_printf("%s:%c",pw3270_get_session_name(window),id); | ||
459 | - | ||
460 | - pw3270_set_session_name(window,session); | ||
461 | - g_free(session); | ||
462 | - | ||
463 | - source = (pipe_source *) g_source_new(&pipe_source_funcs,sizeof(pipe_source)); | ||
464 | - | ||
465 | - source->hPipe = hPipe; | ||
466 | - source->state = PIPE_STATE_WAITING; | ||
467 | - source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); | ||
468 | - | ||
469 | - g_source_attach((GSource *) source,NULL); | ||
470 | - IO_accept(source); | ||
471 | - | ||
472 | - return 0; | ||
473 | - } | ||
474 | - | ||
475 | - } | ||
476 | - | ||
477 | - popup_lasterror( "%s", _( "Can´t create remote control pipe" )); | ||
478 | - | ||
479 | - return -1; | ||
480 | - } | ||
481 | - | ||
482 | - LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) | ||
483 | - { | ||
484 | - | ||
485 | - return 0; | ||
486 | - } | ||
487 | - | ||
488 | -/* | ||
489 | - static void cmd_connectps(QUERY *qry) | ||
490 | - { | ||
491 | - g_message("%s","HLLAPI ConnectPS request received"); | ||
492 | - request_status(qry,v3270_set_script(pw3270_get_terminal_widget(NULL),'H',TRUE)); | ||
493 | - } | ||
494 | - | ||
495 | - static void cmd_disconnectps(QUERY *qry) | ||
496 | - { | ||
497 | - g_message("%s","HLLAPI DisconnectPS request received"); | ||
498 | - request_status(qry,0); | ||
499 | - } | ||
500 | - | ||
501 | - static void cmd_getrevision(QUERY *qry) | ||
502 | - { | ||
503 | - request_complete(qry,0,lib3270_get_revision()); | ||
504 | - } | ||
505 | - | ||
506 | - static void cmd_setcursor(QUERY *qry) | ||
507 | - { | ||
508 | - int rc = ENOTCONN; | ||
509 | - | ||
510 | - if(lib3270_connected(qry->hSession)) | ||
511 | - { | ||
512 | - trace("%s: pos=%d row=%d col=%d",__FUNCTION__,rc,rc/80,rc%80); | ||
513 | - lib3270_set_cursor_address(qry->hSession,qry->pos -1); | ||
514 | - rc = 0; | ||
515 | - } | ||
516 | - | ||
517 | - request_status(qry,rc); | ||
518 | - } | ||
519 | - | ||
520 | - static void cmd_sendstring(QUERY *qry) | ||
521 | - { | ||
522 | - gchar * text; | ||
523 | - GError * error = NULL; | ||
524 | - gsize bytes_read; | ||
525 | - gsize bytes_written; | ||
526 | - const gchar * charset; | ||
527 | - | ||
528 | - if(!lib3270_connected(qry->hSession)) | ||
529 | - { | ||
530 | - request_status(qry,ENOTCONN); | ||
531 | - return; | ||
532 | - } | ||
533 | - | ||
534 | - g_get_charset(&charset); | ||
535 | - | ||
536 | - text = g_convert(qry->text,qry->length,lib3270_get_charset(qry->hSession),charset,&bytes_read,&bytes_written,&error); | ||
537 | - if(text) | ||
538 | - { | ||
539 | - int rc = 0; | ||
540 | - | ||
541 | - if(strchr(text,control_char)) | ||
542 | - { | ||
543 | - // Convert control char | ||
544 | - gchar * buffer = text; | ||
545 | - char * ptr; | ||
546 | - | ||
547 | - for(ptr = strchr(text,control_char);ptr;ptr = strchr(buffer,control_char)) | ||
548 | - { | ||
549 | - *(ptr++) = 0; | ||
550 | - | ||
551 | - lib3270_emulate_input(qry->hSession,buffer,-1,0); | ||
552 | - | ||
553 | - switch(*(ptr++)) | ||
554 | - { | ||
555 | - case 'P': // Print | ||
556 | - rc = pw3270_print(pw3270_get_terminal_widget(NULL), NULL, GTK_PRINT_OPERATION_ACTION_PRINT, PW3270_SRC_ALL); | ||
557 | - break; | ||
558 | - | ||
559 | - case 'E': // Enter | ||
560 | - lib3270_enter(qry->hSession); | ||
561 | - break; | ||
562 | - | ||
563 | - case 'F': // Erase EOF | ||
564 | - lib3270_eraseeof(qry->hSession); | ||
565 | - break; | ||
566 | - | ||
567 | - case '1': // PF1 | ||
568 | - lib3270_pfkey(qry->hSession,1); | ||
569 | - break; | ||
570 | - | ||
571 | - case '2': // PF2 | ||
572 | - lib3270_pfkey(qry->hSession,2); | ||
573 | - break; | ||
574 | - | ||
575 | - case '3': // PF3 | ||
576 | - lib3270_pfkey(qry->hSession,3); | ||
577 | - break; | ||
578 | - | ||
579 | - case '4': // PF4 | ||
580 | - lib3270_pfkey(qry->hSession,4); | ||
581 | - break; | ||
582 | - | ||
583 | - case '5': // PF5 | ||
584 | - lib3270_pfkey(qry->hSession,5); | ||
585 | - break; | ||
586 | - | ||
587 | - case '6': // PF6 | ||
588 | - lib3270_pfkey(qry->hSession,6); | ||
589 | - break; | ||
590 | - | ||
591 | - case '7': // PF7 | ||
592 | - lib3270_pfkey(qry->hSession,7); | ||
593 | - break; | ||
594 | - | ||
595 | - case '8': // PF8 | ||
596 | - lib3270_pfkey(qry->hSession,8); | ||
597 | - break; | ||
598 | - | ||
599 | - case '9': // PF9 | ||
600 | - lib3270_pfkey(qry->hSession,9); | ||
601 | - break; | ||
602 | - | ||
603 | - case 'a': // PF10 | ||
604 | - lib3270_pfkey(qry->hSession,10); | ||
605 | - break; | ||
606 | - | ||
607 | - case 'b': // PF11 | ||
608 | - lib3270_pfkey(qry->hSession,11); | ||
609 | - break; | ||
610 | - | ||
611 | - case 'c': // PF12 | ||
612 | - lib3270_pfkey(qry->hSession,12); | ||
613 | - break; | ||
614 | - } | ||
615 | - | ||
616 | - } | ||
617 | - | ||
618 | - lib3270_emulate_input(qry->hSession,buffer,-1,0); | ||
619 | - | ||
620 | - } | ||
621 | - else | ||
622 | - { | ||
623 | - lib3270_emulate_input(qry->hSession,text,strlen(text),0); | ||
624 | - } | ||
625 | - g_free(text); | ||
626 | - | ||
627 | - request_status(qry,rc); | ||
628 | - | ||
629 | - return; | ||
630 | - } | ||
631 | - | ||
632 | - request_complete(qry, error->code, error->message); | ||
633 | - g_error_free(error); | ||
634 | - | ||
635 | - } | ||
636 | - | ||
637 | - struct wait | ||
638 | - { | ||
639 | - QUERY * qry; | ||
640 | - time_t end; | ||
641 | - }; | ||
642 | - | ||
643 | - static gboolean do_wait(struct wait *w) | ||
644 | - { | ||
645 | - if(lib3270_get_program_message(w->qry->hSession) == LIB3270_MESSAGE_NONE) | ||
646 | - { | ||
647 | - request_status(w->qry,0); | ||
648 | - return FALSE; | ||
649 | - } | ||
650 | - | ||
651 | - if(time(0) > w->end) | ||
652 | - { | ||
653 | - trace("%s: TIMEOUT",__FUNCTION__); | ||
654 | - request_status(w->qry,ETIMEDOUT); | ||
655 | - return FALSE; | ||
656 | - } | ||
657 | - | ||
658 | - return TRUE; | ||
659 | - } | ||
660 | - | ||
661 | - static void cmd_wait(QUERY *qry) | ||
662 | - { | ||
663 | - struct wait *w; | ||
664 | - | ||
665 | - if(lib3270_get_program_message(qry->hSession) == LIB3270_MESSAGE_NONE) | ||
666 | - { | ||
667 | - request_status(qry,0); | ||
668 | - return; | ||
669 | - } | ||
670 | - | ||
671 | - w = g_malloc0(sizeof(struct wait)); | ||
672 | - w->qry = qry; | ||
673 | - w->end = time(0)+pw3270_get_integer(pw3270_get_toplevel(),"hllapi","wait",2); | ||
674 | - | ||
675 | - g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) 300, (GSourceFunc) do_wait, w, g_free); | ||
676 | - } | ||
677 | - | ||
678 | - static void cmd_copypstostr(QUERY *qry) | ||
679 | - { | ||
680 | - int rows; | ||
681 | - int cols; | ||
682 | - unsigned short * attr; | ||
683 | - unsigned char * text; | ||
684 | - int rc; | ||
685 | - unsigned char * buffer; | ||
686 | - size_t length; | ||
687 | - | ||
688 | - if(!lib3270_connected(qry->hSession)) | ||
689 | - { | ||
690 | - request_status(qry,ENOTCONN); | ||
691 | - return; | ||
692 | - } | ||
693 | - | ||
694 | - lib3270_get_screen_size(qry->hSession,&rows,&cols); | ||
695 | - | ||
696 | - if(qry->pos < 1 || (qry->pos+qry->length) >= (rows*cols)) | ||
697 | - { | ||
698 | - request_status(qry,EINVAL); | ||
699 | - return; | ||
700 | - } | ||
701 | - | ||
702 | - qry->pos--; | ||
703 | - | ||
704 | - length = (qry->length * sizeof(unsigned short)) + qry->length + 2; | ||
705 | - text = buffer = g_malloc0(length+1); | ||
706 | - attr = (unsigned short *) (text+qry->length+1); | ||
707 | - | ||
708 | - trace("%s: pos=%d length=%d",__FUNCTION__,qry->pos,qry->length); | ||
709 | - rc = lib3270_get_contents(qry->hSession,qry->pos,qry->pos+(qry->length-1),text,attr); | ||
710 | - | ||
711 | - if(rc) | ||
712 | - { | ||
713 | - request_status(qry,rc); | ||
714 | - } | ||
715 | - else | ||
716 | - { | ||
717 | - const gchar * charset; | ||
718 | - gchar * local; | ||
719 | - gsize bytes_read; | ||
720 | - gsize bytes_written; | ||
721 | - GError * error = NULL; | ||
722 | - | ||
723 | - trace("Text: [%s]",text); | ||
724 | - | ||
725 | - g_get_charset(&charset); | ||
726 | - | ||
727 | - local = g_convert((const gchar *) text,-1,charset,lib3270_get_charset(qry->hSession),&bytes_read,&bytes_written,&error); | ||
728 | - | ||
729 | - if(!local) | ||
730 | - { | ||
731 | - request_complete(qry,error->code,error->message); | ||
732 | - g_error_free(error); | ||
733 | - } | ||
734 | - else | ||
735 | - { | ||
736 | - strncpy((char *) text,(const char *) local,qry->length); | ||
737 | - | ||
738 | - trace("response: [%s] len=%d",buffer,length); | ||
739 | - request_buffer(qry,0,length,buffer); | ||
740 | - g_free(local); | ||
741 | - } | ||
742 | - } | ||
743 | - | ||
744 | - g_free(buffer); | ||
745 | - } | ||
746 | - | ||
747 | - static void cmd_querycursor(QUERY *qry) | ||
748 | - { | ||
749 | - request_value(qry,0,lib3270_get_cursor_address(qry->hSession)); | ||
750 | - } | ||
751 | - | ||
752 | - void enqueue_request(QUERY *qry) | ||
753 | - { | ||
754 | - static const struct _cmd | ||
755 | - { | ||
756 | - int cmd; | ||
757 | - void (*exec)(QUERY *qry); | ||
758 | - } cmd[] = | ||
759 | - { | ||
760 | - { HLLAPI_CMD_CONNECTPS, cmd_connectps }, // 1 | ||
761 | - { HLLAPI_CMD_DISCONNECTPS, cmd_disconnectps }, // 2 | ||
762 | - { HLLAPI_CMD_INPUTSTRING, cmd_sendstring }, // 3 | ||
763 | - { HLLAPI_CMD_WAIT, cmd_wait }, // 4 | ||
764 | -// { HLLAPI_CMD_COPYPS, }, // 5 | ||
765 | -// { HLLAPI_CMD_SEARCHPS, }, // 6 | ||
766 | - { HLLAPI_CMD_QUERYCURSOR, cmd_querycursor }, // 7 | ||
767 | - | ||
768 | - { HLLAPI_CMD_COPYPSTOSTR, cmd_copypstostr }, // 8 | ||
769 | - | ||
770 | -// { HLLAPI_CMD_COPYSTRTOPS }, // 15 | ||
771 | - | ||
772 | - { HLLAPI_CMD_SETCURSOR, cmd_setcursor }, // 40 | ||
773 | - | ||
774 | -// { HLLAPI_CMD_SENDFILE }, // 90 | ||
775 | -// { HLLAPI_CMD_RECEIVEFILE }, | ||
776 | - | ||
777 | - | ||
778 | - { HLLAPI_CMD_GETREVISION, cmd_getrevision }, | ||
779 | - }; | ||
780 | - | ||
781 | - | ||
782 | - | ||
783 | - int f; | ||
784 | - | ||
785 | - trace("HLLAPI function %d",(int) qry->cmd); | ||
786 | - | ||
787 | - qry->hSession = lib3270_get_default_session_handle(); | ||
788 | - | ||
789 | - for(f=0;f<G_N_ELEMENTS(cmd);f++) | ||
790 | - { | ||
791 | - if(cmd[f].cmd == qry->cmd) | ||
792 | - { | ||
793 | - cmd[f].exec(qry); | ||
794 | - return; | ||
795 | - } | ||
796 | - } | ||
797 | - | ||
798 | - g_warning("Unexpected HLLAPI function %d",(int) qry->cmd); | ||
799 | - request_status(qry,EINVAL); | ||
800 | - } | ||
801 | - | ||
802 | - G_GNUC_INTERNAL void set_active(gboolean on) | ||
803 | - { | ||
804 | - v3270_set_script(pw3270_get_terminal_widget(NULL),'H',on); | ||
805 | - } | ||
806 | - | ||
807 | -*/ |
src/plugins/remotectl/remote.c
@@ -1,334 +0,0 @@ | @@ -1,334 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como calls.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - #include <lib3270.h> | ||
31 | - #include <malloc.h> | ||
32 | - #include <string.h> | ||
33 | - #include <errno.h> | ||
34 | - #include <stdio.h> | ||
35 | - #include <time.h> | ||
36 | - #include <lib3270/log.h> | ||
37 | - | ||
38 | - #include "client.h" | ||
39 | - #include "packets.h" | ||
40 | - | ||
41 | -/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
42 | - | ||
43 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
44 | - | ||
45 | - void * hllapi_pipe_init(const char *id) | ||
46 | - { | ||
47 | - HANDLE hPipe = INVALID_HANDLE_VALUE; | ||
48 | - static DWORD dwMode = PIPE_READMODE_MESSAGE; | ||
49 | - char buffer[4096]; | ||
50 | - char * name = strdup(id); | ||
51 | - char * ptr; | ||
52 | - | ||
53 | - trace("%s(%s)",__FUNCTION__,id); | ||
54 | - | ||
55 | - for(ptr=name;*ptr;ptr++) | ||
56 | - { | ||
57 | - if(*ptr == ':') | ||
58 | - *ptr = '_'; | ||
59 | - } | ||
60 | - | ||
61 | - snprintf(buffer,4095,"\\\\.\\pipe\\%s",name); | ||
62 | - | ||
63 | - free(name); | ||
64 | - | ||
65 | - trace("Opening \"%s\"",buffer); | ||
66 | - | ||
67 | - if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) | ||
68 | - { | ||
69 | - trace("%s: Pipe not found",__FUNCTION__); | ||
70 | - errno = ENOENT; | ||
71 | - return NULL; | ||
72 | - } | ||
73 | - | ||
74 | - hPipe = CreateFile(buffer,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | ||
75 | - | ||
76 | - if(hPipe == INVALID_HANDLE_VALUE) | ||
77 | - { | ||
78 | - errno = GetLastError(); | ||
79 | - return NULL; | ||
80 | - } | ||
81 | - | ||
82 | - if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) | ||
83 | - { | ||
84 | - errno = GetLastError(); | ||
85 | - return NULL; | ||
86 | - } | ||
87 | - | ||
88 | - trace("hPipe=%p",(void *) hPipe); | ||
89 | - return hPipe; | ||
90 | - } | ||
91 | - | ||
92 | - void hllapi_pipe_deinit(void *h) | ||
93 | - { | ||
94 | - trace("%s(%p)",__FUNCTION__,h); | ||
95 | - | ||
96 | - if(!h) | ||
97 | - return; | ||
98 | - | ||
99 | - CloseHandle((HANDLE) h); | ||
100 | - } | ||
101 | - | ||
102 | - const char * hllapi_pipe_get_revision(void) | ||
103 | - { | ||
104 | - return PACKAGE_REVISION; | ||
105 | - } | ||
106 | - | ||
107 | - int hllapi_pipe_connect(void *h, const char *n, int wait) | ||
108 | - { | ||
109 | - struct hllapi_packet_connect * pkt; | ||
110 | - struct hllapi_packet_result response; | ||
111 | - DWORD cbSize; | ||
112 | - | ||
113 | - if(!n) | ||
114 | - n = ""; | ||
115 | - | ||
116 | - cbSize = sizeof(struct hllapi_packet_connect)+strlen(n); | ||
117 | - pkt = malloc(cbSize); | ||
118 | - | ||
119 | - pkt->packet_id = HLLAPI_PACKET_CONNECT; | ||
120 | - pkt->wait = (unsigned char) wait; | ||
121 | - strcpy(pkt->hostname,n); | ||
122 | - | ||
123 | - trace("Sending %s",pkt->hostname); | ||
124 | - | ||
125 | - if(!TransactNamedPipe((HANDLE) h,(LPVOID) pkt, cbSize, &response, sizeof(response), &cbSize,NULL)) | ||
126 | - { | ||
127 | - errno = GetLastError(); | ||
128 | - response.rc = -1; | ||
129 | - } | ||
130 | - | ||
131 | - free(pkt); | ||
132 | - | ||
133 | - return response.rc; | ||
134 | - } | ||
135 | - | ||
136 | - void hllapi_pipe_disconnect(void *h) | ||
137 | - { | ||
138 | - static const struct hllapi_packet_query query = { HLLAPI_PACKET_DISCONNECT }; | ||
139 | - struct hllapi_packet_result response; | ||
140 | - DWORD cbSize = sizeof(query); | ||
141 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
142 | - } | ||
143 | - | ||
144 | - LIB3270_MESSAGE hllapi_pipe_get_message(void *h) | ||
145 | - { | ||
146 | - static const struct hllapi_packet_query query = { HLLAPI_PACKET_GET_PROGRAM_MESSAGE }; | ||
147 | - struct hllapi_packet_result response; | ||
148 | - DWORD cbSize = sizeof(query); | ||
149 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
150 | - return (LIB3270_MESSAGE) response.rc; | ||
151 | - } | ||
152 | - | ||
153 | - char * hllapi_pipe_get_text_at(void *h, int row, int col, int len) | ||
154 | - { | ||
155 | - struct hllapi_packet_query_at query = { HLLAPI_PACKET_GET_TEXT_AT, }; | ||
156 | - struct hllapi_packet_text * response; | ||
157 | - DWORD cbSize = sizeof(struct hllapi_packet_text)+len; | ||
158 | - char * text = NULL; | ||
159 | - | ||
160 | - response = malloc(cbSize+2); | ||
161 | - memset(response,0,cbSize+2); | ||
162 | - | ||
163 | - if(!TransactNamedPipe((HANDLE) h,(LPVOID) &query, sizeof(struct hllapi_packet_query_at), &response, cbSize, &cbSize,NULL)) | ||
164 | - return NULL; | ||
165 | - | ||
166 | - if(response->packet_id) | ||
167 | - errno = response->packet_id; | ||
168 | - else | ||
169 | - text = strdup(response->text); | ||
170 | - | ||
171 | - free(response); | ||
172 | - return text; | ||
173 | - } | ||
174 | - | ||
175 | - int hllapi_pipe_enter(void *h) | ||
176 | - { | ||
177 | - static const struct hllapi_packet_query query = { HLLAPI_PACKET_ENTER }; | ||
178 | - struct hllapi_packet_result response; | ||
179 | - DWORD cbSize = sizeof(query); | ||
180 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
181 | - return response.rc; | ||
182 | - } | ||
183 | - | ||
184 | - int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str) | ||
185 | - { | ||
186 | - struct hllapi_packet_text_at * query; | ||
187 | - struct hllapi_packet_result response; | ||
188 | - DWORD cbSize = sizeof(struct hllapi_packet_text_at)+strlen((const char *) str); | ||
189 | - | ||
190 | - query = malloc(cbSize); | ||
191 | - query->packet_id = HLLAPI_PACKET_SET_TEXT_AT; | ||
192 | - query->row = row; | ||
193 | - query->col = col; | ||
194 | - strcpy(query->text,(const char *) str); | ||
195 | - | ||
196 | - TransactNamedPipe((HANDLE) h,(LPVOID) query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
197 | - | ||
198 | - free(query); | ||
199 | - | ||
200 | - return response.rc; | ||
201 | - } | ||
202 | - | ||
203 | - int hllapi_pipe_cmp_text_at(void *h, int row, int col, const char *text) | ||
204 | - { | ||
205 | - struct hllapi_packet_text_at * query; | ||
206 | - struct hllapi_packet_result response; | ||
207 | - DWORD cbSize = sizeof(struct hllapi_packet_text_at)+strlen(text); | ||
208 | - | ||
209 | - query = malloc(cbSize); | ||
210 | - query->packet_id = HLLAPI_PACKET_CMP_TEXT_AT; | ||
211 | - query->row = row; | ||
212 | - query->col = col; | ||
213 | - strcpy(query->text,text); | ||
214 | - | ||
215 | - TransactNamedPipe((HANDLE) h,(LPVOID) query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
216 | - | ||
217 | - free(query); | ||
218 | - | ||
219 | - return response.rc; | ||
220 | - } | ||
221 | - | ||
222 | - int hllapi_pipe_pfkey(void *h, int key) | ||
223 | - { | ||
224 | - struct hllapi_packet_keycode query = { HLLAPI_PACKET_PFKEY, key }; | ||
225 | - struct hllapi_packet_result response; | ||
226 | - DWORD cbSize = sizeof(query); | ||
227 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
228 | - return response.rc; | ||
229 | - } | ||
230 | - | ||
231 | - int hllapi_pipe_pakey(void *h, int key) | ||
232 | - { | ||
233 | - struct hllapi_packet_keycode query = { HLLAPI_PACKET_PAKEY, key }; | ||
234 | - struct hllapi_packet_result response; | ||
235 | - DWORD cbSize = sizeof(query); | ||
236 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
237 | - return response.rc; | ||
238 | - } | ||
239 | - | ||
240 | - void hllapi_pipe_release_memory(void *p) | ||
241 | - { | ||
242 | - free(p); | ||
243 | - } | ||
244 | - | ||
245 | - int hllapi_pipe_wait_for_ready(void *h, int seconds) | ||
246 | - { | ||
247 | - time_t end = time(0)+seconds; | ||
248 | - | ||
249 | - while(time(0) < end) | ||
250 | - { | ||
251 | - if(!hllapi_pipe_is_connected(h)) | ||
252 | - return ENOTCONN; | ||
253 | - | ||
254 | - if(hllapi_pipe_get_message(h) == 0) | ||
255 | - return 0; | ||
256 | - Sleep(250); | ||
257 | - } | ||
258 | - | ||
259 | - return ETIMEDOUT; | ||
260 | - } | ||
261 | - | ||
262 | - int hllapi_pipe_is_connected(void *h) | ||
263 | - { | ||
264 | - static const struct hllapi_packet_query query = { HLLAPI_PACKET_IS_CONNECTED }; | ||
265 | - struct hllapi_packet_result response; | ||
266 | - DWORD cbSize = sizeof(query); | ||
267 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
268 | - return (LIB3270_MESSAGE) response.rc; | ||
269 | - } | ||
270 | - | ||
271 | - int hllapi_pipe_sleep(void *h, int seconds) | ||
272 | - { | ||
273 | - time_t end = time(0)+seconds; | ||
274 | - | ||
275 | - while(time(0) < end) | ||
276 | - { | ||
277 | - if(!hllapi_pipe_is_connected(h)) | ||
278 | - return ENOTCONN; | ||
279 | - Sleep(500); | ||
280 | - } | ||
281 | - | ||
282 | - return 0; | ||
283 | - } | ||
284 | - | ||
285 | - int hllapi_pipe_getcursor(void *h) | ||
286 | - { | ||
287 | - static const struct hllapi_packet_query query = { HLLAPI_PACKET_GET_CURSOR }; | ||
288 | - struct hllapi_packet_result response; | ||
289 | - DWORD cbSize = sizeof(query); | ||
290 | - | ||
291 | - trace("%s",__FUNCTION__); | ||
292 | - | ||
293 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
294 | - return (LIB3270_MESSAGE) response.rc; | ||
295 | - | ||
296 | - } | ||
297 | - | ||
298 | - int hllapi_pipe_setcursor(void *h, int baddr) | ||
299 | - { | ||
300 | - struct hllapi_packet_addr query = { HLLAPI_PACKET_SET_CURSOR, baddr }; | ||
301 | - struct hllapi_packet_result response; | ||
302 | - DWORD cbSize = sizeof(query); | ||
303 | - | ||
304 | - trace("%s(%d)",__FUNCTION__,query.addr); | ||
305 | - | ||
306 | - TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); | ||
307 | - return response.rc; | ||
308 | - } | ||
309 | - | ||
310 | - char * hllapi_pipe_get_text(void *h, int offset, int len) | ||
311 | - { | ||
312 | - struct hllapi_packet_query_offset query = { HLLAPI_PACKET_GET_TEXT_AT_OFFSET, offset, len }; | ||
313 | - struct hllapi_packet_text * response; | ||
314 | - DWORD cbSize = sizeof(struct hllapi_packet_text)+len; | ||
315 | - char * text = NULL; | ||
316 | - | ||
317 | - trace("cbSize=%d",(int) cbSize); | ||
318 | - | ||
319 | - response = malloc(cbSize+2); | ||
320 | - memset(response,0,cbSize+2); | ||
321 | - | ||
322 | - if(!TransactNamedPipe((HANDLE) h,(LPVOID) &query, sizeof(query), response, cbSize, &cbSize,NULL)) | ||
323 | - return NULL; | ||
324 | - | ||
325 | - trace("rc=%d",response->packet_id); | ||
326 | - | ||
327 | - if(response->packet_id) | ||
328 | - errno = response->packet_id; | ||
329 | - else | ||
330 | - text = strdup(response->text); | ||
331 | - | ||
332 | - free(response); | ||
333 | - return text; | ||
334 | - } |
src/plugins/remotectl/remotectl.h
@@ -1,85 +0,0 @@ | @@ -1,85 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como remotectl.h e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - * Agradecimento: | ||
29 | - * | ||
30 | - * Hélio Passos | ||
31 | - * | ||
32 | - */ | ||
33 | - | ||
34 | - #define ENABLE_NLS | ||
35 | - #define GETTEXT_PACKAGE PACKAGE_NAME | ||
36 | - | ||
37 | - #include <libintl.h> | ||
38 | - #include <glib/gi18n.h> | ||
39 | - #include <gtk/gtk.h> | ||
40 | - | ||
41 | - #include <lib3270.h> | ||
42 | - #include <lib3270/log.h> | ||
43 | - #include <pw3270/hllapi.h> | ||
44 | - | ||
45 | - typedef struct _remotequery | ||
46 | - { | ||
47 | -#ifdef WIN32 | ||
48 | - HANDLE hPipe; /**< Pipe handle (for response) */ | ||
49 | -#endif // WIN32 | ||
50 | - | ||
51 | - H3270 * hSession; /**< 3270 Session */ | ||
52 | - int cmd; /**< Command */ | ||
53 | - int rc; /**< Response status */ | ||
54 | - | ||
55 | - int pos; | ||
56 | - unsigned short length; /**< Query string length */ | ||
57 | - const gchar * text; /**< Query string */ | ||
58 | - | ||
59 | - } QUERY; | ||
60 | - | ||
61 | - G_GNUC_INTERNAL void set_active(gboolean on); | ||
62 | - G_GNUC_INTERNAL void enqueue_request(QUERY *qry); | ||
63 | - G_GNUC_INTERNAL void request_complete(QUERY *qry, int rc, const gchar *text); | ||
64 | - | ||
65 | - G_GNUC_INTERNAL void request_status(QUERY *qry, int rc); | ||
66 | - G_GNUC_INTERNAL void request_value(QUERY *qry, int rc, unsigned int value); | ||
67 | - G_GNUC_INTERNAL void request_buffer(QUERY *qry, int rc, size_t sz, const gpointer buffer); | ||
68 | - | ||
69 | -// int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc); | ||
70 | - | ||
71 | - | ||
72 | -#ifdef WIN32 | ||
73 | - | ||
74 | - #define PIPE_BUFFER_LENGTH 8192 | ||
75 | - | ||
76 | - void init_source_pipe(HANDLE hPipe); | ||
77 | - void popup_lasterror(const gchar *fmt, ...); | ||
78 | - | ||
79 | -#endif // WIN32 | ||
80 | - | ||
81 | - | ||
82 | - | ||
83 | - | ||
84 | - | ||
85 | - |
src/plugins/remotectl/server.h
@@ -1,51 +0,0 @@ | @@ -1,51 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como server.h e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - #include <lib3270/config.h> | ||
31 | - #define ENABLE_NLS | ||
32 | - #define GETTEXT_PACKAGE PACKAGE_NAME | ||
33 | - | ||
34 | - #include <libintl.h> | ||
35 | - #include <glib/gi18n.h> | ||
36 | - #include <gtk/gtk.h> | ||
37 | - | ||
38 | - #include <lib3270.h> | ||
39 | - #include <lib3270/log.h> | ||
40 | - #include <pw3270.h> | ||
41 | - #include <pw3270/hllapi.h> | ||
42 | - | ||
43 | - #include <windows.h> | ||
44 | - | ||
45 | - #define PIPE_BUFFER_LENGTH HLLAPI_MAXLENGTH+30 | ||
46 | - | ||
47 | - #define set_active(x) /* x */ | ||
48 | - | ||
49 | - | ||
50 | - G_GNUC_INTERNAL void popup_lasterror(const gchar *fmt, ...); | ||
51 | - |
src/plugins/remotectl/testprogram.c
@@ -1,139 +0,0 @@ | @@ -1,139 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | ||
19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como testprogram.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * | ||
28 | - */ | ||
29 | - | ||
30 | - #include <windows.h> | ||
31 | - #include <stdio.h> | ||
32 | - #include <time.h> | ||
33 | - #include <pw3270/hllapi.h> | ||
34 | - | ||
35 | - #define BUFFER_LENGTH 8000 | ||
36 | - | ||
37 | -/*---[ Implement ]--------------------------------------------------------------------------------*/ | ||
38 | - | ||
39 | - int main(int numpar, char *param[]) | ||
40 | - { | ||
41 | - const char *session = "pw3270:a"; | ||
42 | - | ||
43 | - printf("init(%s)=%d\n",session,(int) hllapi_init((LPSTR) session)); | ||
44 | - printf("revision=%d\n",(int) hllapi_get_revision()); | ||
45 | - printf("connect=%d\n",(int) hllapi_connect("fandezhi.efglobe.com:23",0)); | ||
46 | - printf("wait=%d\n",(int) hllapi_wait(3)); | ||
47 | - printf("connected=%s\n",(int) hllapi_is_connected() ? "Yes" : "No"); | ||
48 | - | ||
49 | -// printf("disconnect=%d\n",(int) hllapi_disconnect("fandezhi.efglobe.com:23",1)); | ||
50 | - | ||
51 | - | ||
52 | - printf("deinit=%d\n",(int) hllapi_deinit()); | ||
53 | - | ||
54 | -/* | ||
55 | - DWORD revision; | ||
56 | - int rc; | ||
57 | - | ||
58 | - rc = hllapi_init(""); | ||
59 | - if(rc) | ||
60 | - { | ||
61 | - printf("Init exits with rc=%d\n",rc); | ||
62 | - return rc; | ||
63 | - } | ||
64 | - | ||
65 | - if(!hllapi_get_revision(&revision)) | ||
66 | - printf("Library revision is %d\n",(int) revision); | ||
67 | - | ||
68 | - | ||
69 | - printf("Deinit exits with rc=%d\n",rc); | ||
70 | - rc = hllapi_deinit(); | ||
71 | -*/ | ||
72 | - return 0; | ||
73 | - } | ||
74 | - | ||
75 | -/* | ||
76 | - int main(int numpar, char *param[]) | ||
77 | - { | ||
78 | - char buffer[BUFFER_LENGTH]; | ||
79 | - unsigned short rc; | ||
80 | - unsigned short len; | ||
81 | - unsigned long fn; | ||
82 | - | ||
83 | - static const struct _cmd | ||
84 | - { | ||
85 | - const char * name; | ||
86 | - unsigned short fn; | ||
87 | - const char * arg; | ||
88 | - } cmd[] = | ||
89 | - { | ||
90 | - { "GetRevision", HLLAPI_CMD_GETREVISION, " " }, | ||
91 | - { "ConnectPS", HLLAPI_CMD_CONNECTPS, "pw3270A" }, | ||
92 | - { "InputString", HLLAPI_CMD_INPUTSTRING, "test" }, | ||
93 | - | ||
94 | - }; | ||
95 | - | ||
96 | - int f; | ||
97 | - | ||
98 | - | ||
99 | - for(f=0;f< (sizeof(cmd)/sizeof(struct _cmd)); f++) | ||
100 | - { | ||
101 | - len = strlen(cmd[f].arg); | ||
102 | - memcpy(buffer,cmd[f].arg,len); | ||
103 | - hllapi((LPWORD) &cmd[f].fn,buffer,&len,&rc); | ||
104 | - printf("%s exits with rc=%d\n[%s]\n",cmd[f].name,rc,buffer); | ||
105 | - } | ||
106 | - | ||
107 | - len = 80; | ||
108 | - rc = 1040; | ||
109 | - fn = HLLAPI_CMD_COPYPSTOSTR; | ||
110 | - hllapi((LPWORD) &fn,buffer,&len,&rc); | ||
111 | - printf("%s exits with rc=%d\n%s\n","HLLAPI_CMD_COPYPSTOSTR",rc,buffer); | ||
112 | - | ||
113 | - // Performance | ||
114 | - len = strlen(cmd[0].arg); | ||
115 | - memcpy(buffer,cmd[0].arg,len); | ||
116 | - if(hllapi((LPWORD) &cmd[0].fn,buffer,&len,&rc) == 0 && rc == 0) | ||
117 | - { | ||
118 | - time_t end = time(0) + 5; | ||
119 | - int qtd = 0; | ||
120 | - do | ||
121 | - { | ||
122 | - qtd++; | ||
123 | - } while(hllapi((LPWORD) &cmd[0].fn,buffer,&len,&rc) == 0 && rc == 0 && time(0)<end); | ||
124 | - printf("%d interacoes em 5 segundos (rc=%d)\n",qtd,rc); | ||
125 | - | ||
126 | - } | ||
127 | - | ||
128 | - // Disconnect | ||
129 | - len = 10; | ||
130 | - rc = 1; | ||
131 | - fn = HLLAPI_CMD_DISCONNECTPS; | ||
132 | - *buffer = 0; | ||
133 | - hllapi((LPWORD) &fn,buffer,&len,&rc); | ||
134 | - printf("%s exits with rc=%d\n[%s]\n","HLLAPI_CMD_DISCONNECTPS",rc,buffer); | ||
135 | - | ||
136 | - | ||
137 | - return 0; | ||
138 | - } | ||
139 | -*/ |