/* * $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 */ /* needs: ws2_32.lib */ #ifndef _MSC_VER #include #include #include #include #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 */