xref: /plan9/sys/src/cmd/aux/antiword/saveas.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier  * saveas.c
3f5736e95SDavid du Colombier  * Copyright (C) 1998-2001 A.J. van Os; Released under GPL
4f5736e95SDavid du Colombier  *
5f5736e95SDavid du Colombier  * Description:
6f5736e95SDavid du Colombier  * Functions to save the results as a textfile or a drawfile
7f5736e95SDavid du Colombier  */
8f5736e95SDavid du Colombier 
9f5736e95SDavid du Colombier #include <stdio.h>
10f5736e95SDavid du Colombier #include <string.h>
11*25b329d5SDavid du Colombier #include "DeskLib:Menu.h"
12*25b329d5SDavid du Colombier #include "DeskLib:Save.h"
13*25b329d5SDavid du Colombier #include "DeskLib:Template.h"
14*25b329d5SDavid du Colombier #include "DeskLib:Window.h"
15*25b329d5SDavid du Colombier #include "drawfile.h"
16f5736e95SDavid du Colombier #include "antiword.h"
17f5736e95SDavid du Colombier 
18*25b329d5SDavid du Colombier /* The window handle of the save window */
19*25b329d5SDavid du Colombier static window_handle	tSaveWindow = 0;
20*25b329d5SDavid du Colombier 
21*25b329d5SDavid du Colombier /* Xfer_send box fields */
22*25b329d5SDavid du Colombier #define DRAG_SPRITE	3
23*25b329d5SDavid du Colombier #define OK_BUTTON	0
24*25b329d5SDavid du Colombier #define CANCEL_BUTTON	(-1)
25*25b329d5SDavid du Colombier #define FILENAME_ICON	2
26*25b329d5SDavid du Colombier 
27*25b329d5SDavid du Colombier 
28*25b329d5SDavid du Colombier /*
29*25b329d5SDavid du Colombier  * saveas - a wrapper around Save_InitSaveWindowhandler
30*25b329d5SDavid du Colombier  */
31*25b329d5SDavid du Colombier static void
saveas(int iFileType,char * szOutfile,size_t tEstSize,save_filesaver save_function,void * pvReference)32*25b329d5SDavid du Colombier saveas(int iFileType, char *szOutfile, size_t tEstSize,
33*25b329d5SDavid du Colombier 	save_filesaver save_function, void *pvReference)
34*25b329d5SDavid du Colombier {
35*25b329d5SDavid du Colombier 	TRACE_MSG("saveas");
36*25b329d5SDavid du Colombier 
37*25b329d5SDavid du Colombier 	if (tSaveWindow == 0) {
38*25b329d5SDavid du Colombier 		tSaveWindow = Window_Create("xfer_send", template_TITLEMIN);
39*25b329d5SDavid du Colombier 	}
40*25b329d5SDavid du Colombier 	Icon_SetText(tSaveWindow, FILENAME_ICON, szOutfile);
41*25b329d5SDavid du Colombier 	Window_Show(tSaveWindow, open_UNDERPOINTER);
42*25b329d5SDavid du Colombier 	(void)Save_InitSaveWindowHandler(tSaveWindow, FALSE, TRUE, TRUE,
43*25b329d5SDavid du Colombier 		DRAG_SPRITE, OK_BUTTON, CANCEL_BUTTON, FILENAME_ICON,
44*25b329d5SDavid du Colombier 		save_function, NULL, NULL, tEstSize, iFileType, pvReference);
45*25b329d5SDavid du Colombier } /* end of saveas */
46*25b329d5SDavid du Colombier 
47f5736e95SDavid du Colombier static BOOL
bWrite2File(void * pvBytes,size_t tSize,FILE * pFile,const char * szFilename)48f5736e95SDavid du Colombier bWrite2File(void *pvBytes, size_t tSize, FILE *pFile, const char *szFilename)
49f5736e95SDavid du Colombier {
50f5736e95SDavid du Colombier 	if (fwrite(pvBytes, sizeof(char), tSize, pFile) != tSize) {
51f5736e95SDavid du Colombier 		werr(0, "I can't write to '%s'", szFilename);
52f5736e95SDavid du Colombier 		return FALSE;
53f5736e95SDavid du Colombier 	}
54f5736e95SDavid du Colombier 	return TRUE;
55f5736e95SDavid du Colombier } /* end of bWrite2File */
56f5736e95SDavid du Colombier 
57f5736e95SDavid du Colombier /*
58f5736e95SDavid du Colombier  * bText2File - Save the generated draw file to a Text file
59f5736e95SDavid du Colombier  */
60f5736e95SDavid du Colombier static BOOL
bText2File(char * szFilename,void * pvHandle)61f5736e95SDavid du Colombier bText2File(char *szFilename, void *pvHandle)
62f5736e95SDavid du Colombier {
63f5736e95SDavid du Colombier 	FILE	*pFile;
64f5736e95SDavid du Colombier 	diagram_type	*pDiag;
65*25b329d5SDavid du Colombier 	drawfile_object	*pObj;
66*25b329d5SDavid du Colombier 	drawfile_text	*pText;
67*25b329d5SDavid du Colombier 	const char	*pcTmp;
68*25b329d5SDavid du Colombier 	int	iToGo, iX, iYtopPrev, iHeight, iLines;
69f5736e95SDavid du Colombier 	BOOL	bFirst, bIndent, bSuccess;
70f5736e95SDavid du Colombier 
71*25b329d5SDavid du Colombier 	TRACE_MSG("bText2File");
72*25b329d5SDavid du Colombier 
73f5736e95SDavid du Colombier 	fail(szFilename == NULL || szFilename[0] == '\0');
74f5736e95SDavid du Colombier 	fail(pvHandle == NULL);
75f5736e95SDavid du Colombier 
76f5736e95SDavid du Colombier 	DBG_MSG(szFilename);
77f5736e95SDavid du Colombier 
78f5736e95SDavid du Colombier 	pDiag = (diagram_type *)pvHandle;
79f5736e95SDavid du Colombier 	pFile = fopen(szFilename, "w");
80f5736e95SDavid du Colombier 	if (pFile == NULL) {
81f5736e95SDavid du Colombier 		werr(0, "I can't open '%s' for writing", szFilename);
82f5736e95SDavid du Colombier 		return FALSE;
83f5736e95SDavid du Colombier 	}
84f5736e95SDavid du Colombier 	bFirst = TRUE;
85f5736e95SDavid du Colombier 	iYtopPrev = 0;
86f5736e95SDavid du Colombier 	iHeight = (int)lWord2DrawUnits20(DEFAULT_FONT_SIZE);
87f5736e95SDavid du Colombier 	bSuccess = TRUE;
88*25b329d5SDavid du Colombier 	fail(pDiag->tInfo.length < offsetof(drawfile_diagram, objects));
89*25b329d5SDavid du Colombier 	iToGo = pDiag->tInfo.length - offsetof(drawfile_diagram, objects);
90f5736e95SDavid du Colombier 	DBG_DEC(iToGo);
91*25b329d5SDavid du Colombier 	pcTmp = (const char *)pDiag->tInfo.data +
92*25b329d5SDavid du Colombier 				offsetof(drawfile_diagram, objects);
93f5736e95SDavid du Colombier 	while (iToGo > 0 && bSuccess) {
94*25b329d5SDavid du Colombier 		pObj = (drawfile_object *)pcTmp;
95*25b329d5SDavid du Colombier 		switch (pObj->type) {
96*25b329d5SDavid du Colombier 		case drawfile_TYPE_TEXT:
97*25b329d5SDavid du Colombier 			pText = &pObj->data.text;
98f5736e95SDavid du Colombier 			/* Compute the number of lines */
99*25b329d5SDavid du Colombier 			iLines = (iYtopPrev - pText->bbox.max.y +
100*25b329d5SDavid du Colombier 					iHeight / 2) / iHeight;
101*25b329d5SDavid du Colombier 			DBG_DEC_C(iLines < 0, iYtopPrev);
102*25b329d5SDavid du Colombier 			DBG_DEC_C(iLines < 0, pText->bbox.max.y);
103f5736e95SDavid du Colombier 			fail(iLines < 0);
104f5736e95SDavid du Colombier 			bIndent = iLines > 0 || bFirst;
105f5736e95SDavid du Colombier 			bFirst = FALSE;
106f5736e95SDavid du Colombier 			/* Print the newlines */
107f5736e95SDavid du Colombier 			while (iLines > 0 && bSuccess) {
108f5736e95SDavid du Colombier 				bSuccess = bWrite2File("\n",
109f5736e95SDavid du Colombier 					1, pFile, szFilename);
110f5736e95SDavid du Colombier 				iLines--;
111f5736e95SDavid du Colombier 			}
112f5736e95SDavid du Colombier 			/* Print the indentation */
113f5736e95SDavid du Colombier 			if (bIndent && bSuccess) {
114*25b329d5SDavid du Colombier 				for (iX = Drawfile_ScreenToDraw(8);
115*25b329d5SDavid du Colombier 				     iX <= pText->bbox.min.x && bSuccess;
116*25b329d5SDavid du Colombier 				     iX += Drawfile_ScreenToDraw(16)) {
117f5736e95SDavid du Colombier 					bSuccess = bWrite2File(" ",
118f5736e95SDavid du Colombier 						1, pFile, szFilename);
119f5736e95SDavid du Colombier 				}
120f5736e95SDavid du Colombier 			}
121f5736e95SDavid du Colombier 			if (!bSuccess) {
122f5736e95SDavid du Colombier 				break;
123f5736e95SDavid du Colombier 			}
124f5736e95SDavid du Colombier 			/* Print the text object */
125*25b329d5SDavid du Colombier 			bSuccess = bWrite2File(pText->text,
126*25b329d5SDavid du Colombier 				strlen(pText->text), pFile, szFilename);
127*25b329d5SDavid du Colombier 			/* Setup for the next object */
128*25b329d5SDavid du Colombier 			iYtopPrev = pText->bbox.max.y;
129*25b329d5SDavid du Colombier 			iHeight = pText->bbox.max.y - pText->bbox.min.y;
130f5736e95SDavid du Colombier 			break;
131*25b329d5SDavid du Colombier 		case drawfile_TYPE_FONT_TABLE:
132*25b329d5SDavid du Colombier 		case drawfile_TYPE_PATH:
133*25b329d5SDavid du Colombier 		case drawfile_TYPE_SPRITE:
134*25b329d5SDavid du Colombier 		case drawfile_TYPE_JPEG:
135f5736e95SDavid du Colombier 			/* These are not relevant in a textfile */
136f5736e95SDavid du Colombier 			break;
137f5736e95SDavid du Colombier 		default:
138*25b329d5SDavid du Colombier 			DBG_DEC(pObj->type);
139f5736e95SDavid du Colombier 			bSuccess = FALSE;
140f5736e95SDavid du Colombier 			break;
141f5736e95SDavid du Colombier 		}
142*25b329d5SDavid du Colombier 		pcTmp += pObj->size;
143*25b329d5SDavid du Colombier 		iToGo -= pObj->size;
144f5736e95SDavid du Colombier 	}
145f5736e95SDavid du Colombier 	DBG_DEC_C(iToGo != 0, iToGo);
146f5736e95SDavid du Colombier 	if (bSuccess) {
147f5736e95SDavid du Colombier 		bSuccess = bWrite2File("\n", 1, pFile, szFilename);
148f5736e95SDavid du Colombier 	}
149f5736e95SDavid du Colombier 	(void)fclose(pFile);
150f5736e95SDavid du Colombier 	if (bSuccess) {
151f5736e95SDavid du Colombier 		vSetFiletype(szFilename, FILETYPE_TEXT);
152f5736e95SDavid du Colombier 	} else {
153f5736e95SDavid du Colombier 		(void)remove(szFilename);
154f5736e95SDavid du Colombier 		werr(0, "Unable to save textfile '%s'", szFilename);
155f5736e95SDavid du Colombier 	}
156f5736e95SDavid du Colombier 	return bSuccess;
157f5736e95SDavid du Colombier } /* end of bText2File */
158f5736e95SDavid du Colombier 
159f5736e95SDavid du Colombier /*
160*25b329d5SDavid du Colombier  * bSaveTextfile - save the diagram as a text file
161f5736e95SDavid du Colombier  */
162*25b329d5SDavid du Colombier BOOL
bSaveTextfile(event_pollblock * pEvent,void * pvReference)163*25b329d5SDavid du Colombier bSaveTextfile(event_pollblock *pEvent, void *pvReference)
164f5736e95SDavid du Colombier {
165*25b329d5SDavid du Colombier 	diagram_type	*pDiag;
166*25b329d5SDavid du Colombier 	size_t	tRecLen, tNbrRecs, tEstSize;
167f5736e95SDavid du Colombier 
168*25b329d5SDavid du Colombier 	TRACE_MSG("bSaveTextfile");
169f5736e95SDavid du Colombier 
170*25b329d5SDavid du Colombier 	fail(pEvent == NULL);
171*25b329d5SDavid du Colombier 	fail(pvReference == NULL);
172f5736e95SDavid du Colombier 
173*25b329d5SDavid du Colombier 	pDiag = (diagram_type *)pvReference;
174*25b329d5SDavid du Colombier 
175*25b329d5SDavid du Colombier 	switch (pEvent->type) {
176*25b329d5SDavid du Colombier 	case event_SEND:	/* From a menu */
177*25b329d5SDavid du Colombier 		fail(pEvent->data.message.header.action != message_MENUWARN);
178*25b329d5SDavid du Colombier 		if (menu_currentopen != pDiag->pSaveMenu ||
179*25b329d5SDavid du Colombier 		    pEvent->data.message.data.menuwarn.selection[0] !=
180*25b329d5SDavid du Colombier 							SAVEMENU_SAVETEXT) {
181*25b329d5SDavid du Colombier 			return FALSE;
182*25b329d5SDavid du Colombier 		}
183*25b329d5SDavid du Colombier 		break;
184*25b329d5SDavid du Colombier 	case event_KEY:		/* From a key short cut */
185*25b329d5SDavid du Colombier 		if (pEvent->data.key.caret.window != pDiag->tMainWindow) {
186*25b329d5SDavid du Colombier 			return FALSE;
187*25b329d5SDavid du Colombier 		}
188*25b329d5SDavid du Colombier 		break;
189*25b329d5SDavid du Colombier 	default:
190*25b329d5SDavid du Colombier 		DBG_DEC(pEvent->type);
191*25b329d5SDavid du Colombier 		return FALSE;
192*25b329d5SDavid du Colombier 	}
193*25b329d5SDavid du Colombier 
194*25b329d5SDavid du Colombier 	tRecLen = sizeof(drawfile_text) + DEFAULT_SCREEN_WIDTH * 2 / 3;
195*25b329d5SDavid du Colombier 	tNbrRecs = pDiag->tInfo.length / tRecLen + 1;
196*25b329d5SDavid du Colombier 	tEstSize = tNbrRecs * DEFAULT_SCREEN_WIDTH * 2 / 3;
197*25b329d5SDavid du Colombier 	DBG_DEC(tEstSize);
198*25b329d5SDavid du Colombier 
199*25b329d5SDavid du Colombier 	saveas(FILETYPE_TEXT, "WordText", tEstSize, bText2File, pDiag);
200*25b329d5SDavid du Colombier 	return TRUE;
201*25b329d5SDavid du Colombier } /* end of bSaveTextfile */
202f5736e95SDavid du Colombier 
203f5736e95SDavid du Colombier /*
204f5736e95SDavid du Colombier  * bDraw2File - Save the generated draw file to a Draw file
205f5736e95SDavid du Colombier  *
206f5736e95SDavid du Colombier  * Remark: This is not a simple copy action. The origin of the
207f5736e95SDavid du Colombier  * coordinates (0,0) must move from the top-left corner to the
208f5736e95SDavid du Colombier  * bottom-left corner.
209f5736e95SDavid du Colombier  */
210f5736e95SDavid du Colombier static BOOL
bDraw2File(char * szFilename,void * pvHandle)211f5736e95SDavid du Colombier bDraw2File(char *szFilename, void *pvHandle)
212f5736e95SDavid du Colombier {
213f5736e95SDavid du Colombier 	FILE		*pFile;
214f5736e95SDavid du Colombier 	diagram_type	*pDiagram;
215*25b329d5SDavid du Colombier 	wimp_box	*pBbox;
216*25b329d5SDavid du Colombier 	drawfile_object	*pObj;
217*25b329d5SDavid du Colombier 	drawfile_text	*pText;
218*25b329d5SDavid du Colombier 	drawfile_path	*pPath;
219*25b329d5SDavid du Colombier 	drawfile_sprite	*pSprite;
220*25b329d5SDavid du Colombier 	drawfile_jpeg	*pJpeg;
221f5736e95SDavid du Colombier 	int	*piPath;
222f5736e95SDavid du Colombier 	char	*pcTmp;
223f5736e95SDavid du Colombier 	int	iYadd, iToGo, iSize;
224f5736e95SDavid du Colombier 	BOOL	bSuccess;
225f5736e95SDavid du Colombier 
226*25b329d5SDavid du Colombier 	TRACE_MSG("bDraw2File");
227*25b329d5SDavid du Colombier 
228f5736e95SDavid du Colombier 	fail(szFilename == NULL || szFilename[0] == '\0');
229f5736e95SDavid du Colombier 	fail(pvHandle == NULL);
230f5736e95SDavid du Colombier 
231f5736e95SDavid du Colombier 	NO_DBG_MSG(szFilename);
232f5736e95SDavid du Colombier 
233f5736e95SDavid du Colombier 	pDiagram = (diagram_type *)pvHandle;
234f5736e95SDavid du Colombier 	pFile = fopen(szFilename, "wb");
235f5736e95SDavid du Colombier 	if (pFile == NULL) {
236f5736e95SDavid du Colombier 		werr(0, "I can't open '%s' for writing", szFilename);
237f5736e95SDavid du Colombier 		return FALSE;
238f5736e95SDavid du Colombier 	}
239f5736e95SDavid du Colombier 	iToGo = pDiagram->tInfo.length;
240f5736e95SDavid du Colombier 	DBG_DEC(iToGo);
241f5736e95SDavid du Colombier 	pcTmp = pDiagram->tInfo.data;
242*25b329d5SDavid du Colombier 	bSuccess = bWrite2File(pcTmp,
243*25b329d5SDavid du Colombier 			offsetof(drawfile_diagram, bbox), pFile, szFilename);
244*25b329d5SDavid du Colombier 	if (bSuccess) {
245*25b329d5SDavid du Colombier 	  	pcTmp += offsetof(drawfile_diagram, bbox);
246*25b329d5SDavid du Colombier 		iToGo -= offsetof(drawfile_diagram, bbox);
247*25b329d5SDavid du Colombier 		pBbox = (wimp_box *)pcTmp;
248*25b329d5SDavid du Colombier 		iYadd = -pBbox->min.y;
249*25b329d5SDavid du Colombier 		pBbox->min.y += iYadd;
250*25b329d5SDavid du Colombier 		pBbox->max.y += iYadd;
251*25b329d5SDavid du Colombier 		bSuccess = bWrite2File(pcTmp,
252*25b329d5SDavid du Colombier 				sizeof(*pBbox), pFile, szFilename);
253*25b329d5SDavid du Colombier 		iToGo -= sizeof(*pBbox);
254f5736e95SDavid du Colombier 		DBG_DEC(iToGo);
255*25b329d5SDavid du Colombier 		pcTmp += sizeof(*pBbox);
256*25b329d5SDavid du Colombier 	} else {
257*25b329d5SDavid du Colombier 		iYadd = 0;
258*25b329d5SDavid du Colombier 	}
259f5736e95SDavid du Colombier 	while (iToGo > 0 && bSuccess) {
260*25b329d5SDavid du Colombier 		pObj = (drawfile_object *)pcTmp;
261*25b329d5SDavid du Colombier 		iSize = pObj->size;
262*25b329d5SDavid du Colombier 		switch (pObj->type) {
263*25b329d5SDavid du Colombier 		case drawfile_TYPE_FONT_TABLE:
264f5736e95SDavid du Colombier 			bSuccess = bWrite2File(pcTmp,
265f5736e95SDavid du Colombier 					iSize, pFile, szFilename);
266f5736e95SDavid du Colombier 			pcTmp += iSize;
267f5736e95SDavid du Colombier 			iToGo -= iSize;
268f5736e95SDavid du Colombier 			break;
269*25b329d5SDavid du Colombier 		case drawfile_TYPE_TEXT:
270*25b329d5SDavid du Colombier 			pText = &pObj->data.text;
271f5736e95SDavid du Colombier 			/* First correct the coordinates */
272*25b329d5SDavid du Colombier 			pText->bbox.min.y += iYadd;
273*25b329d5SDavid du Colombier 			pText->bbox.max.y += iYadd;
274*25b329d5SDavid du Colombier 			pText->base.y += iYadd;
275f5736e95SDavid du Colombier 			/* Now write the information to file */
276f5736e95SDavid du Colombier 			bSuccess = bWrite2File(pcTmp,
277f5736e95SDavid du Colombier 					iSize, pFile, szFilename);
278*25b329d5SDavid du Colombier 			pcTmp += pObj->size;
279*25b329d5SDavid du Colombier 			iToGo -= pObj->size;
280f5736e95SDavid du Colombier 			break;
281*25b329d5SDavid du Colombier 		case drawfile_TYPE_PATH:
282*25b329d5SDavid du Colombier 			pPath = &pObj->data.path;
283f5736e95SDavid du Colombier 			/* First correct the coordinates */
284*25b329d5SDavid du Colombier 			pPath->bbox.min.y += iYadd;
285*25b329d5SDavid du Colombier 			pPath->bbox.max.y += iYadd;
286f5736e95SDavid du Colombier 			/* Now write the information to file */
287*25b329d5SDavid du Colombier 			bSuccess = bWrite2File(pPath,
288*25b329d5SDavid du Colombier 				sizeof(*pPath), pFile, szFilename);
289*25b329d5SDavid du Colombier 			pcTmp += sizeof(*pPath);
290*25b329d5SDavid du Colombier 			iSize = pObj->size - sizeof(*pPath);
291f5736e95SDavid du Colombier 			fail(iSize < 14 * sizeof(int));
292f5736e95SDavid du Colombier 			/* Second correct the path coordinates */
293f5736e95SDavid du Colombier 			piPath = xmalloc(iSize);
294f5736e95SDavid du Colombier 			memcpy(piPath, pcTmp, iSize);
295f5736e95SDavid du Colombier 			piPath[ 2] += iYadd;
296f5736e95SDavid du Colombier 			piPath[ 5] += iYadd;
297f5736e95SDavid du Colombier 			piPath[ 8] += iYadd;
298f5736e95SDavid du Colombier 			piPath[11] += iYadd;
299f5736e95SDavid du Colombier 			if (bSuccess) {
300f5736e95SDavid du Colombier 				bSuccess = bWrite2File(piPath,
301f5736e95SDavid du Colombier 					iSize, pFile, szFilename);
302f5736e95SDavid du Colombier 				pcTmp += iSize;
303f5736e95SDavid du Colombier 			}
304f5736e95SDavid du Colombier 			piPath = xfree(piPath);
305*25b329d5SDavid du Colombier 			iToGo -= pObj->size;
306f5736e95SDavid du Colombier 			break;
307*25b329d5SDavid du Colombier 		case drawfile_TYPE_SPRITE:
308*25b329d5SDavid du Colombier 			pSprite = &pObj->data.sprite;
309f5736e95SDavid du Colombier 			/* First correct the coordinates */
310*25b329d5SDavid du Colombier 			pSprite->bbox.min.y += iYadd;
311*25b329d5SDavid du Colombier 			pSprite->bbox.max.y += iYadd;
312f5736e95SDavid du Colombier 			/* Now write the information to file */
313f5736e95SDavid du Colombier 			bSuccess = bWrite2File(pcTmp,
314f5736e95SDavid du Colombier 					iSize, pFile, szFilename);
315*25b329d5SDavid du Colombier 			pcTmp += pObj->size;
316*25b329d5SDavid du Colombier 			iToGo -= pObj->size;
317f5736e95SDavid du Colombier 			break;
318*25b329d5SDavid du Colombier 		case drawfile_TYPE_JPEG:
319*25b329d5SDavid du Colombier 			pJpeg = &pObj->data.jpeg;
320f5736e95SDavid du Colombier 			/* First correct the coordinates */
321*25b329d5SDavid du Colombier 			pJpeg->bbox.min.y += iYadd;
322*25b329d5SDavid du Colombier 			pJpeg->bbox.max.y += iYadd;
323*25b329d5SDavid du Colombier 			pJpeg->trfm.entries[2][1] += iYadd;
324f5736e95SDavid du Colombier 			/* Now write the information to file */
325f5736e95SDavid du Colombier 			bSuccess = bWrite2File(pcTmp,
326f5736e95SDavid du Colombier 					iSize, pFile, szFilename);
327*25b329d5SDavid du Colombier 			pcTmp += pObj->size;
328*25b329d5SDavid du Colombier 			iToGo -= pObj->size;
329f5736e95SDavid du Colombier 			break;
330f5736e95SDavid du Colombier 		default:
331*25b329d5SDavid du Colombier 			DBG_DEC(pObj->type);
332f5736e95SDavid du Colombier 			bSuccess = FALSE;
333f5736e95SDavid du Colombier 			break;
334f5736e95SDavid du Colombier 		}
335f5736e95SDavid du Colombier 	}
336f5736e95SDavid du Colombier 	DBG_DEC_C(iToGo != 0, iToGo);
337f5736e95SDavid du Colombier 	(void)fclose(pFile);
338f5736e95SDavid du Colombier 	if (bSuccess) {
339f5736e95SDavid du Colombier 		vSetFiletype(szFilename, FILETYPE_DRAW);
340f5736e95SDavid du Colombier 	} else {
341f5736e95SDavid du Colombier 		(void)remove(szFilename);
342f5736e95SDavid du Colombier 		werr(0, "Unable to save drawfile '%s'", szFilename);
343f5736e95SDavid du Colombier 	}
344f5736e95SDavid du Colombier 	return bSuccess;
345f5736e95SDavid du Colombier } /* end of bDraw2File */
346f5736e95SDavid du Colombier 
347f5736e95SDavid du Colombier /*
348*25b329d5SDavid du Colombier  * bSaveDrawfile - save the diagram as a draw file
349f5736e95SDavid du Colombier  */
350*25b329d5SDavid du Colombier BOOL
bSaveDrawfile(event_pollblock * pEvent,void * pvReference)351*25b329d5SDavid du Colombier bSaveDrawfile(event_pollblock *pEvent, void *pvReference)
352f5736e95SDavid du Colombier {
353*25b329d5SDavid du Colombier 	diagram_type	*pDiag;
354*25b329d5SDavid du Colombier 	size_t		tEstSize;
355f5736e95SDavid du Colombier 
356*25b329d5SDavid du Colombier 	TRACE_MSG("bSaveDrawfile");
357f5736e95SDavid du Colombier 
358*25b329d5SDavid du Colombier 	fail(pEvent == NULL);
359*25b329d5SDavid du Colombier 	fail(pvReference == NULL);
360f5736e95SDavid du Colombier 
361*25b329d5SDavid du Colombier 	pDiag = (diagram_type *)pvReference;
362*25b329d5SDavid du Colombier 
363*25b329d5SDavid du Colombier 	switch (pEvent->type) {
364*25b329d5SDavid du Colombier 	case event_SEND:	/* From a menu */
365*25b329d5SDavid du Colombier 		fail(pEvent->data.message.header.action != message_MENUWARN);
366*25b329d5SDavid du Colombier 		if (menu_currentopen != pDiag->pSaveMenu ||
367*25b329d5SDavid du Colombier 		    pEvent->data.message.data.menuwarn.selection[0] !=
368*25b329d5SDavid du Colombier 							SAVEMENU_SAVEDRAW) {
369*25b329d5SDavid du Colombier 			return FALSE;
370*25b329d5SDavid du Colombier 		}
371*25b329d5SDavid du Colombier 		break;
372*25b329d5SDavid du Colombier 	case event_KEY:		/* From a key short cut */
373*25b329d5SDavid du Colombier 		if (pEvent->data.key.caret.window != pDiag->tMainWindow) {
374*25b329d5SDavid du Colombier 			return FALSE;
375*25b329d5SDavid du Colombier 		}
376*25b329d5SDavid du Colombier 		break;
377*25b329d5SDavid du Colombier 	default:
378*25b329d5SDavid du Colombier 		DBG_DEC(pEvent->type);
379*25b329d5SDavid du Colombier 		return FALSE;
380*25b329d5SDavid du Colombier 	}
381*25b329d5SDavid du Colombier 
382*25b329d5SDavid du Colombier 	tEstSize = pDiag->tInfo.length;
383*25b329d5SDavid du Colombier 	DBG_DEC(tEstSize);
384*25b329d5SDavid du Colombier 
385*25b329d5SDavid du Colombier 	saveas(FILETYPE_DRAW, "WordDraw", tEstSize, bDraw2File, pDiag);
386*25b329d5SDavid du Colombier 	return TRUE;
387*25b329d5SDavid du Colombier } /* end of bSaveDrawfile */
388