This is ToDoItemPublic.m in view mode; [Download] [Up]
/*
* ToDoItemPublic - public implementation of ToDoItem, does not contain
* priority calculation code
*
* You may freely copy, distribute and reuse the code in this example.
* This code is provided AS IS without warranty of any kind, expressed
* or implied, as to its fitness for any particular use.
*
* Copyright 1995 Ralph Zazula (rzazula@next.com). All Rights Reserved.
*
*/
#import "ToDoItemPublic.h"
#import <appkit/appkit.h>
@implementation ToDoItemPublic
static char *RZCopyStringBuffer(const char *s)
{
return s ? NXCopyStringBuffer(s) : NULL;
}
static char *RZReplaceStringBuffer(char **s, const char *new)
{
if(s && *s) {
NX_FREE(*s);
*s = NULL;
}
*s = RZCopyStringBuffer(new);
return *s;
}
+ initialize
{
if([self class] == [ToDoItemPublic class]) {
[self setVersion:1];
}
return self;
}
- initSubject:(char *)subj startDate:(long)start dueDate:(long)due
completeDate:(long)completed type:(char)type isPrivate:(BOOL)privateFlag
isCompleted:(BOOL)completeFlag data:(char *)buf dataLen:(int)len
{
if(self = [super init]) {
RZReplaceStringBuffer(&subject, subj);
startDate = start ? start : time(NULL);
dueDate = due ? due : time(NULL)+60;
dateCompleted = completed;
_flags.type = type;
_flags.private = privateFlag;
_flags.completed = completeFlag;
RZReplaceStringBuffer(&data, buf);
dataLen = len;
}
return self;
}
- initFromItem:(id <ToDoItems>)anItem
{
char *buf;
int len;
[anItem getData:&buf length:&len];
return [self initSubject:[anItem subject] startDate:[anItem startDate]
dueDate:[anItem dueDate] completeDate:[anItem dateCompleted]
type:[anItem type] isPrivate:[anItem isPrivate]
isCompleted:[anItem isCompleted] data:buf dataLen:len];
}
- init
{
return [self notImplemented:_cmd];
}
- free
{
if(subject) {
NX_FREE(subject);
subject = NULL;
}
if(data) {
NX_FREE(data);
data = NULL;
dataLen = 0;
}
return [super free];
}
- (char *)subject { return subject; }
- (long)startDate { return startDate; }
- (long)dueDate { return dueDate; }
- (long)dateCompleted { return dateCompleted; }
- (char)type { return _flags.type; }
- (BOOL)isPrivate { return _flags.private; }
- (BOOL)isCompleted { return _flags.completed; }
- (const char *)asciiStartDate
{
static char buf[40];
if(!startDate) {
return NULL;
}
strftime(buf, 40, "%m/%d/%y", localtime(&startDate));
return buf;
}
- (const char *)asciiCompletedDate
{
static char buf[40];
if(!dateCompleted) {
return NULL;
}
strftime(buf, 40, "%m/%d/%y", localtime(&dateCompleted));
return buf;
}
- (const char *)asciiDueDate
{
static char buf[40];
switch(_flags.type) {
case TODO_TYPE_NORMAL :
case TODO_TYPE_APPOINTMENT :
strftime(buf, 40, "%m/%d/%y", localtime(&dueDate));
break;
case TODO_TYPE_HIGHPRIORITY :
sprintf(buf, "ASAP!");
break;
case TODO_TYPE_LOWPRIORITY :
sprintf(buf, "LATER");
break;
}
return buf;
}
- getData:(char **)d length:(int *)len
{
*d = data;
*len = dataLen;
return self;
}
/*** archival methods ***/
- read:(NXTypedStream *)ts
{
[super read:ts];
switch(NXTypedStreamClassVersion(ts, [[self class] name])) {
case 1 :
NXReadTypes(ts, "*lll*iI",
&subject, &startDate, &dueDate, &dateCompleted,
&data, &dataLen, _flags);
break;
}
return self;
}
- write:(NXTypedStream *)ts
{
[super write:ts];
NXWriteTypes(ts, "*lll*iI",
&subject, &startDate, &dueDate, &dateCompleted,
&data, &dataLen, _flags);
return self;
}
@end
@implementation ToDoItemPublic(Transport)
- encodeUsing:(id <NXEncoding>)stream
{
[stream encodeData:&subject ofType:"*"];
[stream encodeData:&startDate ofType:"l"];
[stream encodeData:&dueDate ofType:"l"];
[stream encodeData:&dateCompleted ofType:"l"];
[stream encodeData:&data ofType:"*"];
[stream encodeData:&dataLen ofType:"i"];
[stream encodeData:&_flags ofType:"I"];
return self;
}
- decodeUsing:(id <NXDecoding>)stream
{
[stream decodeData:&subject ofType:"*"];
[stream decodeData:&startDate ofType:"l"];
[stream decodeData:&dueDate ofType:"l"];
[stream decodeData:&dateCompleted ofType:"l"];
[stream decodeData:&data ofType:"*"];
[stream decodeData:&dataLen ofType:"i"];
[stream decodeData:&_flags ofType:"I"];
return self;
}
- encodeRemotelyFor:(NXConnection *)connection
freeAfterEncoding:(BOOL *)flagp
isBycopy:(BOOL)isBycopy
{
if (isBycopy) {
*flagp = YES; // if bycopy, free the local instance
return self;
}
// otherwise, super's behavior is to encode a proxy
return [super encodeRemotelyFor:connection
freeAfterEncoding:flagp
isBycopy:isBycopy];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.