This is Newsgroup.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "Newsgroup.h"
@implementation Newsgroup
+ new
{
self = [super new];
bogus = TRUE;
subscribed = TRUE;
newMessages = 0;
seenStorage = [Storage newCount:0
elementSize:(unsigned)sizeof(seenStruct)
description:"{II}"];
cellStrings[NEWSGROUP_MESSAGES] = newMessagesString;
cellStrings[NEWSGROUP_NAME] = name;
cellStrings[NEWSGROUP_PURPOSE] = NULL;
return self;
}
+ newName:(const char *)newName subscribed:(BOOL)newSubscribed
{
self = [Newsgroup new];
strcpy(name, newName);
subscribed = newSubscribed;
if (!subscribed)
[self setSubscribed:subscribed];
return self;
}
+ newFromNewsrc:(NXStream *)newsrcStream
{
int c;
long first, last;
self = [Newsgroup new];
if (NXScanf(newsrcStream, "%253[^:!]", &name) == 1) {
subscribed = ((c = NXGetc(newsrcStream)) == ':');
if (!subscribed)
[self setSubscribed:subscribed];
while (((c = NXGetc(newsrcStream)) == ' ') || (c == ',')) {
if (NXScanf(newsrcStream, "%ld-%ld", &first, &last) == 2) {
[self addSeenFirst:first last:last];
} else {
[self addSeenFirst:first last:first];
}
}
while (c != '\n')
c = NXGetc(newsrcStream);
} else {
[self free];
self = nil;
}
return self;
}
- writeToNewsrc:(NXStream *)newsrcStream
{
int seenIndex;
seenStruct *seen;
if (!bogus) {
NXPrintf(newsrcStream, "%s%c", name, (subscribed ? ':' : '!'));
for (seenIndex = 0; seenIndex < [seenStorage count]; seenIndex++) {
if (seenIndex == 0)
NXPutc(newsrcStream, ' ');
else
NXPutc(newsrcStream, ',');
seen = [seenStorage elementAt:seenIndex];
if (seen->first == seen->last)
NXPrintf(newsrcStream, "%ld", seen->first);
else
NXPrintf(newsrcStream, "%ld-%ld", seen->first, seen->last);
}
NXPutc(newsrcStream, '\n');
}
return self;
}
- (BOOL)selectOnNNTP:(FILE *)nntpFile
{
int inCode;
char inCodeText[BUFFER_SIZE];
long first, last;
fprintf(nntpFile, "group %s\r\n", name);
fflush(nntpFile);
fseek(nntpFile, (long)0, SEEK_END);
fscanf(nntpFile, "%d ", &inCode);
switch (inCode) {
case OK_GROUP:
fscanf(nntpFile, "%*ld %ld %ld %*[^\r]\r", &first, &last);
[self setAvailableFirst:first last:last];
break;
case ERR_NOGROUP:
bogus = TRUE;
default:
fscanf(nntpFile, "%[^\r]\r", &inCodeText);
break;
}
fgetc(nntpFile);
fseek(nntpFile, (long)0, SEEK_END);
return (inCode == OK_GROUP);
}
- addSeenFirst:(long)first last:(long)last
{
seenStruct seen = {first, last};
int seenIndex = 0;
BOOL doLoop = TRUE;
while (doLoop) {
doLoop = FALSE;
if (seenIndex == [seenStorage count])
[seenStorage addElement:&seen];
else {
if (seen.last+1
< (((seenStruct *)(seenStorage->dataPtr))[seenIndex]).first) {
[seenStorage insert:&seen at:seenIndex];
} else if ((((seenStruct *)(seenStorage->dataPtr))[seenIndex]).last+1
< seen.first) {
seenIndex++;
doLoop = TRUE;
} else {
seen.first = MIN(seen.first,
(((seenStruct *)(seenStorage->dataPtr))[seenIndex]).first);
(((seenStruct *)(seenStorage->dataPtr))[seenIndex]).first = seen.first;
if (seen.last
> (((seenStruct *)(seenStorage->dataPtr))[seenIndex]).last) {
[seenStorage removeAt:seenIndex];
doLoop = TRUE;
}
}
}
}
return [self calcNewMessages];
}
- removeSeenFirst:(long)first last:(long)last
{
return [self calcNewMessages];
}
- setModerated:(BOOL)newModerated
{
moderated = newModerated;
if (moderated)
cellBitmaps[NEWSGROUP_MODERATED] = [Bitmap findBitmapFor:"moderated"];
else
cellBitmaps[NEWSGROUP_MODERATED] = nil;
return self;
}
- (BOOL)moderated
{
return moderated;
}
- setAvailableFirst:(long)newFirst last:(long)newLast
{
available.first = newFirst;
available.last = newLast;
// [self removeSeenFirst:newLast+1 last:MAXLONG];
if (newFirst > 1)
[self addSeenFirst:1 last:newFirst-1];
return [self calcNewMessages];
}
- calcNewMessages
{
int i, numSeenStruct = [seenStorage count];
long first, last;
if (available.last == 0)
newMessages = 0;
else {
newMessages = (available.last - available.first) + 1;
for (i=0; i<numSeenStruct; i++) {
first = (((seenStruct *)(seenStorage->dataPtr))[i]).first;
last = (((seenStruct *)(seenStorage->dataPtr))[i]).last;
if ((first <= available.last) && (last >= available.first))
newMessages -= (MIN(last, available.last)
- MAX(first, available.first)) + 1;
}
}
sprintf(newMessagesString, "%d", newMessages);
if (newMessages)
cellBitmaps[NEWSGROUP_UNSEEN] = [Bitmap findBitmapFor:"unseen"];
else
cellBitmaps[NEWSGROUP_UNSEEN] = nil;
return self;
}
- (long)newMessages
{
return newMessages;
}
- setSubscribed:(BOOL)newSubscribed
{
subscribed = newSubscribed;
if (!subscribed)
cellBitmaps[NEWSGROUP_UNSUBSCRIBED] =
[Bitmap findBitmapFor:"unsubscribed"];
else
cellBitmaps[NEWSGROUP_UNSUBSCRIBED] = nil;
return self;
}
- (BOOL)subscribed
{
return subscribed;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.