This is PVlink.m in view mode; [Download] [Up]
{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;\f1\fmodern Courier;} \paperw11440 \paperh9000 \margl120 \margr120 {\colortbl;\red0\green0\blue0;} \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b\i0\ulnone\fs24\fc0\cf0 #import <appkit/appkit.h>\ #import "PVlink.h"\ #import "ArchieApp.h"\ #import "ObjectList.h"\ \ #import <objc/NXStringTable.h>\ \ @implementation PVlink\ \ \b0\i\fs28 /*\\ ---------------------- Initialization Methods ---------------------- \\*/ \b\i0\fs24 \ - initVLINK:(VLINK) v\ \{\ \pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\fc0\cf0 /* {{\NeXTHelpMarker250 \markername initVLINK:;} ¬}\pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\ulnone\fs24\fc0\cf0 --- \ul MethodDescription \ulnone \ \i0\ul ReturnValue: \i\ulnone self;\ \i0\ul Description: \i\ulnone Initializes a PVlink object from the information\ in the Prospero VLINK structure. \fc1\cf1 Parsing is based on\ the parseHostAndFilename() proceedure of archie.c in the\ XArchie distribution.; \fc0\cf0 \ \i0\ul Args: \i\ulnone \ v: The Prospero VLINK we are to represent;\ */ \pard\tx480\tx960\tx1440\tx1920\tx2400\tx2880\tx3360\tx3840\tx4320\tx4800\b\i0\fc0\cf0 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\fc0\cf0 PATTRIB link;\ int y, m, d, hr, min, size;\ char host[MAX_VPATH], location[MAX_VPATH], filename[MAX_VPATH], mode[11];\ void parseHostAndFilename(VLINK , char *, char *, char *);\ \ parseHostAndFilename(v, host, location, filename);\ strcat(location, "/");\ strcat(location, filename);\ \b0\i /* Parse v->lattrib */ \b\i0 \ link = v->lattrib;\ size = 0;\ while( link )\ \{\ if( strcmp(SIZE, link->aname) == 0 )\ size = atoi(link->value.ascii);\ else if( strcmp(MODES, link->aname) == 0 )\ strncpy(mode, link->value.ascii,10);\ else if( strcmp(DATE, link->aname) == 0 )\ \{\ sscanf(link->value.ascii,"%4d%2d%2d%2d%2d",\ &y, &m, &d, &hr, &min);\ \}\ link = link->next;\ \}\ mode[10] = '\\0';\ [super init: location mode: mode size: size day: d month: m year: y\ hour: hr min: min];\ [super setSourceHost: host];\ \b0\i\fc1\cf1 /* Save the Prospero host and filename for later use */ \b\i0\fc0\cf0 \ vlinkHostname = NXCopyStringBuffer(v->host);\ vlinkFilename = NXCopyStringBuffer(v->filename);\ \ return self;\ \} \b0\i\fc1\cf1 // End initVLINK: \b\i0\fc0\cf0 \ \ - setListing: (VLINK) entries\ \{\ \pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\fc0\cf0 /* {{\NeXTHelpMarker1577 \markername setListing:;} ¬}\pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\ulnone\fs24\fc0\cf0 --- \ul MethodDescription \ulnone \ \i0\ul ReturnValue: \i\ulnone A ObjectList of PVlink objects corresponding to entries;\ \i0\ul Description: \i\ulnone This method parses the linked list of VLINK structs\ given by entries into a ObjectList of corresponding PVlink objects and\ assigns the list to our listing instance variable. This\ list represents the contents of a Prospero directory. \fc1\cf1 ; \fc0\cf0 \ \i0\ul Args: \i\ulnone \ entries: A linked list of VLINKs for our directory contents;\ */ \pard\tx480\tx960\tx1440\tx1920\tx2400\tx2880\tx3360\tx3840\tx4320\tx4800\b\i0\fc0\cf0 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\fc0\cf0 VLINK next;\ id vlink;\ \ if( listing != nil )\ [listing empty];\ else\ listing = [[ObjectList alloc] initCount: 0];\ \ while( entries != NULL )\ \{\ vlink = [[PVlink alloc] initVLINK: entries];\ if(vlink == nil)\ \{\ [listing free];\ return nil;\ \}\ [listing addObject: vlink];\ next = entries->next;\ entries = next;\ \}\ dirLoading = NO;\ \ return listing;\ \} \b0\i // End setListing: \b\i0 \ \ - free\ \{\ \pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\fc0\cf0 /* {{\NeXTHelpMarker2399 \markername free;} ¬}\pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\ulnone\fs24\fc0\cf0 --- \ul MethodDescription \ulnone \ \i0\ul ReturnValue: \i\ulnone [super free];\ \i0\ul Description: \i\ulnone This method frees the variables we allocate \fc1\cf1 ; \fc0\cf0 \ */ \pard\tx480\tx960\tx1440\tx1920\tx2400\tx2880\tx3360\tx3840\tx4320\tx4800\b\i0\fc0\cf0 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\fc0\cf0 free(vlinkHostname);\ free(vlinkFilename);\ \ return [super free];\ \} \b0\i // End free \b\i0 \ \ \b0\i\fs28\fc1\cf1 /*\\ -------------------- Info Methods -------------------- \\*/ \b\i0\fs24\fc0\cf0 \ - (const char *) vlinkHostname\ \{ \f1\b0\i // {\f0\b\i0{\NeXTHelpMarker2694 \markername vlinkHostname;} ¬}\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b\i0\ulnone\fs24\fc0\cf0 \ return vlinkHostname;\ \}\ - (const char *) vlinkFilename\ \{ \f1\b0\i // {\f0\b\i0{\NeXTHelpMarker2757 \markername vlinkFilename;} ¬}\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b\i0\ulnone\fs24\fc0\cf0 \ return vlinkFilename;\ \}\ \ - writeInfo:(NXStream *) stream\ \{\ \pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\fc0\cf0 /* {{\NeXTHelpMarker2821 \markername writeInfo:;} ¬}\pard\tx180\tx360\tx540\tx720\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\ulnone\fs24\fc0\cf0 --- \ul MethodDescription \ulnone \ \i0\ul ReturnValue: \i\ulnone self;\ \i0\ul Description: \i\ulnone This method writes a simple description of the\ PVlink we represent to the argument stream \fc1\cf1 ; \fc0\cf0 \ \i0\ul Args: \i\ulnone \ stream: The NXStream to write the info to;\ */ \pard\tx480\tx960\tx1440\tx1920\tx2400\tx2880\tx3360\tx3840\tx4320\tx4800\b\i0\fc0\cf0 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\fc0\cf0 char *type, *date_string;\ \ date_string = [super fullStringDate];\ date_string += 4; // Skip past day of week\ type = ([self isDirectory] == YES ? "DIR" : "FILE");\ NXPrintf(stream, "%s\\t%s\\t%d\\t%s\\t%s\\n", type, fileMode, fileSize,\ date_string, [self sourceName]);\ \ return self;\ \} \b0\i // End writeInfo: \b\i0 \ \ \b0\i\fs28\fc1\cf1 /*\\ --------------------- ObjectArchival Methods --------------------- \\*/ \b\i0\fs24\fc0\cf0 \ static inline char *ClassName() \{ return "VLINK"; \}\ static inline long ArchiveVersion()\ \{\ long version;\ version = 1000 * VLINK_VERS + 10 * VLINK_SUBVERS + VLINK_TYPE;\ return version;\ \}\ \ - readFromTStream:(NXTypedStream *) stream\ \{\ \pard\tx180\tx360\tx540\tx720\tx900\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\fc0\cf0 /* {{\NeXTHelpMarker3640 \markername readFromTStream:;} ¬}\pard\tx180\tx360\tx540\tx720\tx900\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\ulnone\fs24\fc0\cf0 --- \ul MethodDescription \ulnone \ \i0\ul ReturnValue: \i\ulnone self if successful, nil on failure;\ \i0\ul Description: \i\ulnone This method unarchives a PVlink object description from the\ typed stream that was previously save by the \b writeToTStream: \b0 method.\ The receiving PVlink object must have been allocated and inited using\ \b [ \fc1\cf1 [PVlink a \fc0\cf0 lloc] init] \b0 or \b [ \fc1\cf1 [PVlink a \fc0\cf0 lloc] \fc1\cf1 initFromTStream \fc0\cf0 :] \b0 .\ If the object is sucessfully read from the stream, self is returned.\ If an exception occurs the object is freed and nil is returned.;\ \i0\ul Args: \i\ulnone \ stream: The typed stream from which to read the object;\ */ \f0 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b\i0\fc0\cf0 const char *className;\ BOOL hasListing;\ long version;\ void *data1 = NULL, *data2 = NULL;\ \ NX_DURING\ \f1\b0\fs20 [self debug: SUPER_DEBUG method: _cmd, "class = %s; superclass = %s\\n",\ [[self class] name], [[self superclass] name]];\ [self debug: SUPER_DEBUG method: _cmd, "\\tinstance = %s\\n", ClassName()]; \f0\b\fs24 \ \ \b0\i /* Unarchive our File superclass */ \b\i0 \ [super readFromTStream: stream];\ \ \b0\i /* First read the class name & archive version info */ \b\i0 \ NXReadTypes(stream, "*i", &className, &version);\ if( strcmp(className, ClassName()) != 0 )\ \{\ NXAllocErrorData(strlen(className)+1, &data1);\ NXAllocErrorData(strlen(ClassName())+1, &data2);\ strcpy(data1, className);\ strcpy(data2, ClassName());\ NX_RAISE(eWrongClassName, data1, data2);\ \}\ \ \b0\i /* Unarchive our instance variables */ \b\i0 \ switch( version )\ \{\ case VLINK_VERSION_0:\ case VLINK_VERSION_1:\ NXReadType(stream, "*", &vlinkHostname);\ NXReadType(stream, "*", &vlinkFilename);\ \ if( version < FILE_VERSION_1 )\ \{ \b0\i /* Early versions of PVlink did not store their listing entries in the\ File instance variable. So, the next archive item should be a bool\ flag indicating if we have a listing varible in the archive */ \b\i0 \ NXReadType(stream, "c", &hasListing);\ if( hasListing == YES )\ \{\ List *tmpList;\ File *tmpObj;\ tmpList = [[List alloc] initFromTStream: stream];\ \b0\i /* Create an ObjectList and transfer the elements from the List */ \b\i0 \ listing = [[ObjectList alloc] initCount: 0 sortAlgorithm: eShellSort\ typeID: eStringType keyMethod: @selector(sourceName)];\ while( (tmpO \fc1\cf1 bj = [tmpList removeObjectAt: 0]) != nil )\ [ \fc0\cf0 listing \fc1\cf1 insertObject: tmpObj]; \fc0\cf0 \ [tmpList free];\ \}\ \}\ break;\ \ default:\ NXAllocErrorData(strlen([[self class] name])+1, &data1);\ NXAllocErrorData(sizeof(long), &data2);\ strcpy(data1, [[self class] name]);\ *((long *) data2) = version;\ NX_RAISE(eBadObjVersion, data1, data2);\ break;\ \}\ NX_HANDLER\ NX_RERAISE();\ NX_ENDHANDLER\ \ return self;\ \} \b0\i // End readFromTStream: \b\i0 \ \ - writeToTStream:(NXTypedStream *) stream\ \{\ \pard\tx180\tx360\tx540\tx720\tx900\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\fc0\cf0 /* {{\NeXTHelpMarker6268 \markername writeToTStream:;} ¬}\pard\tx180\tx360\tx540\tx720\tx900\tx3200\tx3720\tx4260\tx4800\tx5320\f1\b0\i\ulnone\fs24\fc0\cf0 --- \ul MethodDescription \ulnone \ \i0\ul ReturnValue: \i\ulnone self if successful, nil on failure;\ \i0\ul Description: \i\ulnone This method archives a PVlink object description to the\ typed stream. If the object is sucessfully written to the stream,\ self is returned. If an exception occurs it is rerasied.;\ \i0\ul Args: \i\ulnone \ stream: The typed stream to write the object to;\ */ \f0 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b\i0\fc0\cf0 const char *className;\ long version;\ \ NX_DURING\ \f1\b0\fs20 [self debug: SUPER_DEBUG method: _cmd, "class = %s; superclass = %s\\n",\ [[self class] name], [[self superclass] name]];\ [self debug: SUPER_DEBUG method: _cmd, "\\tinstance = %s\\n", ClassName()]; \f0\b\fs24 \ \ \b0\i /* Archive our superclass */ \b\i0 \ [super writeToTStream: stream];\ \ \b0\i /* Archive the class name & version */ \b\i0 \ className = ClassName();\ version = ArchiveVersion();\ NXWriteTypes(stream, "*i", &className, &version);\ \ \b0\i\fc1\cf1 /* Archive our instance variables */ \b\i0\fc0\cf0 \ NXWriteType(stream, "*", &vlinkHostname);\ NXWriteType(stream, "*", &vlinkFilename);\ \ NX_HANDLER\ NX_RERAISE();\ NX_ENDHANDLER\ \ return self;\ \} \b0\i // End writeToTStream: \b\i0 \ \ @end\ \b0\i /* RCS Information:\ $Author: me $;\ $Date: 94/01/08 14:41:05 $;\ $Source: /usr1/me/NeXTSrc/Archie/RCS/PVlink.m,v $;\ $Revision: 1.1 $;\ */\ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.