| /* |
| * $Id: dumb.trm,v 1.16 2004/04/13 17:24:16 broeker Exp $ |
| * |
| */ |
| |
| /* GNUPLOT - qtopia.trm */ |
| |
| /*[ |
| * Copyright 1991 - 1993, 1998, 2004 Thomas Williams, Colin Kelley |
| * |
| * Permission to use, copy, and distribute this software and its |
| * documentation for any purpose with or without fee is hereby granted, |
| * provided that the above copyright notice appear in all copies and |
| * that both that copyright notice and this permission notice appear |
| * in supporting documentation. |
| * |
| * Permission to modify the software is granted, but not the right to |
| * distribute the complete modified source code. Modifications are to |
| * be distributed as patches to the released version. Permission to |
| * distribute binaries produced by compiling modified sources is granted, |
| * provided you |
| * 1. distribute the corresponding source modifications from the |
| * released version in the form of a patch file along with the binaries, |
| * 2. add special version identification to distinguish your version |
| * in addition to the base release version number, |
| * 3. provide your name and address as the primary contact for the |
| * support of your modified version, and |
| * 4. retain our contact information in regard to use of the base |
| * software. |
| * Permission to distribute the released version of the source code along |
| * with corresponding source modifications in the form of a patch file is |
| * granted with same provisions 2 through 4 for binary distributions. |
| * |
| * This software is provided "as is" without express or implied warranty |
| * to the extent permitted by applicable law. |
| ]*/ |
| |
| /* |
| * This file is included by ../term.c. |
| * |
| * This terminal driver supports: |
| * qtopia terminals |
| * |
| * AUTHORS |
| * Michael Neuroth, 2004-05-16 |
| * INTERNET: michael.neuroth@freenet.de |
| * |
| * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net). |
| * |
| */ |
| #include "driver.h" |
| |
| #define NO_QTOPIA_ENHANCED_SUPPORT |
| |
| #ifdef TERM_REGISTER |
| register_term(qtopia_driver) |
| #endif |
| |
| #ifdef TERM_PROTO |
| TERM_PUBLIC void QTOPIA_options __PROTO((void)); |
| TERM_PUBLIC void QTOPIA_init __PROTO((void)); |
| TERM_PUBLIC void QTOPIA_graphics __PROTO((void)); |
| TERM_PUBLIC void QTOPIA_text __PROTO((void)); |
| TERM_PUBLIC void QTOPIA_reset __PROTO((void)); |
| TERM_PUBLIC void QTOPIA_linetype __PROTO((int linetype)); |
| TERM_PUBLIC void QTOPIA_move __PROTO((unsigned int x, unsigned int y)); |
| TERM_PUBLIC void QTOPIA_point __PROTO((unsigned int x, unsigned int y, |
| int point)); |
| TERM_PUBLIC void QTOPIA_vector __PROTO((unsigned int x, unsigned int y)); |
| TERM_PUBLIC void QTOPIA_put_text __PROTO((unsigned int x, unsigned int y, |
| const char *str)); |
| TERM_PUBLIC void QTOPIA_arrow __PROTO((unsigned int sx, unsigned int sy, |
| unsigned int ex, unsigned int ey, |
| int head)); |
| |
| #define ENHqtopia_put_text NULL |
| |
| |
| #define QTOPIA_XMAX 4096 |
| #define QTOPIA_YMAX 4096 |
| |
| #ifdef ZAURUS |
| #define QTOPIA_VCHAR (QTOPIA_YMAX/25) |
| #define QTOPIA_HCHAR (QTOPIA_XMAX/40) |
| #define QTOPIA_VTIC (QTOPIA_YMAX/50) |
| #define QTOPIA_HTIC (QTOPIA_XMAX/40) |
| #else |
| #define QTOPIA_VCHAR (QTOPIA_YMAX/25) |
| #define QTOPIA_HCHAR (QTOPIA_XMAX/50) |
| #define QTOPIA_VTIC (QTOPIA_YMAX/100) |
| #define QTOPIA_HTIC (QTOPIA_XMAX/150) |
| #endif |
| |
| #endif /* TERM_PROTO */ |
| |
| #ifdef TERM_BODY |
| |
| /*#include <winsock2.h>*/ |
| /* needs: ws2_32.lib */ |
| #ifndef _MSC_VER |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #endif |
| |
| #define QTOPIA_MAX_BUFFER 512 |
| #define QTOPIA_MAX_DELAY_COUNT 20 /* * 100 ms = 2 s */ |
| |
| #ifdef _MSC_VER |
| #define QTOPIA_BAD_SOCKET INVALID_SOCKET /* -1 */ |
| #define QTOPIA_BAD_CONNECT SOCKET_ERROR |
| #else |
| #define QTOPIA_BAD_SOCKET -1 |
| #define QTOPIA_BAD_CONNECT -1 |
| #endif |
| #define QTOPIA_PORT_NO 5050 |
| |
| static int qtopia_client_socket = QTOPIA_BAD_SOCKET; |
| static unsigned short qtopia_port_no = QTOPIA_PORT_NO; |
| static char qtopia_host_name[QTOPIA_MAX_BUFFER+1] = { "localhost" }; |
| |
| static int OpenClient __PROTO(( int test)); |
| static void CloseClient(); |
| |
| static void MySleep( delay ) |
| int delay; |
| { |
| #ifdef _MSC_VER |
| Sleep( delay ); |
| #else |
| usleep( delay ); |
| #endif |
| } |
| |
| static void InitSockets() |
| { |
| #ifdef _MSC_VER |
| WORD wVersionRequested; |
| WSADATA wsaData; |
| int err; |
| |
| wVersionRequested = MAKEWORD( 2, 2 ); |
| |
| err = WSAStartup( wVersionRequested, &wsaData ); |
| #endif |
| } |
| |
| static void ExitSockets() |
| { |
| #ifdef _MSC_VER |
| WSACleanup(); |
| #endif |
| } |
| |
| static int CheckForQtplot( count ) |
| int count; |
| { |
| /* test (via sockets) if qtplot is allready running */ |
| if( !OpenClient( 1 ) ) |
| { |
| /* give qtplot a litle bit time to start... */ |
| if( count < QTOPIA_MAX_DELAY_COUNT ) |
| { |
| if( count == 0 ) |
| { |
| #ifdef _MSC_VER |
| system( "start qtplot" ); |
| #else |
| system( "qtplot&" ); |
| #endif |
| } |
| |
| MySleep(100); |
| |
| return CheckForQtplot( count+1 ); |
| } |
| else |
| { |
| return 0; |
| } |
| } |
| else |
| { |
| CloseClient(); |
| |
| return 1; |
| } |
| } |
| |
| static int OpenClient( test ) |
| int test; |
| { |
| int len; |
| struct sockaddr_in address; |
| int result; |
| |
| /* Create a socket for the client. */ |
| |
| qtopia_client_socket = socket(AF_INET, SOCK_STREAM, 0); |
| |
| if( qtopia_client_socket != QTOPIA_BAD_SOCKET ) |
| { |
| /* Name the socket, as agreed with the server. */ |
| |
| address.sin_family = AF_INET; |
| address.sin_addr.s_addr = inet_addr(/*qtopia_host_name*/"127.0.0.1"); /* localhost */ |
| address.sin_port = htons(qtopia_port_no); |
| len = sizeof(address); |
| |
| /* Now connect our socket to the server's socket. */ |
| |
| result = connect(qtopia_client_socket, (struct sockaddr *)&address, len); |
| |
| if( result == QTOPIA_BAD_SOCKET ) |
| { |
| /* mark this socket as bad */ |
| |
| close( qtopia_client_socket ); |
| |
| qtopia_client_socket = QTOPIA_BAD_SOCKET; |
| |
| if( !test ) |
| { |
| fprintf( gpoutfile, "error connecting to server !\n" ); |
| } |
| return 0; /* something went wrong */ |
| } |
| } |
| else |
| { |
| if( !test ) |
| { |
| fprintf( gpoutfile, "error creating socket !\n" ); |
| } |
| return 0; /* something went wrong */ |
| } |
| |
| return 1; /* everything ist ok ! */ |
| } |
| |
| static void CloseClient() |
| { |
| close( qtopia_client_socket ); |
| } |
| |
| static int IsClientOk() |
| { |
| return qtopia_client_socket != QTOPIA_BAD_SOCKET; |
| } |
| |
| static void SendDataToSocket( sLine ) |
| const char * sLine; |
| { |
| if( IsClientOk() ) |
| { |
| int send_count; |
| |
| send_count = send( qtopia_client_socket, sLine, strlen( sLine ), 0 ); |
| |
| if( send_count <= 0 ) |
| { |
| fprintf( gpoutfile, "error writing to socket str=%s!\n", sLine ); |
| } |
| /* |
| else |
| { |
| fprintf( gpoutfile, "wrote %d bytes\n", send_count ); |
| } |
| */ |
| } |
| else |
| { |
| /* for testing... */ |
| /*fprintf( gpoutfile, sLine );*/ |
| } |
| } |
| |
| /* ************************************************** */ |
| |
| enum QTOPIA_id { QTOPIA_PORT, QTOPIA_HOST, QTOPIA_OTHER }; |
| |
| static struct gen_table QTOPIA_opts[] = |
| { |
| { "po$rt", QTOPIA_PORT }, |
| { "ho$st", QTOPIA_HOST }, |
| { NULL, QTOPIA_OTHER } |
| }; |
| |
| TERM_PUBLIC void |
| QTOPIA_options() |
| { |
| /* this is not for the qtopia terminal ! */ |
| /*SendDataToSocket( "qtd options\n" );*/ |
| |
| int x, y; |
| struct value a; |
| |
| while (!END_OF_COMMAND) |
| { |
| switch(lookup_table(&QTOPIA_opts[0],c_token)) |
| { |
| case QTOPIA_PORT: |
| c_token++; |
| if (END_OF_COMMAND) |
| int_error(c_token, "expecting port number"); |
| qtopia_port_no = (int) real(const_express(&a)); |
| break; |
| case QTOPIA_HOST: |
| c_token++; |
| if (END_OF_COMMAND) |
| int_error(c_token, "expecting host name"); |
| if (isstring(c_token)) |
| quote_str( qtopia_host_name, c_token, sizeof(qtopia_host_name) ); |
| else |
| copy_str( qtopia_host_name, c_token, sizeof(qtopia_host_name) ); |
| c_token++; |
| break; |
| case QTOPIA_OTHER: |
| default: |
| break; |
| } |
| } |
| |
| sprintf(term_options, "host=%s port=%d",qtopia_host_name,qtopia_port_no); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_init() |
| { |
| /* initialize lib (if necassary) */ |
| InitSockets(); |
| CheckForQtplot( 0 ); |
| OpenClient( 0 ); |
| |
| SendDataToSocket( "qtd init\n" ); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_graphics() |
| { |
| SendDataToSocket( "qtd graphics\n" ); |
| } |
| |
| TERM_PUBLIC void |
| QTOPIA_text() |
| { |
| SendDataToSocket( "qtd text\n" ); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_reset() |
| { |
| SendDataToSocket( "qtd reset\n" ); |
| |
| /* give the qtplot a litle bit time to shutdown */ |
| MySleep(100); |
| |
| CloseClient(); |
| ExitSockets(); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_linetype(linetype) |
| int linetype; |
| { |
| char sBuffer[QTOPIA_MAX_BUFFER]; |
| |
| sprintf( sBuffer, "qtd linetype type=%d\n",linetype ); |
| |
| SendDataToSocket( sBuffer ); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_move(x, y) |
| unsigned int x, y; |
| { |
| char sBuffer[QTOPIA_MAX_BUFFER]; |
| |
| sprintf( sBuffer, "qtd move x=%d y=%d\n",x,y ); |
| |
| SendDataToSocket( sBuffer ); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_point(x, y, point) |
| unsigned int x, y; |
| int point; |
| { |
| char sBuffer[QTOPIA_MAX_BUFFER]; |
| |
| sprintf( sBuffer, "qtd point x=%d y=%d point=%d\n",x,y,point ); |
| |
| SendDataToSocket( sBuffer ); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_vector(_x, _y) |
| unsigned int _x, _y; |
| { |
| char sBuffer[QTOPIA_MAX_BUFFER]; |
| |
| sprintf( sBuffer, "qtd vector x=%d y=%d\n",_x,_y ); |
| |
| SendDataToSocket( sBuffer ); |
| } |
| |
| |
| TERM_PUBLIC void |
| QTOPIA_put_text(x, y, str) |
| unsigned int x, y; |
| const char *str; |
| { |
| char sBuffer[QTOPIA_MAX_BUFFER]; |
| |
| sprintf( sBuffer, "qtd put_text x=%d y=%d str=%s\n",x,y,str ); |
| |
| SendDataToSocket( sBuffer ); |
| } |
| |
| /* not suported yet ! */ |
| TERM_PUBLIC void |
| QTOPIA_arrow(sx, sy, ex, ey, head) |
| unsigned int sx, sy, ex, ey; |
| int head; /* ignored */ |
| { |
| char sBuffer[QTOPIA_MAX_BUFFER]; |
| |
| sprintf( sBuffer, "qtd arrow sx=%d sy=%d ex=%d ey=%d head=%d\n",sx,sy,ex,ey,head ); |
| |
| SendDataToSocket( sBuffer ); |
| } |
| |
| |
| #endif /* TERM_BODY */ |
| |
| #ifdef TERM_TABLE |
| TERM_TABLE_START(qtopia_driver) |
| "qtopia", "qtopia or Qt", |
| QTOPIA_XMAX, QTOPIA_YMAX, QTOPIA_VCHAR, QTOPIA_HCHAR, |
| QTOPIA_VTIC, QTOPIA_HTIC, QTOPIA_options, QTOPIA_init, QTOPIA_reset, |
| QTOPIA_text, null_scale, QTOPIA_graphics, QTOPIA_move, QTOPIA_vector, |
| QTOPIA_linetype, QTOPIA_put_text, null_text_angle, |
| null_justify_text, QTOPIA_point, /*QTOPIA_arrow*/0, set_font_null, |
| 0, /* pointsize */ |
| TERM_CAN_MULTIPLOT, |
| NULL, NULL, NULL, NULL |
| #ifdef USE_MOUSE |
| , NULL, NULL, NULL, NULL, NULL |
| #endif |
| #ifdef PM3D |
| , NULL, NULL, NULL, NULL |
| #endif |
| TERM_TABLE_END(qtopia_driver) |
| |
| #undef LAST_TERM |
| #define LAST_TERM qtopia_driver |
| |
| #endif /* TERM_TABLE */ |
| |
| #ifdef TERM_HELP |
| START_HELP(qtopia) |
| "1 qtopia", |
| "?commands set terminal qtopia", |
| "?set terminal qtopia", |
| "?set term qtopia", |
| "?terminal qtopia", |
| "?term qtopia", |
| "?qtopia", |
| " The `qtopia` terminal driver has no additional options.", |
| "", |
| " Syntax:", |
| " set terminal qtopia", |
| "" |
| END_HELP(qtopia) |
| #endif /* TERM_HELP */ |