PNXMPPFramework/Extensions/XEP-0045/MemoryStorage/XMPPRoomOccupantMemoryStorageObject.m
2016-02-24 16:56:39 +01:00

197 lines
4.8 KiB
Objective-C

#import "XMPPRoomOccupantMemoryStorageObject.h"
@implementation XMPPRoomOccupantMemoryStorageObject
{
XMPPPresence *presence;
XMPPJID *jid;
}
- (id)initWithPresence:(XMPPPresence *)inPresence
{
if ((self = [super init]))
{
presence = inPresence;
jid = [inPresence from];
}
return self;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Encoding, Decoding
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#if ! TARGET_OS_IPHONE
- (id)replacementObjectForPortCoder:(NSPortCoder *)encoder
{
if ([encoder isBycopy])
return self;
else
return [super replacementObjectForPortCoder:encoder];
// return [NSDistantObject proxyWithLocal:self connection:[encoder connection]];
}
#endif
- (id)initWithCoder:(NSCoder *)coder
{
if ((self = [super init]))
{
if ([coder allowsKeyedCoding])
{
if([coder respondsToSelector:@selector(requiresSecureCoding)] &&
[coder requiresSecureCoding])
{
presence = [coder decodeObjectOfClass:[XMPPPresence class] forKey:@"presence"];
jid = [coder decodeObjectOfClass:[XMPPJID class] forKey:@"jid"];
}
else
{
presence = [coder decodeObjectForKey:@"presence"];
jid = [coder decodeObjectForKey:@"jid"];
}
}
else
{
presence = [coder decodeObject];
jid = [coder decodeObject];
}
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
if ([coder allowsKeyedCoding])
{
[coder encodeObject:presence forKey:@"presence"];
[coder encodeObject:jid forKey:@"jid"];
}
else
{
[coder encodeObject:presence];
[coder encodeObject:jid];
}
}
+ (BOOL) supportsSecureCoding
{
return YES;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Copying
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (id)copyWithZone:(NSZone *)zone
{
// We use [self class] to support subclassing
XMPPRoomOccupantMemoryStorageObject *deepCopy = (XMPPRoomOccupantMemoryStorageObject *)[[[self class] alloc] init];
deepCopy->presence = [presence copy];
deepCopy->jid = [jid copy];
return deepCopy;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Updates
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)updateWithPresence:(XMPPPresence *)inPresence
{
presence = inPresence;
jid = [inPresence from];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Properties
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (XMPPJID *)roomJID
{
return [jid bareJID];
}
- (XMPPJID *)jid
{
return jid;
}
- (NSString *)nickname
{
return [jid resource];
}
- (NSString *)itemAttributeStringValueForName:(NSString *)attrName
{
NSXMLElement *x = [presence elementForName:@"x" xmlns:@"http://jabber.org/protocol/muc#user"];
NSXMLElement *item = [x elementForName:@"item"];
if (item)
{
NSString *result = [item attributeStringValueForName:attrName];
if (result)
{
return [result lowercaseString];
}
}
return nil;
}
- (NSString *)role
{
return [self itemAttributeStringValueForName:@"role"];
}
- (NSString *)affiliation
{
return [self itemAttributeStringValueForName:@"affiliation"];
}
- (XMPPJID *)realJID
{
NSString *jidStr = [self itemAttributeStringValueForName:@"jid"];
if (jidStr)
return [XMPPJID jidWithString:jidStr];
else
return nil;
}
- (XMPPPresence *)presence
{
return presence;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Comparisons
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (NSComparisonResult)compare:(XMPPRoomOccupantMemoryStorageObject *)another
{
return [self.nickname compare:another.nickname];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark NSObject Methods
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (NSUInteger)hash
{
return [jid hash];
}
- (BOOL)isEqual:(id)anObject
{
if ([anObject isMemberOfClass:[self class]])
{
XMPPRoomOccupantMemoryStorageObject *another = (XMPPRoomOccupantMemoryStorageObject *)anObject;
return [jid isEqualToJID:[another jid]];
}
return NO;
}
@end