176 lines
5.0 KiB
Objective-C
176 lines
5.0 KiB
Objective-C
#import "XMPPRoomMessageMemoryStorageObject.h"
|
|
#import "XMPP.h"
|
|
#import "NSXMLElement+XEP_0203.h"
|
|
|
|
|
|
@implementation XMPPRoomMessageMemoryStorageObject
|
|
{
|
|
XMPPMessage *message;
|
|
XMPPJID *jid;
|
|
NSDate *localTimestamp;
|
|
NSDate *remoteTimestamp;
|
|
BOOL isFromMe;
|
|
}
|
|
|
|
- (id)initWithIncomingMessage:(XMPPMessage *)inMessage
|
|
{
|
|
if ((self = [super init]))
|
|
{
|
|
message = inMessage;
|
|
jid = [inMessage from];
|
|
isFromMe = NO;
|
|
|
|
remoteTimestamp = [inMessage delayedDeliveryDate];
|
|
if (remoteTimestamp)
|
|
localTimestamp = remoteTimestamp;
|
|
else
|
|
localTimestamp = [[NSDate alloc] init];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithOutgoingMessage:(XMPPMessage *)inMessage jid:(XMPPJID *)myRoomJID
|
|
{
|
|
if ((self = [super init]))
|
|
{
|
|
message = inMessage;
|
|
jid = myRoomJID;
|
|
isFromMe = YES;
|
|
|
|
localTimestamp = [[NSDate alloc] init];
|
|
}
|
|
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])
|
|
{
|
|
message = [coder decodeObjectOfClass:[XMPPMessage class] forKey:@"message"];
|
|
jid = [coder decodeObjectOfClass:[XMPPJID class] forKey:@"jid"];
|
|
localTimestamp = [coder decodeObjectOfClass:[NSDate class] forKey:@"localTimestamp"];
|
|
remoteTimestamp = [coder decodeObjectOfClass:[NSDate class] forKey:@"remoteTimestamp"];
|
|
isFromMe = [coder decodeBoolForKey:@"isFromMe"];
|
|
}
|
|
else
|
|
{
|
|
message = [coder decodeObjectForKey:@"message"];
|
|
jid = [coder decodeObjectForKey:@"jid"];
|
|
localTimestamp = [coder decodeObjectForKey:@"localTimestamp"];
|
|
remoteTimestamp = [coder decodeObjectForKey:@"remoteTimestamp"];
|
|
isFromMe = [coder decodeBoolForKey:@"isFromMe"];
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
message = [coder decodeObject];
|
|
jid = [coder decodeObject];
|
|
localTimestamp = [coder decodeObject];
|
|
remoteTimestamp = [coder decodeObject];
|
|
isFromMe = [[coder decodeObject] boolValue];
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)encodeWithCoder:(NSCoder *)coder
|
|
{
|
|
if ([coder allowsKeyedCoding])
|
|
{
|
|
[coder encodeObject:message forKey:@"message"];
|
|
[coder encodeObject:jid forKey:@"jid"];
|
|
[coder encodeObject:localTimestamp forKey:@"timestamp"];
|
|
[coder encodeObject:remoteTimestamp forKey:@"remoteTimestamp"];
|
|
[coder encodeBool:isFromMe forKey:@"isFromMe"];
|
|
}
|
|
else
|
|
{
|
|
[coder encodeObject:message];
|
|
[coder encodeObject:jid];
|
|
[coder encodeObject:localTimestamp];
|
|
[coder encodeObject:remoteTimestamp];
|
|
[coder encodeObject:@(isFromMe)];
|
|
}
|
|
}
|
|
|
|
+ (BOOL) supportsSecureCoding
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#pragma mark Copying
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
- (id)copyWithZone:(NSZone *)zone
|
|
{
|
|
// We use [self class] to support subclassing
|
|
|
|
XMPPRoomMessageMemoryStorageObject *deepCopy = (XMPPRoomMessageMemoryStorageObject *)[[[self class] alloc] init];
|
|
|
|
deepCopy->message = [message copy];
|
|
deepCopy->jid = [jid copy];
|
|
deepCopy->localTimestamp = [localTimestamp copy];
|
|
deepCopy->remoteTimestamp = [remoteTimestamp copy];
|
|
deepCopy->isFromMe = isFromMe;
|
|
|
|
return deepCopy;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#pragma mark Properties
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
@synthesize message;
|
|
@synthesize jid;
|
|
@synthesize localTimestamp;
|
|
@synthesize remoteTimestamp;
|
|
@synthesize isFromMe;
|
|
|
|
- (XMPPJID *)roomJID
|
|
{
|
|
return [jid bareJID];
|
|
}
|
|
|
|
- (NSString *)nickname
|
|
{
|
|
return [jid resource];
|
|
}
|
|
|
|
- (NSString *)body
|
|
{
|
|
return [[message elementForName:@"body"] stringValue];
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#pragma mark Comparisons
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
- (NSComparisonResult)compare:(XMPPRoomMessageMemoryStorageObject *)another
|
|
{
|
|
return [localTimestamp compare:[another localTimestamp]];
|
|
}
|
|
|
|
@end
|