1*25b329d5SDavid du Colombier /*
2*25b329d5SDavid du Colombier * main_ros.c
3*25b329d5SDavid du Colombier *
4*25b329d5SDavid du Colombier * Released under GPL
5*25b329d5SDavid du Colombier *
6*25b329d5SDavid du Colombier * Copyright (C) 1998-2005 A.J. van Os
7*25b329d5SDavid du Colombier *
8*25b329d5SDavid du Colombier * This program is free software; you can redistribute it and/or
9*25b329d5SDavid du Colombier * modify it under the terms of the GNU General Public License
10*25b329d5SDavid du Colombier * as published by the Free Software Foundation; either version 2
11*25b329d5SDavid du Colombier * of the License, or (at your option) any later version.
12*25b329d5SDavid du Colombier *
13*25b329d5SDavid du Colombier * This program is distributed in the hope that it will be useful,
14*25b329d5SDavid du Colombier * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*25b329d5SDavid du Colombier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16*25b329d5SDavid du Colombier * GNU General Public License for more details.
17*25b329d5SDavid du Colombier *
18*25b329d5SDavid du Colombier * You should have received a copy of the GNU General Public License
19*25b329d5SDavid du Colombier * along with this program; if not, write to the Free Software
20*25b329d5SDavid du Colombier * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21*25b329d5SDavid du Colombier *
22*25b329d5SDavid du Colombier * Description:
23*25b329d5SDavid du Colombier * The main program of !Antiword (RISC OS version)
24*25b329d5SDavid du Colombier */
25*25b329d5SDavid du Colombier
26*25b329d5SDavid du Colombier #include <stdio.h>
27*25b329d5SDavid du Colombier #include <stdlib.h>
28*25b329d5SDavid du Colombier #include <string.h>
29*25b329d5SDavid du Colombier #include "DeskLib:Dialog2.h"
30*25b329d5SDavid du Colombier #include "DeskLib:Error.h"
31*25b329d5SDavid du Colombier #include "DeskLib:Event.h"
32*25b329d5SDavid du Colombier #include "DeskLib:EventMsg.h"
33*25b329d5SDavid du Colombier #include "DeskLib:Handler.h"
34*25b329d5SDavid du Colombier #include "DeskLib:Menu.h"
35*25b329d5SDavid du Colombier #include "DeskLib:Resource.h"
36*25b329d5SDavid du Colombier #include "DeskLib:Screen.h"
37*25b329d5SDavid du Colombier #include "DeskLib:Template.h"
38*25b329d5SDavid du Colombier #include "DeskLib:Window.h"
39*25b329d5SDavid du Colombier #if defined(__GNUC__)
40*25b329d5SDavid du Colombier #include "flexlib:flex.h"
41*25b329d5SDavid du Colombier #endif /* __GNUC__ */
42*25b329d5SDavid du Colombier #include "version.h"
43*25b329d5SDavid du Colombier #include "antiword.h"
44*25b329d5SDavid du Colombier
45*25b329d5SDavid du Colombier
46*25b329d5SDavid du Colombier /* The name of this program */
47*25b329d5SDavid du Colombier static char *szTask = "!Antiword";
48*25b329d5SDavid du Colombier
49*25b329d5SDavid du Colombier /* The window handle of the choices window */
50*25b329d5SDavid du Colombier static window_handle tChoicesWindow = 0;
51*25b329d5SDavid du Colombier
52*25b329d5SDavid du Colombier /* Dummy diagram with the iconbar menu pointer */
53*25b329d5SDavid du Colombier static diagram_type tDummyDiagram;
54*25b329d5SDavid du Colombier
55*25b329d5SDavid du Colombier /* Program information Box */
56*25b329d5SDavid du Colombier static dialog2_block *pInfoBox = NULL;
57*25b329d5SDavid du Colombier
58*25b329d5SDavid du Colombier /* Info box fields */
59*25b329d5SDavid du Colombier #define PURPOSE_INFO_FIELD 2
60*25b329d5SDavid du Colombier #define AUTHOR_INFO_FIELD 3
61*25b329d5SDavid du Colombier #define VERSION_INFO_FIELD 4
62*25b329d5SDavid du Colombier #define STATUS_INFO_FIELD 5
63*25b329d5SDavid du Colombier
64*25b329d5SDavid du Colombier /* Iconbar menu fields */
65*25b329d5SDavid du Colombier #define ICONBAR_INFO_FIELD 0
66*25b329d5SDavid du Colombier #define ICONBAR_CHOICES_FIELD 1
67*25b329d5SDavid du Colombier #define ICONBAR_QUIT_FIELD 2
68*25b329d5SDavid du Colombier
69*25b329d5SDavid du Colombier
70*25b329d5SDavid du Colombier /*
71*25b329d5SDavid du Colombier * bBarInfo - Show iconbar information
72*25b329d5SDavid du Colombier */
73*25b329d5SDavid du Colombier static BOOL
bBarInfo(event_pollblock * pEvent,void * pvReference)74*25b329d5SDavid du Colombier bBarInfo(event_pollblock *pEvent, void *pvReference)
75*25b329d5SDavid du Colombier {
76*25b329d5SDavid du Colombier diagram_type *pDiag;
77*25b329d5SDavid du Colombier
78*25b329d5SDavid du Colombier TRACE_MSG("bBarInfo");
79*25b329d5SDavid du Colombier
80*25b329d5SDavid du Colombier fail(pEvent == NULL);
81*25b329d5SDavid du Colombier fail(pEvent->type != event_SEND);
82*25b329d5SDavid du Colombier fail(pEvent->data.message.header.action != message_MENUWARN);
83*25b329d5SDavid du Colombier fail(pvReference == NULL);
84*25b329d5SDavid du Colombier
85*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
86*25b329d5SDavid du Colombier
87*25b329d5SDavid du Colombier if (menu_currentopen != pDiag->pSaveMenu ||
88*25b329d5SDavid du Colombier pEvent->data.message.data.menuwarn.selection[0] != ICONBAR_INFO_FIELD) {
89*25b329d5SDavid du Colombier return FALSE;
90*25b329d5SDavid du Colombier }
91*25b329d5SDavid du Colombier
92*25b329d5SDavid du Colombier Dialog2_OpenDialogMenuLeaf(pEvent, pInfoBox);
93*25b329d5SDavid du Colombier return TRUE;
94*25b329d5SDavid du Colombier } /* end of bBarInfo */
95*25b329d5SDavid du Colombier
96*25b329d5SDavid du Colombier /*
97*25b329d5SDavid du Colombier * vBarInfoSetText - Set the iconbar infobox text
98*25b329d5SDavid du Colombier */
99*25b329d5SDavid du Colombier static void
vBarInfoSetText(dialog2_block * pBox)100*25b329d5SDavid du Colombier vBarInfoSetText(dialog2_block *pBox)
101*25b329d5SDavid du Colombier {
102*25b329d5SDavid du Colombier TRACE_MSG("vBarInfoSetText");
103*25b329d5SDavid du Colombier
104*25b329d5SDavid du Colombier fail(pBox == NULL);
105*25b329d5SDavid du Colombier fail(pBox != pInfoBox);
106*25b329d5SDavid du Colombier
107*25b329d5SDavid du Colombier Icon_SetText(pBox->window, PURPOSE_INFO_FIELD, PURPOSESTRING);
108*25b329d5SDavid du Colombier Icon_SetText(pBox->window, AUTHOR_INFO_FIELD, AUTHORSTRING);
109*25b329d5SDavid du Colombier Icon_SetText(pBox->window, VERSION_INFO_FIELD, VERSIONSTRING);
110*25b329d5SDavid du Colombier Icon_SetText(pBox->window, STATUS_INFO_FIELD, STATUSSTRING);
111*25b329d5SDavid du Colombier } /* end of vBarInfoSetText */
112*25b329d5SDavid du Colombier
113*25b329d5SDavid du Colombier /*
114*25b329d5SDavid du Colombier * bMouseButtonClick - respond to mouse button click
115*25b329d5SDavid du Colombier */
116*25b329d5SDavid du Colombier static BOOL
bMouseButtonClick(event_pollblock * pEvent,void * pvReference)117*25b329d5SDavid du Colombier bMouseButtonClick(event_pollblock *pEvent, void *pvReference)
118*25b329d5SDavid du Colombier {
119*25b329d5SDavid du Colombier diagram_type *pDiag;
120*25b329d5SDavid du Colombier menu_ptr pMenu;
121*25b329d5SDavid du Colombier int iPosY;
122*25b329d5SDavid du Colombier
123*25b329d5SDavid du Colombier TRACE_MSG("bMouseButtonClick");
124*25b329d5SDavid du Colombier
125*25b329d5SDavid du Colombier fail(pEvent == NULL);
126*25b329d5SDavid du Colombier fail(pEvent->type != event_CLICK);
127*25b329d5SDavid du Colombier fail(pvReference == NULL);
128*25b329d5SDavid du Colombier
129*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
130*25b329d5SDavid du Colombier
131*25b329d5SDavid du Colombier if (pEvent->data.mouse.button.data.menu) {
132*25b329d5SDavid du Colombier pMenu = pDiag->pSaveMenu;
133*25b329d5SDavid du Colombier iPosY = (pMenu == tDummyDiagram.pSaveMenu) ?
134*25b329d5SDavid du Colombier -1 : pEvent->data.mouse.pos.y;
135*25b329d5SDavid du Colombier Menu_Show(pMenu, pEvent->data.mouse.pos.x, iPosY);
136*25b329d5SDavid du Colombier return TRUE;
137*25b329d5SDavid du Colombier }
138*25b329d5SDavid du Colombier if (pEvent->data.mouse.window == pDiag->tMainWindow &&
139*25b329d5SDavid du Colombier pEvent->data.mouse.icon == -1) {
140*25b329d5SDavid du Colombier vMainButtonClick(&pEvent->data.mouse);
141*25b329d5SDavid du Colombier return TRUE;
142*25b329d5SDavid du Colombier }
143*25b329d5SDavid du Colombier if (pEvent->data.mouse.window == pDiag->tScaleWindow &&
144*25b329d5SDavid du Colombier pEvent->data.mouse.icon >= 0) {
145*25b329d5SDavid du Colombier vScaleButtonClick(&pEvent->data.mouse, pDiag);
146*25b329d5SDavid du Colombier return TRUE;
147*25b329d5SDavid du Colombier }
148*25b329d5SDavid du Colombier return FALSE;
149*25b329d5SDavid du Colombier } /* end of bMouseButtonClick */
150*25b329d5SDavid du Colombier
151*25b329d5SDavid du Colombier /*
152*25b329d5SDavid du Colombier * bAutoRedrawWindow - the redraw is handled by the WIMP
153*25b329d5SDavid du Colombier */
154*25b329d5SDavid du Colombier static BOOL
bAutoRedrawWindow(event_pollblock * pEvent,void * pvReference)155*25b329d5SDavid du Colombier bAutoRedrawWindow(event_pollblock *pEvent, void *pvReference)
156*25b329d5SDavid du Colombier {
157*25b329d5SDavid du Colombier return TRUE;
158*25b329d5SDavid du Colombier } /* end of bAutoRedrawWindow */
159*25b329d5SDavid du Colombier
160*25b329d5SDavid du Colombier static BOOL
bSaveSelect(event_pollblock * pEvent,void * pvReference)161*25b329d5SDavid du Colombier bSaveSelect(event_pollblock *pEvent, void *pvReference)
162*25b329d5SDavid du Colombier {
163*25b329d5SDavid du Colombier TRACE_MSG("bSaveSelect");
164*25b329d5SDavid du Colombier
165*25b329d5SDavid du Colombier fail(pEvent == NULL);
166*25b329d5SDavid du Colombier fail(pEvent->type != event_MENU);
167*25b329d5SDavid du Colombier fail(pvReference == NULL);
168*25b329d5SDavid du Colombier
169*25b329d5SDavid du Colombier DBG_DEC(pEvent->data.selection[0]);
170*25b329d5SDavid du Colombier
171*25b329d5SDavid du Colombier switch (pEvent->data.selection[0]) {
172*25b329d5SDavid du Colombier case SAVEMENU_SCALEVIEW:
173*25b329d5SDavid du Colombier return bScaleOpenAction(pEvent, pvReference);
174*25b329d5SDavid du Colombier case SAVEMENU_SAVEDRAW:
175*25b329d5SDavid du Colombier return bSaveDrawfile(pEvent, pvReference);
176*25b329d5SDavid du Colombier case SAVEMENU_SAVETEXT:
177*25b329d5SDavid du Colombier return bSaveTextfile(pEvent, pvReference);
178*25b329d5SDavid du Colombier default:
179*25b329d5SDavid du Colombier DBG_DEC(pEvent->data.selection[0]);
180*25b329d5SDavid du Colombier return FALSE;
181*25b329d5SDavid du Colombier }
182*25b329d5SDavid du Colombier } /* end of bSaveSelect */
183*25b329d5SDavid du Colombier
184*25b329d5SDavid du Colombier /*
185*25b329d5SDavid du Colombier * Create the window for the text from the given file
186*25b329d5SDavid du Colombier */
187*25b329d5SDavid du Colombier static diagram_type *
pCreateTextWindow(const char * szFilename)188*25b329d5SDavid du Colombier pCreateTextWindow(const char *szFilename)
189*25b329d5SDavid du Colombier {
190*25b329d5SDavid du Colombier diagram_type *pDiag;
191*25b329d5SDavid du Colombier
192*25b329d5SDavid du Colombier TRACE_MSG("pCreateTextWindow");
193*25b329d5SDavid du Colombier
194*25b329d5SDavid du Colombier fail(szFilename == NULL || szFilename[0] == '\0');
195*25b329d5SDavid du Colombier
196*25b329d5SDavid du Colombier /* Create the diagram */
197*25b329d5SDavid du Colombier pDiag = pCreateDiagram(szTask+1, szFilename);
198*25b329d5SDavid du Colombier if (pDiag == NULL) {
199*25b329d5SDavid du Colombier werr(0, "Sorry, no new diagram object");
200*25b329d5SDavid du Colombier return NULL;
201*25b329d5SDavid du Colombier }
202*25b329d5SDavid du Colombier
203*25b329d5SDavid du Colombier /* Prepare a save menu for this diagram */
204*25b329d5SDavid du Colombier pDiag->pSaveMenu = Menu_New(szTask+1,
205*25b329d5SDavid du Colombier ">Scale view,"
206*25b329d5SDavid du Colombier ">Save (Drawfile) F3,"
207*25b329d5SDavid du Colombier ">Save (Text only) \213F3");
208*25b329d5SDavid du Colombier if (pDiag->pSaveMenu == NULL) {
209*25b329d5SDavid du Colombier werr(1, "Sorry, no Savemenu object");
210*25b329d5SDavid du Colombier }
211*25b329d5SDavid du Colombier Menu_Warn(pDiag->pSaveMenu, SAVEMENU_SCALEVIEW,
212*25b329d5SDavid du Colombier TRUE, bScaleOpenAction, pDiag);
213*25b329d5SDavid du Colombier Menu_Warn(pDiag->pSaveMenu, SAVEMENU_SAVEDRAW,
214*25b329d5SDavid du Colombier TRUE, bSaveDrawfile, pDiag);
215*25b329d5SDavid du Colombier Menu_Warn(pDiag->pSaveMenu, SAVEMENU_SAVETEXT,
216*25b329d5SDavid du Colombier TRUE, bSaveTextfile, pDiag);
217*25b329d5SDavid du Colombier
218*25b329d5SDavid du Colombier /* Claim events for the main window */
219*25b329d5SDavid du Colombier Event_Claim(event_REDRAW, pDiag->tMainWindow, icon_ANY,
220*25b329d5SDavid du Colombier bRedrawMainWindow, pDiag);
221*25b329d5SDavid du Colombier Event_Claim(event_CLOSE, pDiag->tMainWindow, icon_ANY,
222*25b329d5SDavid du Colombier bDestroyDiagram, pDiag);
223*25b329d5SDavid du Colombier Event_Claim(event_CLICK, pDiag->tMainWindow, icon_ANY,
224*25b329d5SDavid du Colombier bMouseButtonClick, pDiag);
225*25b329d5SDavid du Colombier Event_Claim(event_KEY, pDiag->tMainWindow, icon_ANY,
226*25b329d5SDavid du Colombier bMainKeyPressed, pDiag);
227*25b329d5SDavid du Colombier
228*25b329d5SDavid du Colombier /* Claim events for the scale window */
229*25b329d5SDavid du Colombier Event_Claim(event_REDRAW, pDiag->tScaleWindow, icon_ANY,
230*25b329d5SDavid du Colombier bAutoRedrawWindow, NULL);
231*25b329d5SDavid du Colombier Event_Claim(event_CLICK, pDiag->tScaleWindow, icon_ANY,
232*25b329d5SDavid du Colombier bMouseButtonClick, pDiag);
233*25b329d5SDavid du Colombier Event_Claim(event_KEY, pDiag->tScaleWindow, icon_ANY,
234*25b329d5SDavid du Colombier bScaleKeyPressed, pDiag);
235*25b329d5SDavid du Colombier
236*25b329d5SDavid du Colombier /* Set the window title */
237*25b329d5SDavid du Colombier vSetTitle(pDiag);
238*25b329d5SDavid du Colombier return pDiag;
239*25b329d5SDavid du Colombier } /* end of pCreateTextWindow */
240*25b329d5SDavid du Colombier
241*25b329d5SDavid du Colombier /*
242*25b329d5SDavid du Colombier * vProcessFile - process one file
243*25b329d5SDavid du Colombier */
244*25b329d5SDavid du Colombier static void
vProcessFile(const char * szFilename,int iFiletype)245*25b329d5SDavid du Colombier vProcessFile(const char *szFilename, int iFiletype)
246*25b329d5SDavid du Colombier {
247*25b329d5SDavid du Colombier options_type tOptions;
248*25b329d5SDavid du Colombier FILE *pFile;
249*25b329d5SDavid du Colombier diagram_type *pDiag;
250*25b329d5SDavid du Colombier long lFilesize;
251*25b329d5SDavid du Colombier int iWordVersion;
252*25b329d5SDavid du Colombier
253*25b329d5SDavid du Colombier TRACE_MSG("vProcessFile");
254*25b329d5SDavid du Colombier
255*25b329d5SDavid du Colombier fail(szFilename == NULL || szFilename[0] == '\0');
256*25b329d5SDavid du Colombier
257*25b329d5SDavid du Colombier DBG_MSG(szFilename);
258*25b329d5SDavid du Colombier
259*25b329d5SDavid du Colombier pFile = fopen(szFilename, "rb");
260*25b329d5SDavid du Colombier if (pFile == NULL) {
261*25b329d5SDavid du Colombier werr(0, "I can't open '%s' for reading", szFilename);
262*25b329d5SDavid du Colombier return;
263*25b329d5SDavid du Colombier }
264*25b329d5SDavid du Colombier
265*25b329d5SDavid du Colombier lFilesize = lGetFilesize(szFilename);
266*25b329d5SDavid du Colombier if (lFilesize < 0) {
267*25b329d5SDavid du Colombier (void)fclose(pFile);
268*25b329d5SDavid du Colombier werr(0, "I can't get the size of '%s'", szFilename);
269*25b329d5SDavid du Colombier return;
270*25b329d5SDavid du Colombier }
271*25b329d5SDavid du Colombier
272*25b329d5SDavid du Colombier iWordVersion = iGuessVersionNumber(pFile, lFilesize);
273*25b329d5SDavid du Colombier if (iWordVersion < 0 || iWordVersion == 3) {
274*25b329d5SDavid du Colombier if (bIsRtfFile(pFile)) {
275*25b329d5SDavid du Colombier werr(0, "%s is not a Word Document."
276*25b329d5SDavid du Colombier " It is probably a Rich Text Format file",
277*25b329d5SDavid du Colombier szFilename);
278*25b329d5SDavid du Colombier } if (bIsWordPerfectFile(pFile)) {
279*25b329d5SDavid du Colombier werr(0, "%s is not a Word Document."
280*25b329d5SDavid du Colombier " It is probably a Word Perfect file",
281*25b329d5SDavid du Colombier szFilename);
282*25b329d5SDavid du Colombier } else {
283*25b329d5SDavid du Colombier werr(0, "%s is not a Word Document.", szFilename);
284*25b329d5SDavid du Colombier }
285*25b329d5SDavid du Colombier (void)fclose(pFile);
286*25b329d5SDavid du Colombier return;
287*25b329d5SDavid du Colombier }
288*25b329d5SDavid du Colombier /* Reset any reading done during file-testing */
289*25b329d5SDavid du Colombier rewind(pFile);
290*25b329d5SDavid du Colombier
291*25b329d5SDavid du Colombier if (iFiletype != FILETYPE_MSWORD) {
292*25b329d5SDavid du Colombier vGetOptions(&tOptions);
293*25b329d5SDavid du Colombier if (tOptions.bAutofiletypeAllowed) {
294*25b329d5SDavid du Colombier vSetFiletype(szFilename, FILETYPE_MSWORD);
295*25b329d5SDavid du Colombier }
296*25b329d5SDavid du Colombier }
297*25b329d5SDavid du Colombier
298*25b329d5SDavid du Colombier pDiag = pCreateTextWindow(szFilename);
299*25b329d5SDavid du Colombier if (pDiag == NULL) {
300*25b329d5SDavid du Colombier (void)fclose(pFile);
301*25b329d5SDavid du Colombier return;
302*25b329d5SDavid du Colombier }
303*25b329d5SDavid du Colombier
304*25b329d5SDavid du Colombier (void)bWordDecryptor(pFile, lFilesize, pDiag);
305*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_VerifyDiagram(&pDiag->tInfo));
306*25b329d5SDavid du Colombier vShowDiagram(pDiag);
307*25b329d5SDavid du Colombier TRACE_MSG("After vShowDiagram");
308*25b329d5SDavid du Colombier
309*25b329d5SDavid du Colombier TRACE_MSG("before debug print");
310*25b329d5SDavid du Colombier DBG_HEX(pFile);
311*25b329d5SDavid du Colombier TRACE_MSG("before fclose");
312*25b329d5SDavid du Colombier (void)fclose(pFile);
313*25b329d5SDavid du Colombier TRACE_MSG("after fclose");
314*25b329d5SDavid du Colombier } /* end of vProcessFile */
315*25b329d5SDavid du Colombier
316*25b329d5SDavid du Colombier /*
317*25b329d5SDavid du Colombier * vSendAck - send an acknowledge
318*25b329d5SDavid du Colombier */
319*25b329d5SDavid du Colombier static void
vSendAck(event_pollblock * pEvent)320*25b329d5SDavid du Colombier vSendAck(event_pollblock *pEvent)
321*25b329d5SDavid du Colombier {
322*25b329d5SDavid du Colombier message_block tMessage;
323*25b329d5SDavid du Colombier
324*25b329d5SDavid du Colombier TRACE_MSG("vSendAck");
325*25b329d5SDavid du Colombier
326*25b329d5SDavid du Colombier fail(pEvent == NULL);
327*25b329d5SDavid du Colombier fail(pEvent->type != event_SEND && pEvent->type != event_SENDWANTACK);
328*25b329d5SDavid du Colombier fail(pEvent->data.message.header.action != message_DATALOAD &&
329*25b329d5SDavid du Colombier pEvent->data.message.header.action != message_DATAOPEN);
330*25b329d5SDavid du Colombier
331*25b329d5SDavid du Colombier tMessage.header.action = message_DATALOADACK;
332*25b329d5SDavid du Colombier tMessage.header.size = sizeof(tMessage);
333*25b329d5SDavid du Colombier tMessage.header.yourref = pEvent->data.message.header.myref;
334*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_SendMessage(event_SEND, &tMessage,
335*25b329d5SDavid du Colombier pEvent->data.message.header.sender, 0));
336*25b329d5SDavid du Colombier } /* end of vSendAck */
337*25b329d5SDavid du Colombier
338*25b329d5SDavid du Colombier static BOOL
bEventMsgHandler(event_pollblock * pEvent,void * pvReference)339*25b329d5SDavid du Colombier bEventMsgHandler(event_pollblock *pEvent, void *pvReference)
340*25b329d5SDavid du Colombier {
341*25b329d5SDavid du Colombier TRACE_MSG("bEventMsgHandler");
342*25b329d5SDavid du Colombier
343*25b329d5SDavid du Colombier fail(pEvent == NULL);
344*25b329d5SDavid du Colombier
345*25b329d5SDavid du Colombier switch (pEvent->type) {
346*25b329d5SDavid du Colombier case event_SEND:
347*25b329d5SDavid du Colombier case event_SENDWANTACK:
348*25b329d5SDavid du Colombier switch (pEvent->data.message.header.action) {
349*25b329d5SDavid du Colombier case message_CLOSEDOWN:
350*25b329d5SDavid du Colombier exit(EXIT_SUCCESS);
351*25b329d5SDavid du Colombier break;
352*25b329d5SDavid du Colombier case message_DATALOAD:
353*25b329d5SDavid du Colombier case message_DATAOPEN:
354*25b329d5SDavid du Colombier vProcessFile(
355*25b329d5SDavid du Colombier pEvent->data.message.data.dataload.filename,
356*25b329d5SDavid du Colombier pEvent->data.message.data.dataload.filetype);
357*25b329d5SDavid du Colombier vSendAck(pEvent);
358*25b329d5SDavid du Colombier break;
359*25b329d5SDavid du Colombier default:
360*25b329d5SDavid du Colombier DBG_DEC(pEvent->data.message.header.action);
361*25b329d5SDavid du Colombier break;
362*25b329d5SDavid du Colombier }
363*25b329d5SDavid du Colombier return TRUE;
364*25b329d5SDavid du Colombier default:
365*25b329d5SDavid du Colombier DBG_DEC(pEvent->type);
366*25b329d5SDavid du Colombier return FALSE;
367*25b329d5SDavid du Colombier }
368*25b329d5SDavid du Colombier } /* end of bEventMsgHandler */
369*25b329d5SDavid du Colombier
370*25b329d5SDavid du Colombier /*
371*25b329d5SDavid du Colombier * bMenuSelect - select from the iconbar menu
372*25b329d5SDavid du Colombier */
373*25b329d5SDavid du Colombier static BOOL
bMenuSelect(event_pollblock * pEvent,void * pvReference)374*25b329d5SDavid du Colombier bMenuSelect(event_pollblock *pEvent, void *pvReference)
375*25b329d5SDavid du Colombier {
376*25b329d5SDavid du Colombier TRACE_MSG("bMenuSelect");
377*25b329d5SDavid du Colombier
378*25b329d5SDavid du Colombier fail(pEvent == NULL);
379*25b329d5SDavid du Colombier fail(pEvent->type != event_MENU);
380*25b329d5SDavid du Colombier
381*25b329d5SDavid du Colombier DBG_DEC(pEvent->data.selection[0]);
382*25b329d5SDavid du Colombier
383*25b329d5SDavid du Colombier switch (pEvent->data.selection[0]) {
384*25b329d5SDavid du Colombier case ICONBAR_INFO_FIELD:
385*25b329d5SDavid du Colombier return bBarInfo(pEvent, pvReference);
386*25b329d5SDavid du Colombier case ICONBAR_CHOICES_FIELD:
387*25b329d5SDavid du Colombier vChoicesOpenAction(tChoicesWindow);
388*25b329d5SDavid du Colombier Window_BringToFront(tChoicesWindow);
389*25b329d5SDavid du Colombier break;
390*25b329d5SDavid du Colombier case ICONBAR_QUIT_FIELD:
391*25b329d5SDavid du Colombier TRACE_MSG("before exit");
392*25b329d5SDavid du Colombier exit(EXIT_SUCCESS);
393*25b329d5SDavid du Colombier break;
394*25b329d5SDavid du Colombier default:
395*25b329d5SDavid du Colombier DBG_DEC(pEvent->data.selection[0]);
396*25b329d5SDavid du Colombier break;
397*25b329d5SDavid du Colombier }
398*25b329d5SDavid du Colombier return TRUE;
399*25b329d5SDavid du Colombier } /* end of bMenuSelect */
400*25b329d5SDavid du Colombier
401*25b329d5SDavid du Colombier /*
402*25b329d5SDavid du Colombier * bMenuClick - respond to an menu click
403*25b329d5SDavid du Colombier */
404*25b329d5SDavid du Colombier static BOOL
bMenuClick(event_pollblock * pEvent,void * pvReference)405*25b329d5SDavid du Colombier bMenuClick(event_pollblock *pEvent, void *pvReference)
406*25b329d5SDavid du Colombier {
407*25b329d5SDavid du Colombier TRACE_MSG("bMenuClick");
408*25b329d5SDavid du Colombier
409*25b329d5SDavid du Colombier fail(pEvent == NULL);
410*25b329d5SDavid du Colombier fail(pEvent->type != event_MENU);
411*25b329d5SDavid du Colombier
412*25b329d5SDavid du Colombier if (menu_currentopen == tDummyDiagram.pSaveMenu) {
413*25b329d5SDavid du Colombier return bMenuSelect(pEvent, pvReference);
414*25b329d5SDavid du Colombier } else if (pvReference == NULL) {
415*25b329d5SDavid du Colombier return FALSE;
416*25b329d5SDavid du Colombier }
417*25b329d5SDavid du Colombier return bSaveSelect(pEvent, pvReference);
418*25b329d5SDavid du Colombier } /* end of bMenuClick */
419*25b329d5SDavid du Colombier
420*25b329d5SDavid du Colombier static void
vTemplates(void)421*25b329d5SDavid du Colombier vTemplates(void)
422*25b329d5SDavid du Colombier {
423*25b329d5SDavid du Colombier TRACE_MSG("vTemplates");
424*25b329d5SDavid du Colombier
425*25b329d5SDavid du Colombier Template_Initialise();
426*25b329d5SDavid du Colombier Template_LoadFile("Templates");
427*25b329d5SDavid du Colombier
428*25b329d5SDavid du Colombier tChoicesWindow = Window_Create("Choices", template_TITLEMIN);
429*25b329d5SDavid du Colombier if (tChoicesWindow == 0) {
430*25b329d5SDavid du Colombier werr(1, "I can't find the 'Choices' template");
431*25b329d5SDavid du Colombier }
432*25b329d5SDavid du Colombier
433*25b329d5SDavid du Colombier /* Claim events for the choices window */
434*25b329d5SDavid du Colombier Event_Claim(event_REDRAW, tChoicesWindow, icon_ANY,
435*25b329d5SDavid du Colombier bAutoRedrawWindow, NULL);
436*25b329d5SDavid du Colombier Event_Claim(event_CLICK, tChoicesWindow, icon_ANY,
437*25b329d5SDavid du Colombier bChoicesMouseClick, NULL);
438*25b329d5SDavid du Colombier Event_Claim(event_KEY, tChoicesWindow, icon_ANY,
439*25b329d5SDavid du Colombier bChoicesKeyPressed, NULL);
440*25b329d5SDavid du Colombier } /* end of vTemplates */
441*25b329d5SDavid du Colombier
442*25b329d5SDavid du Colombier static void
vInitialise(void)443*25b329d5SDavid du Colombier vInitialise(void)
444*25b329d5SDavid du Colombier {
445*25b329d5SDavid du Colombier int aiMessages[] = {0};
446*25b329d5SDavid du Colombier icon_handle tBarIcon;
447*25b329d5SDavid du Colombier
448*25b329d5SDavid du Colombier
449*25b329d5SDavid du Colombier TRACE_MSG("vInitialise");
450*25b329d5SDavid du Colombier
451*25b329d5SDavid du Colombier Resource_Initialise(szTask+1);
452*25b329d5SDavid du Colombier Event_Initialise3(szTask+1, 310, aiMessages);
453*25b329d5SDavid du Colombier EventMsg_Initialise();
454*25b329d5SDavid du Colombier Screen_CacheModeInfo();
455*25b329d5SDavid du Colombier #if defined(__GNUC__)
456*25b329d5SDavid du Colombier flex_init(szTask+1, 0, 0);
457*25b329d5SDavid du Colombier flex_set_budge(1);
458*25b329d5SDavid du Colombier #endif /* __GNUC__ */
459*25b329d5SDavid du Colombier vTemplates();
460*25b329d5SDavid du Colombier
461*25b329d5SDavid du Colombier /* Prepare iconbar menu */
462*25b329d5SDavid du Colombier tDummyDiagram.tInfo.data = NULL;
463*25b329d5SDavid du Colombier tDummyDiagram.tInfo.length = 0;
464*25b329d5SDavid du Colombier tDummyDiagram.pSaveMenu = Menu_New(szTask+1, ">Info,Choices...,Quit");
465*25b329d5SDavid du Colombier if (tDummyDiagram.pSaveMenu == NULL) {
466*25b329d5SDavid du Colombier werr(1, "Sorry, no Barmenu object");
467*25b329d5SDavid du Colombier }
468*25b329d5SDavid du Colombier pInfoBox = Dialog2_CreateDialogBlock("ProgInfo", -1, -1,
469*25b329d5SDavid du Colombier vBarInfoSetText, NULL, NULL);
470*25b329d5SDavid du Colombier
471*25b329d5SDavid du Colombier if (pInfoBox == NULL) {
472*25b329d5SDavid du Colombier werr(1, "Sorry, no Infobox object");
473*25b329d5SDavid du Colombier }
474*25b329d5SDavid du Colombier Menu_Warn(tDummyDiagram.pSaveMenu, ICONBAR_INFO_FIELD,
475*25b329d5SDavid du Colombier TRUE, bBarInfo, &tDummyDiagram);
476*25b329d5SDavid du Colombier
477*25b329d5SDavid du Colombier /* Create an icon on the icon bar */
478*25b329d5SDavid du Colombier tBarIcon = Icon_BarIcon(szTask, iconbar_RIGHT);
479*25b329d5SDavid du Colombier Event_Claim(event_CLICK, window_ICONBAR, tBarIcon,
480*25b329d5SDavid du Colombier bMouseButtonClick, &tDummyDiagram);
481*25b329d5SDavid du Colombier
482*25b329d5SDavid du Colombier /* Generic claims */
483*25b329d5SDavid du Colombier Event_Claim(event_OPEN, window_ANY, icon_ANY,
484*25b329d5SDavid du Colombier Handler_OpenWindow, NULL);
485*25b329d5SDavid du Colombier Event_Claim(event_CLOSE, window_ANY, icon_ANY,
486*25b329d5SDavid du Colombier Handler_CloseWindow, NULL);
487*25b329d5SDavid du Colombier Event_Claim(event_MENU, window_ANY, icon_ANY,
488*25b329d5SDavid du Colombier bMenuClick, NULL);
489*25b329d5SDavid du Colombier EventMsg_Claim(message_DATALOAD, window_ICONBAR,
490*25b329d5SDavid du Colombier bEventMsgHandler, NULL);
491*25b329d5SDavid du Colombier EventMsg_Claim(message_MODECHANGE, window_ANY,
492*25b329d5SDavid du Colombier Handler_ModeChange, NULL);
493*25b329d5SDavid du Colombier } /* end of vInitialise */
494*25b329d5SDavid du Colombier
495*25b329d5SDavid du Colombier int
main(int argc,char ** argv)496*25b329d5SDavid du Colombier main(int argc, char **argv)
497*25b329d5SDavid du Colombier {
498*25b329d5SDavid du Colombier int iFirst, iFiletype;
499*25b329d5SDavid du Colombier
500*25b329d5SDavid du Colombier TRACE_MSG("main");
501*25b329d5SDavid du Colombier
502*25b329d5SDavid du Colombier vInitialise();
503*25b329d5SDavid du Colombier iFirst = iReadOptions(argc, argv);
504*25b329d5SDavid du Colombier if (iFirst != 1) {
505*25b329d5SDavid du Colombier return EXIT_FAILURE;
506*25b329d5SDavid du Colombier }
507*25b329d5SDavid du Colombier
508*25b329d5SDavid du Colombier if (argc > 1) {
509*25b329d5SDavid du Colombier iFiletype = iGetFiletype(argv[1]);
510*25b329d5SDavid du Colombier if (iFiletype < 0) {
511*25b329d5SDavid du Colombier return EXIT_FAILURE;
512*25b329d5SDavid du Colombier }
513*25b329d5SDavid du Colombier vProcessFile(argv[1], iFiletype);
514*25b329d5SDavid du Colombier TRACE_MSG("main after vProcessFile");
515*25b329d5SDavid du Colombier }
516*25b329d5SDavid du Colombier
517*25b329d5SDavid du Colombier for (;;) {
518*25b329d5SDavid du Colombier Event_Poll();
519*25b329d5SDavid du Colombier }
520*25b329d5SDavid du Colombier } /* end of main */
521