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 @@ - - - - -TB9.2 Example Applications: examples/PIPS/antiword/src/saveas.c Source File - - - - - -

examples/PIPS/antiword/src/saveas.c

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 */
-
-
Generated by  - -doxygen 1.6.2
- -