home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Snippets / EMBL Search / Sources / save.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-04  |  10.8 KB  |  471 lines  |  [TEXT/KAHL]

  1. /*
  2. *********************************************************************
  3. *    
  4. *    save.c
  5. *    Saving window contents to disk
  6. *
  7. *    Rainer Fuchs
  8. *    EMBL Data Library
  9. *    Postfach 10.2209
  10. *    D-6900 Heidelberg, FRG
  11. *    E-mail: fuchs@embl-heidelberg.de
  12. *
  13. *    Copyright © 1992 EMBL Data Library
  14. *        
  15. **********************************************************************
  16. *    
  17. */ 
  18.  
  19. #include <stdio.h>
  20. #include <string.h>
  21.  
  22. #include "EMBL-Search.h"
  23. #include "EMBL-Search.rsrc.h"
  24.  
  25. /*
  26. ******************************* Prototypes ***************************
  27. */
  28.  
  29. #include "save.h"
  30. #include "util.h"
  31. #include "hitstorage.h"
  32. #include "pstr.h"
  33. #include "sequence.h"
  34. #include "query.h"
  35. #include "window.h"
  36. #include "export.h"
  37.  
  38. static Boolean SaveResData(Str255 fName, short vRefNum, ResultHdl resHdl);
  39. static Boolean SaveResRsrc(Str255 fName, ResultHdl resHdl);
  40. static Boolean SaveQueryRsrc(Str255 fName, QueryHdl queryHdl);
  41. static Boolean SaveRes(WDPtr wdp, Str255 fName, short vRefNum);
  42. static Boolean SaveSeq(WDPtr wdp, Str255 fName, short vRefNum);
  43. static Boolean SaveQuery(WDPtr wdp, Str255 fName, short vRefNum);
  44. static Boolean SaveResAs(WDPtr wdp);
  45. static Boolean SaveSeqAs(WDPtr wdp);
  46. static Boolean SaveQueryAs(WDPtr wdp);
  47.  
  48.  
  49.  
  50. /*
  51. ******************************** Globals *****************************
  52. */
  53.  
  54. extern CursHandle    gCursor[8];
  55. extern short        gCurrentCursor;
  56. extern char            gError[256];
  57. extern DBInfo        gDBInfo[DB_NUM];
  58. extern Prefs        gPrefs;
  59.  
  60. /**************************************
  61. *    Save routines dispatcher
  62. *    Return value:    TRUE, if successful
  63. *                        FALSE, if error occurred
  64. */
  65.  
  66. Boolean DoSave(WDPtr wdp,Boolean save)
  67. {
  68.     Boolean ret=TRUE;
  69.     
  70.     if( wdp == NULL)
  71.         return(FALSE);
  72.         
  73.     switch( ((WindowPeek)wdp)->windowKind) {
  74.         case queryW:
  75.             if(save && wdp->inited)
  76.                 /* if Save… selected and if a file already exists */
  77.                 ret=SaveQuery(wdp, wdp->fName,wdp->vRefNum);
  78.             else
  79.                 ret=SaveQueryAs(wdp);
  80.             break;
  81.         case seqW:
  82.             ret=SaveSeqAs(wdp);
  83.             break;
  84.         case resW:
  85.             if(save && wdp->inited)
  86.                 /* if Save… selected and if a file already exists */
  87.                 ret=SaveRes(wdp, wdp->fName,wdp->vRefNum);
  88.             else
  89.                 ret=SaveResAs(wdp);
  90.             break;
  91.         default: SysBeep(10);
  92.     }
  93.     return(ret);
  94. }
  95.  
  96.  
  97. /**************************************
  98. *     Create data fork of result file
  99. *    Return value:    TRUE, if successful
  100. *                        FALSE, if error occurred
  101. */
  102.  
  103. static Boolean SaveResData(Str255 fName, short vRefNum,ResultHdl resHdl)
  104. {
  105.     short                output;
  106.     long                count;
  107.     CString80Hdl    bufHdl;
  108.     SignedByte        oldState;
  109.     short                hitPos, bufPos;
  110.  
  111.     /* Create and open a new file */
  112.     if( CreateMacFile(fName,vRefNum,kApplSignature,kResFileType,TRUE) != noErr )
  113.        return(FALSE);
  114.  
  115.     if( OpenMacFile(fName,vRefNum,&output, TRUE) != noErr )
  116.           return(FALSE);    
  117.     
  118.     /* Lock down result data */
  119.     bufHdl = (**resHdl).descBufHdl;
  120.     oldState=LockHandleHigh((Handle)bufHdl);
  121.     
  122.     /* now save hit by hit */
  123.     StartWaitCursor();
  124.     for(    hitPos = 0,bufPos = 0;
  125.             hitPos < (**resHdl).nhits;
  126.             ++hitPos, ++bufPos) {
  127.         RotateWaitCursor();
  128.         /* refill buffer if necessary */
  129.         if( hitPos < (**resHdl).buftop || hitPos >= (**resHdl).buftop + MAXBUFLINES) {
  130.             if( !FillDEBuffer(resHdl,hitPos,FALSE) )
  131.                 break;
  132.             bufPos = 0;
  133.         }
  134.         
  135.         /* write output */
  136.         count = (long) pstrlen((StringPtr)(*bufHdl)[bufPos]);
  137.         if( WriteMacFile(output, &count, (*bufHdl)[bufPos]+1,fName, TRUE) != noErr ) 
  138.            break;
  139.        /* add newline */
  140.        count = 1L;
  141.        if( WriteMacFile(output,&count, "\r",fName,TRUE) != noErr)
  142.            break;
  143.     }
  144.     FSClose(output);
  145.     HSetState((Handle)bufHdl,oldState);
  146.     InitCursor();
  147.     
  148.     return( hitPos == (**resHdl).nhits );
  149. }
  150.  
  151.  
  152. /**************************************
  153. *    Create resource fork of result file
  154. *    Return value:    TRUE, if successful
  155. *                        FALSE, if error occurred
  156. */
  157.  
  158. static Boolean SaveResRsrc(Str255 fName, ResultHdl resHdl)
  159. {  
  160.     short            refNum;
  161.     HitmapHdl     hitmapHdl;
  162.     QueryHdl        queryHdl;
  163.     OSErr            err;
  164.     
  165.     /* open resource fork            */
  166.    
  167.    CreateResFile(fName);
  168.     if((refNum=OpenResFile(fName)) == -1) {
  169.         sprintf(gError,LoadErrorStr(ERR_OPENRES,FALSE),
  170.                     PtoCstr(fName),ResError());
  171.         CtoPstr((char *)fName);
  172.         return(ErrorMsg(0));
  173.     }
  174.  
  175.     /* Store query */
  176.     
  177.     queryHdl = (**resHdl).queryHdl;
  178.     AddResource((Handle)queryHdl,kQueryRsrcType,kStdRsrc,kQueryRsrcName);
  179.     if( (err=ResError()) != noErr ) {
  180.         DetachResource((Handle)queryHdl);
  181.       CloseResFile(refNum);
  182.         sprintf(gError,LoadErrorStr(ERR_WRITERES,FALSE),
  183.                     PtoCstr(fName),err);
  184.         CtoPstr((char *)fName);
  185.         return(ErrorMsg(0));
  186.     }
  187.     WriteResource((Handle)queryHdl);    /* and write it (we have to clear the
  188.                                                 change attr before a DetachResource() */
  189.     if( (err=ResError()) != noErr ) {                /* error                         */
  190.         DetachResource((Handle)queryHdl);
  191.       CloseResFile(refNum);
  192.         sprintf(gError,LoadErrorStr(ERR_WRITERES,FALSE),
  193.                     PtoCstr(fName),err);
  194.         CtoPstr((char *)fName);
  195.         return(ErrorMsg(0));
  196.     }
  197.     /* Get back control over queryHdl from resource mgr */
  198.     DetachResource((Handle)queryHdl);
  199.  
  200.     /* Now store hitmap */
  201.     
  202.     hitmapHdl = (**resHdl).hitmapHdl;
  203.     AddResource((Handle)hitmapHdl,kHitmapRsrcType,kStdRsrc,kHitmapRsrcName);
  204.     if( (err=ResError()) != noErr ) {
  205.         DetachResource((Handle)hitmapHdl);
  206.       CloseResFile(refNum);
  207.         sprintf(gError,LoadErrorStr(ERR_WRITERES,FALSE),
  208.                     PtoCstr(fName),err);
  209.         CtoPstr((char *)fName);
  210.         return(ErrorMsg(0));
  211.     }
  212.     WriteResource((Handle)hitmapHdl);    /* and write it (we have to clear the
  213.                                                 change attr before a DetachResource() */
  214.     if( (err=ResError()) != noErr ) {                /* error                         */
  215.         DetachResource((Handle)hitmapHdl);
  216.       CloseResFile(refNum);
  217.         sprintf(gError,LoadErrorStr(ERR_WRITERES,FALSE),
  218.                     PtoCstr(fName),err);
  219.         CtoPstr((char *)fName);
  220.         return(ErrorMsg(0));
  221.     }
  222.     /* Get back control over hitmapHdl from resource mgr */
  223.     DetachResource((Handle)hitmapHdl);
  224.  
  225.     CloseResFile(refNum);
  226.     return(TRUE);
  227. }
  228.  
  229.  
  230. /**************************************
  231. *    Create resource fork of query file
  232. *    Return value:    TRUE, if successful
  233. *                        FALSE, if error occurred
  234. */
  235.  
  236. static Boolean SaveQueryRsrc(Str255 fName, QueryHdl queryHdl)
  237. {  
  238.     short            refNum;
  239.     OSErr            err;
  240.     
  241.     /* open resource fork            */
  242.    
  243.    CreateResFile(fName);
  244.     if((refNum=OpenResFile(fName)) == -1) {
  245.         sprintf(gError,LoadErrorStr(ERR_OPENRES,FALSE),
  246.                     PtoCstr(fName),ResError());
  247.         CtoPstr((char *)fName);
  248.         return(ErrorMsg(0));
  249.     }
  250.  
  251.     /* Store query */
  252.     
  253.     AddResource((Handle)queryHdl,kQueryRsrcType,kStdRsrc,kQueryRsrcName);
  254.     if( (err=ResError()) != noErr ) {
  255.         DetachResource((Handle)queryHdl);
  256.       CloseResFile(refNum);
  257.         sprintf(gError,LoadErrorStr(ERR_WRITERES,FALSE),
  258.                     PtoCstr(fName),err);
  259.         CtoPstr((char *)fName);
  260.         return(ErrorMsg(0));
  261.     }
  262.     WriteResource((Handle)queryHdl);    /* and write it (we have to clear the
  263.                                                 change attr before a DetachResource() */
  264.     if( (err=ResError()) != noErr ) {                /* error                         */
  265.         DetachResource((Handle)queryHdl);
  266.       CloseResFile(refNum);
  267.         sprintf(gError,LoadErrorStr(ERR_WRITERES,FALSE),
  268.                     PtoCstr(fName),err);
  269.         CtoPstr((char *)fName);
  270.         return(ErrorMsg(0));
  271.     }
  272.     /* Get back control over queryHdl from resource mgr */
  273.     DetachResource((Handle)queryHdl);
  274.  
  275.     WriteNameStringRsrc(refNum);    /* write name string resource (for system 7.0) */
  276.     
  277.     CloseResFile(refNum);
  278.     return(TRUE);
  279. }
  280.  
  281.  
  282. /**************************************
  283. *    Save result data to a file
  284. *    Return value:    TRUE, if successful
  285. *                        FALSE, if error occurred
  286. */
  287.  
  288. static Boolean SaveRes(WDPtr wdp, Str255 fName, short vRefNum)
  289. {
  290.     ResultHdl    resHdl;
  291.     Str255        volName;
  292.     short            oldVRefNum;
  293.     Boolean        ret;
  294.     
  295.     resHdl = (ResultHdl)(wdp->userHandle);
  296.     if(resHdl == NULL)
  297.         return(FALSE);
  298.  
  299.     StartWaitCursor();
  300.     if ( !SaveResData(fName,vRefNum,resHdl) )
  301.         return(FALSE);
  302.     
  303.     /* set default directory */
  304.     GetVol(volName,&oldVRefNum);
  305.     SetVol(NULL,vRefNum);
  306.     
  307.     ret = SaveResRsrc(fName,resHdl);
  308.     
  309.     FlushVol(NULL,vRefNum);
  310.     SetVol(NULL,oldVRefNum);
  311.     
  312.     /* update window descr. record */
  313.     if(ret) {
  314.         wdp->dirty = FALSE;
  315.         wdp->inited = TRUE;
  316.     }
  317.     InitCursor();
  318.     return(ret);
  319. }
  320.  
  321. /**************************************
  322. *    Save a sequence
  323. *    Return value:    TRUE, if successful
  324. *                        FALSE, if error occurred
  325. */
  326.  
  327. static Boolean SaveSeq(WDPtr wdp, Str255 fName, short vRefNum)
  328. {
  329.     SeqRecHdl    seqRecHdl;
  330.     Boolean        ret;
  331.     
  332.     seqRecHdl = (SeqRecHdl)(wdp->userHandle);
  333.     if(seqRecHdl == NULL)
  334.         return(FALSE);
  335.  
  336.     StartWaitCursor();
  337.     if ( !SaveSeqData(fName,vRefNum,seqRecHdl) )
  338.         return(FALSE);
  339.     
  340.     /* update window descr. record */
  341.     wdp->dirty = FALSE;
  342.     wdp->inited = TRUE;
  343.  
  344.     InitCursor();
  345.     return(ret);
  346. }
  347.  
  348. /**************************************
  349. *    Save query data to a  file
  350. *    Return value:    TRUE, if successful
  351. *                        FALSE, if error occurred
  352. */
  353.  
  354. static Boolean SaveQuery(WDPtr wdp, Str255 fName, short vRefNum)
  355. {
  356.     QueryHdl        queryHdl;
  357.     Str255        volName;
  358.     short            oldVRefNum;
  359.     Boolean        ret;
  360.     FInfo            fndrInfo;
  361.     
  362.     queryHdl = (QueryHdl)(wdp->userHandle);
  363.     if(queryHdl == NULL)
  364.         return(FALSE);
  365.  
  366.     UpdateQueryRec(wdp);
  367.     
  368.     StartWaitCursor();
  369.  
  370.     /* Delete any old version */
  371.     DeleteMacFile(fName,vRefNum);
  372.     
  373.     /* set default directory */
  374.     GetVol(volName,&oldVRefNum);
  375.     SetVol(NULL,vRefNum);
  376.     
  377.     ret = SaveQueryRsrc(fName,queryHdl);
  378.                         
  379.     /* update Finder information */
  380.    GetFInfo(fName,vRefNum,&fndrInfo);
  381.    fndrInfo.fdType = kQryFileType;
  382.    fndrInfo.fdCreator = kApplSignature;
  383.    SetFInfo(fName,vRefNum,&fndrInfo);
  384.     FlushVol(NULL,vRefNum);
  385.     SetVol(NULL,oldVRefNum);
  386.     
  387.     /* update window descr. record */
  388.     if(ret) {
  389.         wdp->dirty = FALSE;
  390.         wdp->inited = TRUE;
  391.     }
  392.     InitCursor();
  393.     return(ret);
  394. }
  395.  
  396. /**************************************
  397. *    Save results in a new file 
  398. *    Return value:    TRUE, if successful
  399. *                        FALSE, if error occurred
  400. */
  401.  
  402. static Boolean SaveResAs(WDPtr wdp)
  403. {
  404.     Str255    newFName;
  405.     short        newVRefNum;
  406.     Boolean    ret=FALSE;
  407.         
  408.     if(GetNewFilename(wdp->fName,&newVRefNum,newFName)) {
  409.         ret=SaveRes(wdp,newFName,newVRefNum);
  410.         if( ret ) {
  411.             DelWindowFromMenu(wdp->fName);
  412.             pstrcpy(wdp->fName,newFName);
  413.             wdp->vRefNum = newVRefNum;
  414.             SetWTitle((WindowPtr)wdp,newFName);
  415.             AddWindowToMenu(newFName);
  416.         }
  417.     }
  418.     return(ret);
  419. }
  420.  
  421. /**************************************
  422. *    Save sequence in a new file
  423. *    Return value:    TRUE, if successful
  424. *                        FALSE, if error occurred
  425. */
  426.  
  427. static Boolean SaveSeqAs(WDPtr wdp)
  428. {
  429.     Str255    ename,oldFName,newFName;
  430.     short        newVRefNum;
  431.     Boolean    ret=FALSE;
  432.  
  433.     GetWTitle((WindowPtr)wdp,ename);
  434.     BuildFName(oldFName,ename,gPrefs.format);
  435.  
  436.     if(GetNewFilename(oldFName,&newVRefNum,newFName)) {
  437.         ret=SaveSeq(wdp,newFName,newVRefNum);
  438.         if( ret ) {
  439.             pstrcpy(wdp->fName,newFName);
  440.             wdp->vRefNum = newVRefNum;
  441.         }
  442.     }
  443.     return(ret);
  444. }
  445.  
  446. /**************************************
  447. *    Save query in a new file 
  448. *    Return value:    TRUE, if successful
  449. *                        FALSE, if error occurred
  450. */
  451.  
  452. static Boolean SaveQueryAs(WDPtr wdp)
  453. {
  454.     Str255    newFName;
  455.     short        newVRefNum;
  456.     Boolean    ret=FALSE;
  457.         
  458.     if(GetNewFilename(wdp->fName,&newVRefNum,newFName)) {
  459.         ret=SaveQuery(wdp,newFName,newVRefNum);
  460.         if( ret ) {
  461.             DelWindowFromMenu(wdp->fName);
  462.             pstrcpy(wdp->fName,newFName);
  463.             wdp->vRefNum = newVRefNum;
  464.             SetWTitle((WindowPtr)wdp,newFName);
  465.             AddWindowToMenu(newFName);
  466.         }
  467.     }
  468.     return(ret);
  469. }
  470.  
  471.