blob: b52f9bb97506ca6ac2a67481d95eeaa76ff6d669 [file] [log] [blame]
/*
* $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 */