|
|
1.1 ! root 1: /* Owner.m ! 2: * ! 3: * You may freely copy, distribute, and reuse the code in this example. ! 4: * NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 5: * fitness for any particular use. ! 6: * ! 7: * ! 8: * ! 9: * Written by: Mai Nguyen, NeXT Developer Support ! 10: */ ! 11: ! 12: ! 13: #import <eointerface/eointerface.h> ! 14: #import "Owner.h" ! 15: #import "Author.h" ! 16: ! 17: #define ARCHIVE_FILE "ObjectArchive" ! 18: ! 19: @implementation Owner ! 20: ! 21: ! 22: - appDidInit:sender ! 23: { ! 24: EOAdaptorChannel *adaptorChannel; ! 25: ! 26: /* set up the adaptor channel for debugging */ ! 27: adaptorChannel = [[dataSource databaseChannel] adaptorChannel]; ! 28: [(EOAdaptorChannel *)adaptorChannel setDelegate: self]; ! 29: return self; ! 30: } ! 31: ! 32: ! 33: - (void)adaptorChannel:channel didEvaluateExpression:(NSString *)expression ! 34: { ! 35: NSLog (expression); ! 36: } ! 37: ! 38: /* Archive the first object in the array of selected objects. ! 39: * In this example, only one object is selected at a time. ! 40: */ ! 41: - writeObject:sender ! 42: { ! 43: eoArray = [controller selectedObjects]; ! 44: // Archive the first object in the array of selected objects. ! 45: // In this example, only one object is selected at a time. ! 46: if ([eoArray count] == 0) { ! 47: NXRunAlertPanel(NULL, "No object to archive!", NULL, NULL, NULL); ! 48: return self; ! 49: } ! 50: ! 51: eoAuthor = [eoArray objectAtIndex:0]; ! 52: [self archiveThisObject:eoAuthor]; ! 53: ! 54: return self; ! 55: } ! 56: ! 57: - readObject:sender ! 58: { ! 59: eoAuthor = (Author *)[self unarchiveObject]; ! 60: return self; ! 61: } ! 62: ! 63: ! 64: - (BOOL) archiveThisObject:(Object *)object ! 65: { ! 66: NXTypedStream *stream; ! 67: char archivePath[MAXPATHLEN+1]; ! 68: BOOL b = YES; ! 69: ! 70: if (!object) ! 71: return NO; ! 72: ! 73: NS_DURING ! 74: ! 75: sprintf(archivePath, "%s/%s", [[self applicationPath] cString], ARCHIVE_FILE); ! 76: stream = NXOpenTypedStreamForFile(archivePath, NX_WRITEONLY); ! 77: NXWriteRootObject(stream, object); ! 78: NXCloseTypedStream(stream); ! 79: ! 80: NS_HANDLER ! 81: ! 82: [textObject appendText:"Object archiving failed\n"]; ! 83: b = NO; ! 84: ! 85: NS_ENDHANDLER ! 86: ! 87: if (b == YES) ! 88: [textObject appendText:"Object archiving succeeded\n"]; ! 89: ! 90: return b; ! 91: } ! 92: ! 93: -(Object *)unarchiveObject ! 94: { ! 95: NXTypedStream *stream; ! 96: Object *object; ! 97: char archivePath[MAXPATHLEN+1]; ! 98: char buf[1024]; ! 99: ! 100: ! 101: sprintf(archivePath, "%s/%s", [[self applicationPath] cString], ARCHIVE_FILE); ! 102: stream = NXOpenTypedStreamForFile(archivePath, NX_READONLY); ! 103: if (!stream) { ! 104: object = nil; ! 105: [textObject appendText:"Object unarchiving failed\n"]; ! 106: return object; ! 107: } ! 108: ! 109: object = NXReadObject(stream); ! 110: ! 111: NXCloseTypedStream(stream); ! 112: [textObject appendText:"Object unarchiving succeeded\n"]; ! 113: sprintf(buf, "%s\n",[[(Author *)object description] cString]); ! 114: [textObject appendText: "Author contents:"]; ! 115: [textObject appendText:buf]; ! 116: ! 117: return [object autorelease]; ! 118: } ! 119: ! 120: - (NSString *)applicationPath ! 121: { ! 122: int i; ! 123: NSString *appPathName = nil; ! 124: ! 125: for (i = strlen(NXArgv[0]) - 1; (i >= 0) && (NXArgv[0][i] != '/'); i--); ! 126: appPathName = [NSString stringWithCString:NXArgv[0] length:i]; ! 127: if (NXArgv[0][0] != '/') { ! 128: char path[MAXPATHLEN+1]; ! 129: appPathName = [NSString stringWithFormat:@"%s/%@", getwd(path), appPathName]; ! 130: } ! 131: return appPathName; ! 132: } ! 133: ! 134: @end ! 135: ! 136: ! 137: @implementation Text(printResults) ! 138: ! 139: - appendText:(const char *)newText ! 140: { ! 141: int currentLength = [self textLength]; ! 142: ! 143: [self setSel:currentLength :currentLength]; ! 144: [self replaceSel:newText]; ! 145: [self scrollSelToVisible]; ! 146: return self; ! 147: } ! 148: ! 149: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.