diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/saveas_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/saveas_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,403 +0,0 @@ - - -
- -00001 /* -00002 * saveas.c -00003 * Copyright (C) 1998-2001 A.J. van Os; Released under GPL -00004 * -00005 * Description: -00006 * Functions to save the results as a textfile or a drawfile -00007 */ -00008 -00009 #include <stdio.h> -00010 #include <string.h> -00011 #include "DeskLib:Menu.h" -00012 #include "DeskLib:Save.h" -00013 #include "DeskLib:Template.h" -00014 #include "DeskLib:Window.h" -00015 #include "drawfile.h" -00016 #include "antiword.h" -00017 -00018 /* The window handle of the save window */ -00019 static window_handle tSaveWindow = 0; -00020 -00021 /* Xfer_send box fields */ -00022 #define DRAG_SPRITE 3 -00023 #define OK_BUTTON 0 -00024 #define CANCEL_BUTTON (-1) -00025 #define FILENAME_ICON 2 -00026 -00027 -00028 /* -00029 * saveas - a wrapper around Save_InitSaveWindowhandler -00030 */ -00031 static void -00032 saveas(int iFileType, char *szOutfile, size_t tEstSize, -00033 save_filesaver save_function, void *pvReference) -00034 { -00035 TRACE_MSG("saveas"); -00036 -00037 if (tSaveWindow == 0) { -00038 tSaveWindow = Window_Create("xfer_send", template_TITLEMIN); -00039 } -00040 Icon_SetText(tSaveWindow, FILENAME_ICON, szOutfile); -00041 Window_Show(tSaveWindow, open_UNDERPOINTER); -00042 (void)Save_InitSaveWindowHandler(tSaveWindow, FALSE, TRUE, TRUE, -00043 DRAG_SPRITE, OK_BUTTON, CANCEL_BUTTON, FILENAME_ICON, -00044 save_function, NULL, NULL, tEstSize, iFileType, pvReference); -00045 } /* end of saveas */ -00046 -00047 static BOOL -00048 bWrite2File(void *pvBytes, size_t tSize, FILE *pFile, const char *szFilename) -00049 { -00050 if (fwrite(pvBytes, sizeof(char), tSize, pFile) != tSize) { -00051 werr(0, "I can't write to '%s'", szFilename); -00052 return FALSE; -00053 } -00054 return TRUE; -00055 } /* end of bWrite2File */ -00056 -00057 /* -00058 * bText2File - Save the generated draw file to a Text file -00059 */ -00060 static BOOL -00061 bText2File(char *szFilename, void *pvHandle) -00062 { -00063 FILE *pFile; -00064 diagram_type *pDiag; -00065 drawfile_object *pObj; -00066 drawfile_text *pText; -00067 const char *pcTmp; -00068 int iToGo, iX, iYtopPrev, iHeight, iLines; -00069 BOOL bFirst, bIndent, bSuccess; -00070 -00071 TRACE_MSG("bText2File"); -00072 -00073 fail(szFilename == NULL || szFilename[0] == '\0'); -00074 fail(pvHandle == NULL); -00075 -00076 DBG_MSG(szFilename); -00077 -00078 pDiag = (diagram_type *)pvHandle; -00079 pFile = fopen(szFilename, "w"); -00080 if (pFile == NULL) { -00081 werr(0, "I can't open '%s' for writing", szFilename); -00082 return FALSE; -00083 } -00084 bFirst = TRUE; -00085 iYtopPrev = 0; -00086 iHeight = (int)lWord2DrawUnits20(DEFAULT_FONT_SIZE); -00087 bSuccess = TRUE; -00088 fail(pDiag->tInfo.length < offsetof(drawfile_diagram, objects)); -00089 iToGo = pDiag->tInfo.length - offsetof(drawfile_diagram, objects); -00090 DBG_DEC(iToGo); -00091 pcTmp = (const char *)pDiag->tInfo.data + -00092 offsetof(drawfile_diagram, objects); -00093 while (iToGo > 0 && bSuccess) { -00094 pObj = (drawfile_object *)pcTmp; -00095 switch (pObj->type) { -00096 case drawfile_TYPE_TEXT: -00097 pText = &pObj->data.text; -00098 /* Compute the number of lines */ -00099 iLines = (iYtopPrev - pText->bbox.max.y + -00100 iHeight / 2) / iHeight; -00101 DBG_DEC_C(iLines < 0, iYtopPrev); -00102 DBG_DEC_C(iLines < 0, pText->bbox.max.y); -00103 fail(iLines < 0); -00104 bIndent = iLines > 0 || bFirst; -00105 bFirst = FALSE; -00106 /* Print the newlines */ -00107 while (iLines > 0 && bSuccess) { -00108 bSuccess = bWrite2File("\n", -00109 1, pFile, szFilename); -00110 iLines--; -00111 } -00112 /* Print the indentation */ -00113 if (bIndent && bSuccess) { -00114 for (iX = Drawfile_ScreenToDraw(8); -00115 iX <= pText->bbox.min.x && bSuccess; -00116 iX += Drawfile_ScreenToDraw(16)) { -00117 bSuccess = bWrite2File(" ", -00118 1, pFile, szFilename); -00119 } -00120 } -00121 if (!bSuccess) { -00122 break; -00123 } -00124 /* Print the text object */ -00125 bSuccess = bWrite2File(pText->text, -00126 strlen(pText->text), pFile, szFilename); -00127 /* Setup for the next object */ -00128 iYtopPrev = pText->bbox.max.y; -00129 iHeight = pText->bbox.max.y - pText->bbox.min.y; -00130 break; -00131 case drawfile_TYPE_FONT_TABLE: -00132 case drawfile_TYPE_PATH: -00133 case drawfile_TYPE_SPRITE: -00134 case drawfile_TYPE_JPEG: -00135 /* These are not relevant in a textfile */ -00136 break; -00137 default: -00138 DBG_DEC(pObj->type); -00139 bSuccess = FALSE; -00140 break; -00141 } -00142 pcTmp += pObj->size; -00143 iToGo -= pObj->size; -00144 } -00145 DBG_DEC_C(iToGo != 0, iToGo); -00146 if (bSuccess) { -00147 bSuccess = bWrite2File("\n", 1, pFile, szFilename); -00148 } -00149 (void)fclose(pFile); -00150 if (bSuccess) { -00151 vSetFiletype(szFilename, FILETYPE_TEXT); -00152 } else { -00153 (void)remove(szFilename); -00154 werr(0, "Unable to save textfile '%s'", szFilename); -00155 } -00156 return bSuccess; -00157 } /* end of bText2File */ -00158 -00159 /* -00160 * bSaveTextfile - save the diagram as a text file -00161 */ -00162 BOOL -00163 bSaveTextfile(event_pollblock *pEvent, void *pvReference) -00164 { -00165 diagram_type *pDiag; -00166 size_t tRecLen, tNbrRecs, tEstSize; -00167 -00168 TRACE_MSG("bSaveTextfile"); -00169 -00170 fail(pEvent == NULL); -00171 fail(pvReference == NULL); -00172 -00173 pDiag = (diagram_type *)pvReference; -00174 -00175 switch (pEvent->type) { -00176 case event_SEND: /* From a menu */ -00177 fail(pEvent->data.message.header.action != message_MENUWARN); -00178 if (menu_currentopen != pDiag->pSaveMenu || -00179 pEvent->data.message.data.menuwarn.selection[0] != -00180 SAVEMENU_SAVETEXT) { -00181 return FALSE; -00182 } -00183 break; -00184 case event_KEY: /* From a key short cut */ -00185 if (pEvent->data.key.caret.window != pDiag->tMainWindow) { -00186 return FALSE; -00187 } -00188 break; -00189 default: -00190 DBG_DEC(pEvent->type); -00191 return FALSE; -00192 } -00193 -00194 tRecLen = sizeof(drawfile_text) + DEFAULT_SCREEN_WIDTH * 2 / 3; -00195 tNbrRecs = pDiag->tInfo.length / tRecLen + 1; -00196 tEstSize = tNbrRecs * DEFAULT_SCREEN_WIDTH * 2 / 3; -00197 DBG_DEC(tEstSize); -00198 -00199 saveas(FILETYPE_TEXT, "WordText", tEstSize, bText2File, pDiag); -00200 return TRUE; -00201 } /* end of bSaveTextfile */ -00202 -00203 /* -00204 * bDraw2File - Save the generated draw file to a Draw file -00205 * -00206 * Remark: This is not a simple copy action. The origin of the -00207 * coordinates (0,0) must move from the top-left corner to the -00208 * bottom-left corner. -00209 */ -00210 static BOOL -00211 bDraw2File(char *szFilename, void *pvHandle) -00212 { -00213 FILE *pFile; -00214 diagram_type *pDiagram; -00215 wimp_box *pBbox; -00216 drawfile_object *pObj; -00217 drawfile_text *pText; -00218 drawfile_path *pPath; -00219 drawfile_sprite *pSprite; -00220 drawfile_jpeg *pJpeg; -00221 int *piPath; -00222 char *pcTmp; -00223 int iYadd, iToGo, iSize; -00224 BOOL bSuccess; -00225 -00226 TRACE_MSG("bDraw2File"); -00227 -00228 fail(szFilename == NULL || szFilename[0] == '\0'); -00229 fail(pvHandle == NULL); -00230 -00231 NO_DBG_MSG(szFilename); -00232 -00233 pDiagram = (diagram_type *)pvHandle; -00234 pFile = fopen(szFilename, "wb"); -00235 if (pFile == NULL) { -00236 werr(0, "I can't open '%s' for writing", szFilename); -00237 return FALSE; -00238 } -00239 iToGo = pDiagram->tInfo.length; -00240 DBG_DEC(iToGo); -00241 pcTmp = pDiagram->tInfo.data; -00242 bSuccess = bWrite2File(pcTmp, -00243 offsetof(drawfile_diagram, bbox), pFile, szFilename); -00244 if (bSuccess) { -00245 pcTmp += offsetof(drawfile_diagram, bbox); -00246 iToGo -= offsetof(drawfile_diagram, bbox); -00247 pBbox = (wimp_box *)pcTmp; -00248 iYadd = -pBbox->min.y; -00249 pBbox->min.y += iYadd; -00250 pBbox->max.y += iYadd; -00251 bSuccess = bWrite2File(pcTmp, -00252 sizeof(*pBbox), pFile, szFilename); -00253 iToGo -= sizeof(*pBbox); -00254 DBG_DEC(iToGo); -00255 pcTmp += sizeof(*pBbox); -00256 } else { -00257 iYadd = 0; -00258 } -00259 while (iToGo > 0 && bSuccess) { -00260 pObj = (drawfile_object *)pcTmp; -00261 iSize = pObj->size; -00262 switch (pObj->type) { -00263 case drawfile_TYPE_FONT_TABLE: -00264 bSuccess = bWrite2File(pcTmp, -00265 iSize, pFile, szFilename); -00266 pcTmp += iSize; -00267 iToGo -= iSize; -00268 break; -00269 case drawfile_TYPE_TEXT: -00270 pText = &pObj->data.text; -00271 /* First correct the coordinates */ -00272 pText->bbox.min.y += iYadd; -00273 pText->bbox.max.y += iYadd; -00274 pText->base.y += iYadd; -00275 /* Now write the information to file */ -00276 bSuccess = bWrite2File(pcTmp, -00277 iSize, pFile, szFilename); -00278 pcTmp += pObj->size; -00279 iToGo -= pObj->size; -00280 break; -00281 case drawfile_TYPE_PATH: -00282 pPath = &pObj->data.path; -00283 /* First correct the coordinates */ -00284 pPath->bbox.min.y += iYadd; -00285 pPath->bbox.max.y += iYadd; -00286 /* Now write the information to file */ -00287 bSuccess = bWrite2File(pPath, -00288 sizeof(*pPath), pFile, szFilename); -00289 pcTmp += sizeof(*pPath); -00290 iSize = pObj->size - sizeof(*pPath); -00291 fail(iSize < 14 * sizeof(int)); -00292 /* Second correct the path coordinates */ -00293 piPath = xmalloc(iSize); -00294 memcpy(piPath, pcTmp, iSize); -00295 piPath[ 2] += iYadd; -00296 piPath[ 5] += iYadd; -00297 piPath[ 8] += iYadd; -00298 piPath[11] += iYadd; -00299 if (bSuccess) { -00300 bSuccess = bWrite2File(piPath, -00301 iSize, pFile, szFilename); -00302 pcTmp += iSize; -00303 } -00304 piPath = xfree(piPath); -00305 iToGo -= pObj->size; -00306 break; -00307 case drawfile_TYPE_SPRITE: -00308 pSprite = &pObj->data.sprite; -00309 /* First correct the coordinates */ -00310 pSprite->bbox.min.y += iYadd; -00311 pSprite->bbox.max.y += iYadd; -00312 /* Now write the information to file */ -00313 bSuccess = bWrite2File(pcTmp, -00314 iSize, pFile, szFilename); -00315 pcTmp += pObj->size; -00316 iToGo -= pObj->size; -00317 break; -00318 case drawfile_TYPE_JPEG: -00319 pJpeg = &pObj->data.jpeg; -00320 /* First correct the coordinates */ -00321 pJpeg->bbox.min.y += iYadd; -00322 pJpeg->bbox.max.y += iYadd; -00323 pJpeg->trfm.entries[2][1] += iYadd; -00324 /* Now write the information to file */ -00325 bSuccess = bWrite2File(pcTmp, -00326 iSize, pFile, szFilename); -00327 pcTmp += pObj->size; -00328 iToGo -= pObj->size; -00329 break; -00330 default: -00331 DBG_DEC(pObj->type); -00332 bSuccess = FALSE; -00333 break; -00334 } -00335 } -00336 DBG_DEC_C(iToGo != 0, iToGo); -00337 (void)fclose(pFile); -00338 if (bSuccess) { -00339 vSetFiletype(szFilename, FILETYPE_DRAW); -00340 } else { -00341 (void)remove(szFilename); -00342 werr(0, "Unable to save drawfile '%s'", szFilename); -00343 } -00344 return bSuccess; -00345 } /* end of bDraw2File */ -00346 -00347 /* -00348 * bSaveDrawfile - save the diagram as a draw file -00349 */ -00350 BOOL -00351 bSaveDrawfile(event_pollblock *pEvent, void *pvReference) -00352 { -00353 diagram_type *pDiag; -00354 size_t tEstSize; -00355 -00356 TRACE_MSG("bSaveDrawfile"); -00357 -00358 fail(pEvent == NULL); -00359 fail(pvReference == NULL); -00360 -00361 pDiag = (diagram_type *)pvReference; -00362 -00363 switch (pEvent->type) { -00364 case event_SEND: /* From a menu */ -00365 fail(pEvent->data.message.header.action != message_MENUWARN); -00366 if (menu_currentopen != pDiag->pSaveMenu || -00367 pEvent->data.message.data.menuwarn.selection[0] != -00368 SAVEMENU_SAVEDRAW) { -00369 return FALSE; -00370 } -00371 break; -00372 case event_KEY: /* From a key short cut */ -00373 if (pEvent->data.key.caret.window != pDiag->tMainWindow) { -00374 return FALSE; -00375 } -00376 break; -00377 default: -00378 DBG_DEC(pEvent->type); -00379 return FALSE; -00380 } -00381 -00382 tEstSize = pDiag->tInfo.length; -00383 DBG_DEC(tEstSize); -00384 -00385 saveas(FILETYPE_DRAW, "WordDraw", tEstSize, bDraw2File, pDiag); -00386 return TRUE; -00387 } /* end of bSaveDrawfile */ -