home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-09 | 5.6 KB | 199 lines | [TEXT/KAHL] |
- #include "document.h"
- #include <Errors.h>
-
- int QuotesDocument::available(void) const {
- return (**hrsrcCookie).cFortune;
- }
-
- unsigned char *QuotesDocument::text(void) const {
- return pchFortune;
- }
-
- OSErr QuotesDocument::draw(int sel) {
- OSErr err;
- long *pFortune = &(**hrsrcCookie).fortune[0];
- if (sel < 0 || sel >= (**hrsrcCookie).cFortune) // fortunes are from 0 to cFortune-1, cFortune points to EOF
- err = paramErr;
- else {
- long posCookie = pFortune[sel];
- long size = pFortune[sel+1] - posCookie;
- if (size > MAX_FORTUNE)
- size = MAX_FORTUNE;
- if (sel < (**hrsrcCookie).cFortune-1)
- size -= 2; // remove the two consecutive cookie separators
- if (pchFortune) {
- SetPtrSize((Ptr)pchFortune, size+1);
- err = MemError();
- if (err != noErr) {
- DisposePtr((Ptr)pchFortune);
- pchFortune = (unsigned char *)NewPtr(size+1);
- }
- } else
- pchFortune = (unsigned char *)NewPtr(size+1);
- if (pchFortune == NULL)
- err = notEnoughMemoryErr;
- else {
- err = SetFPos(selData, fsFromStart, posCookie);
- if (err == noErr)
- err = FSRead(selData, &size, pchFortune); // read the fortune from the cookie
- pchFortune[size] = 0;
- }
- }
- return err;
- }
-
- QuotesDocument::QuotesDocument(FSSpec fs, OSErr &err) {
- pchFortune = NULL;
- selSave = SAVE_NO;
- fsCookie = fs;
- unsigned long sizeCurrent = current_size();
- long response;
- err = Gestalt(gestaltFSAttr, &response);
- int fHasFSSpec;
- if (err == noErr)
- fHasFSSpec = response & (1<<gestaltHasFSSpecCalls);
- else {
- fHasFSSpec = 0;
- err = noErr;
- }
- if (fHasFSSpec)
- err = FSpOpenDF(&fsCookie, fsRdPerm, &selData);
- else {
- err = HOpenDF(fsCookie.vRefNum, fsCookie.parID, (ConstStr255Param)&fsCookie.name, fsRdPerm, &selData);
- if (err == paramErr)
- err = HOpen(fsCookie.vRefNum, fsCookie.parID, (ConstStr255Param)&fsCookie.name, fsRdPerm, &selData);
- }
- if (fHasFSSpec)
- selResource = FSpOpenResFile(&fsCookie, fsRdWrPerm);
- else
- selResource = HOpenResFile(fsCookie.vRefNum, fsCookie.parID, (ConstStr255Param)&fsCookie.name, fsRdWrPerm);
- err = ResError();
- if (err == noErr) {
- UseResFile(selResource);
- hrsrcCookie = (CookieResource **)Get1Resource(TYPE_COOKIE, ID_COOKIE);
- } else
- hrsrcCookie = NULL;
- if (hrsrcCookie == NULL) { // does the file need a cookie?
- hrsrcCookie = (CookieResource **)NewHandle(MAX_FORTUNE); // create full size cookie resource
- if (hrsrcCookie == NULL)
- err = notEnoughMemoryErr;
- else {
- err = scan();
- if (err == noErr || err == eofErr) {
- SetHandleSize((Handle)hrsrcCookie, resource_size() );
- if (err == noErr) {
- selSave = SAVE_NEW; // create a new cookie
- (**hrsrcCookie).size = sizeCurrent;
- }
- }
- err = MemError();
- }
- } else {
- if (sizeCurrent == (**hrsrcCookie).size) {
- DetachResource((Handle)hrsrcCookie);
- err = noErr; // cookie is still valid
- } else {
- SetHandleSize((Handle)hrsrcCookie, MAX_FORTUNE); // resize to full size cookie resource
- err = MemError();
- if (err == noErr) {
- err = scan();
- if (err == noErr || err == eofErr) {
- SetHandleSize((Handle)hrsrcCookie, resource_size() );
- if (err == noErr) {
- selSave = SAVE_UPDATE; // update cookie
- (**hrsrcCookie).size = sizeCurrent;
- }
- }
- err = MemError();
- } else
- err = notEnoughMemoryErr;
- }
- }
- }
-
- // update cookie resource by scanning cookie data file, and set error in cookie
- OSErr QuotesDocument::scan(void) {
- int iFortune = 0;
- long cCh = 1;
- long posCookie; // position within the data fork of the cookie file
- int fCookieBreak = 0;
- char ch;
- OSErr errRead = SetFPos(selData, fsFromStart, 0);
- HLock((char **)hrsrcCookie);
- long *pFortune = &(**hrsrcCookie).fortune[0];
- pFortune[iFortune++] = 0;
- while (errRead == noErr && cCh == 1) {
- errRead = FSRead(selData, &cCh, &ch); // read one character from the cookie data fork
- if (errRead == eofErr)
- break;
- if (ch == COOKIE_SEPARATOR)
- if (fCookieBreak) {
- fCookieBreak = 0;
- errRead = GetFPos(selData, &posCookie);
- if (errRead == noErr)
- pFortune[iFortune++] = posCookie; // record current position
- if (iFortune == LAST_FORTUNE)
- errRead = eofErr; // limit cookie to LAST_FORTUNE number of fortunes
- } else
- fCookieBreak = 1;
- else
- fCookieBreak = 0;
- }
- errRead = GetEOF(selData, &posCookie);
- if (errRead == noErr)
- pFortune[iFortune] = posCookie;
- HUnlock((char **)hrsrcCookie);
- (**hrsrcCookie).cFortune = iFortune;
- return errRead;
- }
-
- unsigned long QuotesDocument::resource_size(void) const {
- return sizeof(CookieResource) + (**hrsrcCookie).cFortune*sizeof(long);
- }
-
- Boolean QuotesDocument::save(void) const {
- return (selSave != SAVE_NO);
- }
-
- void QuotesDocument::discard(void) {
- selSave = SAVE_NO;
- }
-
- unsigned long QuotesDocument::current_size(void) const {
- CInfoPBRec info;
- info.hFileInfo.ioCompletion = NULL;
- info.hFileInfo.ioFDirIndex = 0;
- info.hFileInfo.ioNamePtr = fsCookie.name;
- info.hFileInfo.ioVRefNum = fsCookie.vRefNum;
- info.hFileInfo.ioDirID = fsCookie.parID;
- PBGetCatInfo(&info, 0);
- if (info.hFileInfo.ioResult == noErr)
- return info.hFileInfo.ioFlLgLen;
- else
- return 0;
- }
-
- QuotesDocument::~QuotesDocument() {
- OSErr err;
- switch (selSave) {
- case SAVE_NO:
- DisposeHandle((Handle)hrsrcCookie);
- break;
- case SAVE_UPDATE:
- ChangedResource((Handle)hrsrcCookie);
- err = ResError();
- if (err == noErr)
- WriteResource((Handle)hrsrcCookie);
- break;
- case SAVE_NEW:
- UseResFile(selResource);
- AddResource((Handle)hrsrcCookie, TYPE_COOKIE, ID_COOKIE, NULL);
- err = ResError();
- if (err == noErr)
- WriteResource((Handle)hrsrcCookie);
- }
- if (selResource != -1) // if selResource == -1, then hrsrcCookie is not a resource
- CloseResFile(selResource);
- FSClose(selData);
- }
-