This is IKAnnouncer.m in view mode; [Download] [Up]
#pragma .h #import <Foundation/NSObject.h>
#pragma .h #import <Foundation/NSArray.h>
#pragma .h #import "IKDependency.h"
#pragma .h @class IKFolder;
#import <Foundation/NSUtilities.h>
#import "IKFolder.h"
#import "IKAnnouncer.h"
@implementation IKAnnouncer:NSObject
#pragma .h <IKDependency>
#pragma .h {
#pragma .h IKFolder *owner;
#pragma .h NSMutableArray *usersAndListeners;
#pragma .h int numUsers;
#pragma .h BOOL sendAnnouncements;
#pragma .h }
- (IKAnnouncer *)initOwner: theOwner
{
if ((self = [super init]) != nil) {
// We will not retain our owner since that would introduce a reference cylce and the relation
// is quite clear since we will never exist without our owner.
owner = theOwner;
usersAndListeners = [[NSMutableArray alloc] init];
numUsers = 0;
sendAnnouncements = YES;
}
return self;
}
- (void)dealloc
{
[usersAndListeners release];
[super dealloc];
}
- (NSMutableArray *)usersAndListeners
{
return usersAndListeners;
}
- (int) numUsers
{
return numUsers;
}
- (BOOL) sendAnnouncements
{
return sendAnnouncements;
}
- (void)setSendAnnouncements: (BOOL) flag
{
sendAnnouncements = flag;
}
- (BOOL)isUser:who
{
return [usersAndListeners containsObject:who];
}
- (void)addUser: who
{
if(![self isUser:who]) {
#if DEBUG
NSLog (@"adding user: %-17@ for: %@\n", who, owner);
#endif
[usersAndListeners addObject:who];
numUsers++;
}
}
- (void)addListener: who
{
if(![self isUser:who]) {
#if DEBUG
NSLog (@"adding listener: %-17@ for: %@\n", who, owner);
#endif
[usersAndListeners addObject: who];
}
}
- (void)removeUser: who
{
if([self isUser:who]) {
#if DEBUG
NSLog (@"removeing user: %-17@ for: %@\n", who, owner);
#endif
[usersAndListeners removeObject: who];
numUsers--;
}
}
- (void)removeListener: who
{
if([self isUser:who]) {
#if DEBUG
NSString *w = [who description], *o = [owner description];
NSLog (@"removeing listener: %-17@ for: %@\n", w, o);
#endif
[usersAndListeners removeObject: who];
}
}
- (void)announce: (SEL) message
{
int i = [usersAndListeners count];
if (i > 0 && sendAnnouncements) {
while (--i >= 0) {
id who = [usersAndListeners objectAtIndex:i];
if ([who respondsToSelector:message])
[who performSelector:message withObject:owner];
}
}
}
- (void)announce:(SEL)message with: arg
{
int i = [usersAndListeners count];
if (i > 0 && sendAnnouncements) {
while (--i >= 0) {
id who = [usersAndListeners objectAtIndex:i];
if ([who respondsToSelector:message])
[who performSelector:message withObject:owner withObject: arg];
}
}
}
- (BOOL)poll:(SEL)message
{
int i = [usersAndListeners count];
BOOL rc = YES;
if (i > 0) {
while (--i >= 0) {
id who = [usersAndListeners objectAtIndex:i];
if ( [who respondsToSelector: message]
&& [who performSelector:message withObject:owner] == NO) {
rc = NO;
break;
}
}
}
return rc;
}
- (BOOL) poll: (SEL) message with: arg
{
int i = [usersAndListeners count];
BOOL rc = YES;
if (i > 0) {
while (--i >= 0) {
id who = [usersAndListeners objectAtIndex:i];
if ( [who respondsToSelector: message]
&& [who performSelector:message withObject:owner withObject:arg] == NO) {
rc = NO;
break;
}
}
}
return rc;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.