From 59a74a3adf40b9f55f51cb4084754e00b6d0dc1a Mon Sep 17 00:00:00 2001 From: erg Date: Thu, 14 May 2009 16:32:53 +0000 Subject: [PATCH] Implement and hook in Unix-based access to gvpr --- cmd/smyrna/Makefile.am | 4 +- cmd/smyrna/gvprpipe.c | 322 +++++++++++++++++++++-------------------- cmd/smyrna/gvprpipe.h | 25 +++- cmd/smyrna/viewport.c | 2 - 4 files changed, 188 insertions(+), 165 deletions(-) diff --git a/cmd/smyrna/Makefile.am b/cmd/smyrna/Makefile.am index c29b53b0f..300adf4ce 100644 --- a/cmd/smyrna/Makefile.am +++ b/cmd/smyrna/Makefile.am @@ -16,7 +16,7 @@ AM_CPPFLAGS = \ noinst_HEADERS = btree.h draw.h filter.h glexpose.h glmotion.h gltemplate.h \ hier.h materials.h selection.h smyrnadefs.h support.h topview.h \ topviewdata.h topviewdefs.h trackball.h tvnodes.h viewport.h \ - topfisheyeview.h viewportcamera.h \ + topfisheyeview.h viewportcamera.h gvprpipe.h \ gui/callbacks.h gui/datalistcallbacks.h gui/filterscallbacks.h \ gui/glmenu.h gui/gui.h gui/menucallbacks.h gui/toolboxcallbacks.h md5.h \ gui/topviewsettings.h gui/beacon.h @@ -27,7 +27,7 @@ endif smyrna_SOURCES = btree.c draw.c filter.c glexpose.c glmotion.c gltemplate.c \ hier.c main.c selection.c support.c template.c topview.c topviewdata.c \ topfisheyeview.c trackball.c tvnodes.c viewport.c viewportcamera.c \ - gui/beacon.c gui/callbacks.c gui/datalistcallbacks.c \ + gvprpipe.c gui/beacon.c gui/callbacks.c gui/datalistcallbacks.c \ gui/filterscallbacks.c gui/glmenu.c gui/gui.c gui/menucallbacks.c \ gui/toolboxcallbacks.c gui/topviewsettings.c md5.c diff --git a/cmd/smyrna/gvprpipe.c b/cmd/smyrna/gvprpipe.c index 359574dd4..16a456e1c 100644 --- a/cmd/smyrna/gvprpipe.c +++ b/cmd/smyrna/gvprpipe.c @@ -1,108 +1,128 @@ +/* $Id$Revision: */ +/* vim:set shiftwidth=4 ts=8: */ + +/********************************************************** +* This software is part of the graphviz package * +* http://www.graphviz.org/ * +* * +* Copyright (c) 1994-2004 AT&T Corp. * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Corp. * +* * +* Information and Software Systems Research * +* AT&T Research, Florham Park NJ * +**********************************************************/ + #include "gvprpipe.h" +#include #ifdef WIN32 - #define BUFSIZE 4096 +#include +#include +#include +#endif + +#include +#include + +#ifdef WIN32 + +/* two pipes + * 1 between smyrna and gvpr + * SmyrnaToGvprIn : write end of pipe , active graph's fread uses + * SmyrnaToGvprROut: read end of pipe , created process' std in uses + * 1 between gvpr and smyrna + * GvprToSmyrnaIn :write end of pipe, created process' stdout uses + * GvprToSmyrnaOut :read end of pipe, new graph's fread uses + */ + +static HANDLE GvprToSmyrnaWr; +static HANDLE GvprToSmyrnaRd; +static HANDLE SmyrnaToGvprWr; +static HANDLE SmyrnaToGvprRd; +static SECURITY_ATTRIBUTES saAttr; /*cgraph wrappers*/ -int cgraph_flush_wrapper(void*); -int cgraph_write_wrapper(void *chan, char *str); -int cgraph_read_wrapper (void* ch,char* bf,int sz); - - -void CreateChildProcess(TCHAR* processname,HANDLE g_hChildStd_IN_Rd,HANDLE g_hChildStd_OUT_Wr); -void WriteToPipe(TCHAR* content); -void ErrorExit(PTSTR lpszFunction); -Agraph_t* ReadFromPipe(); - -/*two pipes -1 between smyrna and gvpr -SmyrnaToGvprIn : write end of pipe , active graph's fread uses -SmyrnaToGvprROut: read end of pipe , created process' std in uses -1 between gvpr and smyrna -GvprToSmyrnaIn :write end of pipe, created process' stdout uses -GvprToSmyrnaOut :read end of pipe, new graph's fread uses - - -*/ -HANDLE GvprToSmyrnaWr; -HANDLE GvprToSmyrnaRd; -HANDLE SmyrnaToGvprWr; -HANDLE SmyrnaToGvprRd; -SECURITY_ATTRIBUTES saAttr; - - -/* -HANDLE g_hChildStd_OUT_Wr; GvprToSmyrnaWr -HANDLE g_hChildStd_OUT_Rd; GvprToSmyrnaRd -HANDLE g_hChildStd_IN_Wr; SmyrnaToGvprWr -HANDLE g_hChildStd_IN_Rd; SmyrnaToGvprRd -*/ - -void init_security_attr(SECURITY_ATTRIBUTES* Attr) +static int cgraph_write_wrapper(void *chan, char *str) { - Attr->nLength = sizeof(SECURITY_ATTRIBUTES); - Attr->bInheritHandle = TRUE; - Attr->lpSecurityDescriptor = NULL; -} -void createpipes() -{ - if ( ! CreatePipe(&GvprToSmyrnaRd, &GvprToSmyrnaWr, &saAttr, 0) ) - ErrorExit(TEXT("StdoutRd CreatePipe")); - if ( ! SetHandleInformation(GvprToSmyrnaRd, HANDLE_FLAG_INHERIT, 0) ) - ErrorExit(TEXT("Stdout SetHandleInformation")); - - if (! CreatePipe(&SmyrnaToGvprRd, &SmyrnaToGvprWr, &saAttr, 0)) - ErrorExit(TEXT("Stdin CreatePipe")); + DWORD dwWritten; + BOOL bSuccess = FALSE; - if ( ! SetHandleInformation(SmyrnaToGvprWr, HANDLE_FLAG_INHERIT, 0) ) - ErrorExit(TEXT("Stdin SetHandleInformation")); + bSuccess = WriteFile(SmyrnaToGvprWr, str, (DWORD)strlen(str), &dwWritten, NULL); + if ( ! bSuccess ) return 0; + return dwWritten; +} +static int cgraph_read_wrapper (void* ch,char* bf,int sz) +{ + DWORD dwRead; + int ind=0; + ReadFile( GvprToSmyrnaRd, bf, sz, &dwRead, NULL); + printf("read returned value:%d\n",strlen(bf)); + printf("%s\n",bf); + return dwRead; } - -extern Agraph_t* exec_gvpr(char* filename,Agraph_t* srcGraph) +/* ErrorExit: + * Format a readable error message, display a message box, + * and exit from the application. + */ +static void +ErrorExit(PTSTR lpszFunction) { - Agraph_t* G; - char bf[512]; - Agiodisc_t* xio; - Agiodisc_t a; - - init_security_attr(&saAttr); - createpipes(); - - /* if ( ! CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0) ) - ErrorExit(TEXT("StdoutRd CreatePipe")); - if ( ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0) ) - ErrorExit(TEXT("Stdout SetHandleInformation")); - - if (! CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0)) - ErrorExit(TEXT("Stdin CreatePipe")); - - if ( ! SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) ) - ErrorExit(TEXT("Stdin SetHandleInformation")); */ - - + LPVOID lpMsgBuf; + LPVOID lpDisplayBuf; + DWORD dw = GetLastError(); - strcpy(bf,"gvpr -c -f "); - strcat(bf,filename); - - CreateChildProcess(bf,SmyrnaToGvprRd,GvprToSmyrnaWr); + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dw, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, NULL ); - xio=srcGraph->clos->disc.io; - a.afread=srcGraph->clos->disc.io->afread; - a.putstr=cgraph_write_wrapper; - a.flush=xio->flush; - srcGraph->clos->disc.io=&a; - agwrite(srcGraph,NULL); - srcGraph->clos->disc.io=xio; + lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, + (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); + StringCchPrintf((LPTSTR)lpDisplayBuf, + LocalSize(lpDisplayBuf) / sizeof(TCHAR), + TEXT("%s failed with error %d: %s"), + lpszFunction, dw, lpMsgBuf); + MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); - G=ReadFromPipe() ; + LocalFree(lpMsgBuf); + LocalFree(lpDisplayBuf); + ExitProcess(1); +} - return G; +static Agraph_t* +ReadFromPipe() +{ + BOOL bSuccess = FALSE; + int totalbytes=0; + int ind=0; + Agiodisc_t a; + Agdisc_t disc; + Agraph_t* g=0; + + if (!CloseHandle(SmyrnaToGvprWr)) + ErrorExit(TEXT("StdOutWr CloseHandle")); + + a.afread=cgraph_read_wrapper; + a.flush=dummyflush; + disc.io=&a; + disc.id = &AgIdDisc; + disc.mem = &AgMemDisc; + g=agread(NULL,&disc); + return g; } - -void CreateChildProcess(TCHAR* szCmdline,HANDLE g_hChildStd_IN_Rd,HANDLE g_hChildStd_OUT_Wr) + +static void +CreateChildProcess(TCHAR* szCmdline,HANDLE g_hChildStd_IN_Rd,HANDLE g_hChildStd_OUT_Wr) { PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; @@ -138,82 +158,76 @@ void CreateChildProcess(TCHAR* szCmdline,HANDLE g_hChildStd_IN_Rd,HANDLE g_hChil } } -int cgraph_write_wrapper(void *chan, char *str) +static void init_security_attr(SECURITY_ATTRIBUTES* Attr) { - DWORD dwWritten; - BOOL bSuccess = FALSE; - - bSuccess = WriteFile(SmyrnaToGvprWr, str, (DWORD)strlen(str), &dwWritten, NULL); - if ( ! bSuccess ) return 0; - return dwWritten; -} - + Attr->nLength = sizeof(SECURITY_ATTRIBUTES); + Attr->bInheritHandle = TRUE; + Attr->lpSecurityDescriptor = NULL; +} -int cgraph_read_wrapper (void* ch,char* bf,int sz) +static void createpipes() { - DWORD dwRead; - int ind=0; - ReadFile( GvprToSmyrnaRd, bf, sz, &dwRead, NULL); - printf("read returned value:%d\n",strlen(bf)); - printf("%s\n",bf); - return dwRead; - + if ( ! CreatePipe(&GvprToSmyrnaRd, &GvprToSmyrnaWr, &saAttr, 0) ) + ErrorExit(TEXT("StdoutRd CreatePipe")); + if ( ! SetHandleInformation(GvprToSmyrnaRd, HANDLE_FLAG_INHERIT, 0) ) + ErrorExit(TEXT("Stdout SetHandleInformation")); + + if (! CreatePipe(&SmyrnaToGvprRd, &SmyrnaToGvprWr, &saAttr, 0)) + ErrorExit(TEXT("Stdin CreatePipe")); + + if ( ! SetHandleInformation(SmyrnaToGvprWr, HANDLE_FLAG_INHERIT, 0) ) + ErrorExit(TEXT("Stdin SetHandleInformation")); + } -int dummyflush (void *chan) + + + +static int dummyflush (void *chan) { -return 1; + return 1; } +#else -Agraph_t* ReadFromPipe() - -{ - BOOL bSuccess = FALSE; - int totalbytes=0; - int ind=0; - Agiodisc_t a; - Agdisc_t disc; - Agraph_t* g=0; - if (!CloseHandle(SmyrnaToGvprWr)) - ErrorExit(TEXT("StdOutWr CloseHandle")); - a.afread=cgraph_read_wrapper; - a.flush=dummyflush; - disc.io=&a; - disc.id = &AgIdDisc; - disc.mem = &AgMemDisc; - g=agread(NULL,&disc); - return g; -} - -void ErrorExit(PTSTR lpszFunction) +#endif -// Format a readable error message, display a message box, -// and exit from the application. +Agraph_t* +exec_gvpr(char* filename,Agraph_t* srcGraph) { - LPVOID lpMsgBuf; - LPVOID lpDisplayBuf; - DWORD dw = GetLastError(); - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - dw, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, NULL ); + Agraph_t* G; + unsigned char bf[SMALLBUF]; + agxbuf xbuf; +#ifdef WIN32 + Agiodisc_t* xio; + Agiodisc_t a; - lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, - (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); - StringCchPrintf((LPTSTR)lpDisplayBuf, - LocalSize(lpDisplayBuf) / sizeof(TCHAR), - TEXT("%s failed with error %d: %s"), - lpszFunction, dw, lpMsgBuf); - MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); + init_security_attr(&saAttr); + createpipes(); +#else + FILE* pp; +#endif - LocalFree(lpMsgBuf); - LocalFree(lpDisplayBuf); - ExitProcess(1); -} + agxbinit (&xbuf, SMALLBUF, bf); + agxbput (&xbuf, "gvpr -c -f "); + agxbput (&bf, filename); + +#ifdef WIN32 + CreateChildProcess (agxbuse (&xbuf), SmyrnaToGvprRd, GvprToSmyrnaWr); + + xio = srcGraph->clos->disc.io; + a.afread = srcGraph->clos->disc.io->afread; + a.putstr = cgraph_write_wrapper; + a.flush = xio->flush; + srcGraph->clos->disc.io = &a; + agwrite(srcGraph,NULL); + srcGraph->clos->disc.io = xio; + G = ReadFromPipe() ; +#else + pp = popen (agxbuse (&xbuf), "r+"); + agwrite(srcGraph, pp); + G = agread(pp, NULL) ; + pclose (pp); #endif + return G; +} + diff --git a/cmd/smyrna/gvprpipe.h b/cmd/smyrna/gvprpipe.h index d432661ce..9376d763c 100644 --- a/cmd/smyrna/gvprpipe.h +++ b/cmd/smyrna/gvprpipe.h @@ -1,12 +1,23 @@ +/* $Id$Revision:*/ +/* vim:set shiftwidth=4 ts=8: */ + +/********************************************************** +* This software is part of the graphviz package * +* http://www.graphviz.org/ * +* * +* Copyright (c) 1994-2004 AT&T Corp. * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Corp. * +* * +* Information and Software Systems Research * +* AT&T Research, Florham Park NJ * +**********************************************************/ + #ifndef GVPRPIPE_H #define GVPRPIPE_H -#define BUFSIZE 4096 -#ifdef WIN32 -#include -#include -#include -#include + #include "cgraph.h" extern Agraph_t* exec_gvpr(char* filename,Agraph_t* srcGraph); + #endif -#endif \ No newline at end of file diff --git a/cmd/smyrna/viewport.c b/cmd/smyrna/viewport.c index 569d2efc5..35b5e39e1 100755 --- a/cmd/smyrna/viewport.c +++ b/cmd/smyrna/viewport.c @@ -1043,9 +1043,7 @@ void please_dont_wait(void) void apply_gvpr(Agraph_t* g,char* prog) { -#ifdef WIN32 Agraph_t* a=exec_gvpr(prog,g); -#endif } float interpol(float minv,float maxv,float minc,float maxc,float x) { -- 2.40.0