#include "stdafx.h"
#include "testw32.h"
#include "testw32dlg.h"
#include "gdriver.h"
#include "gevents.h"
#include <fcntl.h>
#include <errno.h>
#include <io.h>
CWnd *button_OK,*button_Cancel;
DWORD thrd_spool; HANDLE spool_thread;
extern "C" {
HANDLE evgetevent,evdriverdisplaybitmap,this_cwnd,main_thread,listbox,bitmap;
TEvent evevent;
char *ev_buffer;
int ev_lines,ev_columns;
char *save_buffer;
int save_lines,save_cols,exit_code;
int ftview(int,char**);
int ftdump(int,char**);
int ftlint(int,char**);
int ftstring(int,char**);
int ftstrpnm(int,char**);
int ftzoom(int,char**);
int call_test_program(int (*)(int,char**),int,char **);
}
int pipe_std[2]={2*0},pipe_err[2]={2*0},error;
int old_std,old_err;
#define TEST_PROG_N 4
char ProgramName[16];
char fontname[16];
char fullfont[MAX_PATH];
char *argv[255];
int argc;
DWORD WINAPI ThreadHead(LPVOID );
DWORD WINAPI ThreadSpool(LPVOID );
void readpipe(int);
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern main(int,char **);
extern int X_Link;
CTestw32Dlg::CTestw32Dlg(CWnd* pParent )
: CDialog(CTestw32Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestw32Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTestw32Dlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SELECT_ACTION, OnSelectAction)
ON_WM_DESTROY()
END_MESSAGE_MAP()
BOOL CTestw32Dlg::OnInitDialog()
{ int error;
FILE *retf;
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE);
evgetevent=CreateEvent(NULL,FALSE,FALSE,"Get_Event");
evdriverdisplaybitmap=CreateEvent(NULL,FALSE,FALSE,"Driver_Display_Bitmap");
listbox=(GetDlgItem(IDC_LIST_BOX))->m_hWnd;
bitmap=(GetDlgItem(IDC_BITMAP))->m_hWnd;
button_OK=GetDlgItem(IDOK);
button_Cancel=GetDlgItem(IDCANCEL);
error=_pipe(pipe_std,1024,_O_TEXT);
if(-1==_fileno(stdout))
{retf=freopen("throwaway_stdout.tmp","wt",stdout);
}
if(-1==_fileno(stderr))
{retf=freopen("throwaway_stderr.tmp","wt",stderr);
}
old_std=dup(_fileno(stdout));
old_err=dup(_fileno(stderr));
error=dup2(pipe_std[1],_fileno(stdout));
error=dup2(pipe_std[1],_fileno(stderr)); save_buffer=NULL;
spool_thread=CreateThread(NULL,0,ThreadSpool,NULL,0,&thrd_spool);
return TRUE; }
void CTestw32Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CTestw32Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTestw32Dlg::OnOK()
{
DWORD thrd_id;
char Options[256];
char *p,*pb,*pe;
int i;
GetDlgItemText(IDC_TEST_PROGRAM,ProgramName,sizeof(ProgramName)-1);
GetDlgItemText(IDC_OPTIONS,Options,sizeof(Options)-1);
argv[0]=ProgramName;
p=Options;
i=1;
while (*p!=0)
{
while (*p==' ') p++;
pb=p;
while (*p>' ') p++;
pe=p;
if (pe>pb)
{
argv[i]=new char[1+pe-pb];
strncpy(argv[i],pb,pe-pb);
argv[i][pe-pb]=0;
i++;
}
}
argv[0]=ProgramName;
argc=i;
main_thread=CreateThread(NULL,0,ThreadHead,NULL,0,&thrd_id);
}
DWORD WINAPI ThreadHead(LPVOID Parm)
{ int i,rc;
struct {
char pname[16];
int (*program)(int,char**);
} tab[TEST_PROG_N]=
{
{"FTVIEW",&ftview},
{"FTDUMP",&ftdump},
{"FTLINT",&ftlint},
{"FTSTRING",&ftstring}
};
rc=button_OK->EnableWindow(FALSE);
rc=button_Cancel->EnableWindow(FALSE);
for (i=0;(i< TEST_PROG_N) &&strcmp(tab[i].pname,ProgramName);i++);
if (i>= TEST_PROG_N)
{
MessageBox(NULL,"Please select a valid Test Program Name","FreeType Test ",MB_ICONQUESTION);
}
else
call_test_program(tab[i].program,argc,(char **)&argv);
rc=button_OK->EnableWindow(TRUE);
rc=button_Cancel->EnableWindow(TRUE);
rc=fflush(stdout);
rc=fflush(stderr);
ExitThread(1);
return 1;
}
void translate_command(char nChar)
{ int rc,i;
typedef struct _Translator
{
char key;
GEvent event_class;
int event_info;
} Translator;
#define NUM_Translators 20
static const Translator trans[ NUM_Translators] =
{
{ 'q', event_Quit, 0 },
{ (char)27, event_Quit, 0 },
{ 'x', event_Rotate_Glyph, -1 },
{ 'c', event_Rotate_Glyph, 1 },
{ 'v', event_Rotate_Glyph, -16 },
{ 'b', event_Rotate_Glyph, 16 },
{ '{', event_Change_Glyph, -10000 },
{ '}', event_Change_Glyph, 10000 },
{ '(', event_Change_Glyph, -1000 },
{ ')', event_Change_Glyph, 1000 },
{ '9', event_Change_Glyph, -100 },
{ '0', event_Change_Glyph, 100 },
{ 'i', event_Change_Glyph, -10 },
{ 'o', event_Change_Glyph, 10 },
{ 'k', event_Change_Glyph, -1 },
{ 'l', event_Change_Glyph, 1 },
{ '+', event_Scale_Glyph, 10 },
{ '-', event_Scale_Glyph, -10 },
{ 'u', event_Scale_Glyph, 1 },
{ 'j', event_Scale_Glyph, -1 }
};
for ( i = 0; i < NUM_Translators; i++ )
{
if ( nChar == trans[i].key )
{
evevent.what = trans[i].event_class;
evevent.info = trans[i].event_info;
break;
}
}
if (i>= NUM_Translators)
{
evevent.what=event_Keyboard;
evevent.what=nChar;
}
rc=SetEvent(evgetevent);
}
void CTestw32Dlg::OnSelectAction()
{
char c[2];
GetDlgItemText(IDC_ACTION,c,2);
translate_command(c[0]);
}
DWORD WINAPI ThreadSpool(LPVOID Parm)
{
while(1)
{
if (pipe_std[0]) readpipe(pipe_std[0]); Sleep(1000);
}
return 1;
}
void readpipe(int h)
{ int i,j,rc;
char buffer[1024],line[1024];
rc=1;
while(rc)
{
rc=read(h,buffer,sizeof(buffer));
if (rc)
{ j=0;
for(i=0;i<rc;i++)
{
if (buffer[i]=='\n')
{ line[j]=0;
::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line);
j=0;
}
else
line[j++]=buffer[i];
}
line[j]=0; ::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line);
}
}
}
void CTestw32Dlg::OnDestroy()
{ int rc;
CDialog::OnDestroy();
if (spool_thread!=0)
{
rc=TerminateThread(spool_thread,2);
spool_thread=0;
}
dup2(old_std,_fileno(stdout));
dup2(old_err,_fileno(stderr));
}