You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pEpObjCAdapter/pEpObjCAdapter/PEPMessage.m

374 lines
8.1 KiB
Matlab

//
// PEPMessage.m
// pEpObjCAdapter
//
// Created by Dirk Zimmermann on 10.11.17.
// Copyright © 2017 pp. All rights reserved.
//
#import "PEPMessage.h"
#import "PEPIdentity.h"
#import "PEPConstants.h"
#import "NSObject+Extension.h"
#import "NSMutableDictionary+PEP.h"
#import "PEPMessageUtil.h"
@implementation PEPMessage
- (instancetype _Nonnull)initWithDictionary:(PEPDict *)dict
{
self = [super init];
if (self) {
self.messageID = [dict objectForKey:kPepID];
self.from = [dict objectForKey:kPepFrom];
self.to = [dict objectForKey:kPepTo];
self.cc = [dict objectForKey:kPepCC];
self.bcc = [dict objectForKey:kPepBCC];
self.shortMessage = [dict objectForKey:kPepShortMessage];
self.longMessage = [dict objectForKey:kPepLongMessage];
self.longMessageFormatted = [dict objectForKey:kPepLongMessageFormatted];
self.replyTo = [dict objectForKey:kPepReplyTo];
self.inReplyTo = [dict objectForKey:kPepInReplyTo];
self.references = [dict objectForKey:kPepReferences];
self.sentDate = [dict objectForKey:kPepSent];
self.receivedDate = [dict objectForKey:kPepReceived];
self.attachments = [dict objectForKey:kPepAttachments];
self.optionalFields = [dict objectForKey:kPepOptFields];
self.keywords = [dict objectForKey:kPepKeywords];
self.receivedBy = [dict objectForKey:kPepReceivedBy];
NSNumber *boolNum = [dict objectForKey:kPepOutgoing];
if (boolNum.boolValue) {
self.direction = PEP_dir_outgoing;
} else {
self.direction = PEP_dir_incoming;
}
}
return self;
}
// MARK: - NSKeyValueCoding
- (BOOL)outgoing
{
return self.direction == PEP_dir_outgoing;
}
- (void)setOutgoing:(BOOL)outgoing
{
self.direction = outgoing ? PEP_dir_outgoing:PEP_dir_incoming;
}
- (NSString *)id
{
return self.messageID;
}
- (void)setId:(NSString *)theID
{
self.messageID = theID;
}
- (NSString *)shortmsg
{
return self.shortMessage;
}
- (void)setShortmsg:(NSString *)shortMsg
{
self.shortMessage = shortMsg;
}
- (NSDate *)sent
{
return self.sentDate;
}
- (void)setSent:(NSDate *)sentDate
{
self.sentDate = sentDate;
}
- (NSDate *)recv
{
return self.receivedDate;
}
- (void)setRecv:(NSDate *)receivedDate
{
self.receivedDate = receivedDate;
}
- (PEPIdentity *)recv_by
{
return self.receivedBy;
}
- (void)setRecv_by:(PEPIdentity *)receivedBy
{
self.receivedBy = receivedBy;
}
- (NSArray *)reply_to
{
return self.replyTo;
}
- (void)setReply_to:(NSArray *)replyTo
{
self.replyTo = replyTo;
}
- (NSArray *)in_reply_to
{
return self.inReplyTo;
}
- (void)setIn_reply_to:(NSArray *)inReplyTo
{
self.inReplyTo = inReplyTo;
}
- (NSArray *)opt_fields
{
return self.optionalFields;
}
- (void)setOpt_fields:(NSArray *)optFields
{
self.optionalFields = optFields;
}
- (NSString *)longmsg
{
return self.longMessage;
}
- (void)setLongmsg:(NSString *)longMsg
{
self.longMessage = longMsg;
}
- (NSString *)longmsg_formatted
{
return self.longMessageFormatted;
}
- (void)setLongmsg_formatted:(NSString *)longMsgFormatted
{
self.longMessageFormatted = longMsgFormatted;
}
// MARK: - Faking directory
- (PEPDict * _Nonnull)dictionary
{
// most adapter use should be ok.
return (PEPDict *) self;
}
- (PEPMutableDict * _Nonnull)mutableDictionary
{
// most adapter use should be ok.
return (PEPMutableDict *) self;
}
- (void)removeAllObjects
{
self.messageID = nil;
self.from = nil;
self.to = nil;
self.cc = nil;
self.bcc = nil;
self.shortMessage = nil;
self.longMessage = nil;
self.longMessageFormatted = nil;
self.replyTo = nil;
self.inReplyTo = nil;
self.references = nil;
self.sentDate = nil;
self.receivedDate = nil;
self.attachments = nil;
self.optionalFields = nil;
self.keywords = nil;
self.receivedBy = nil;
self.direction = PEP_dir_incoming; // basically, 0
}
// MARK: - Faking the pEp directory extension
5 years ago
- (void)replaceWithMessage:(message *)message
{
replaceDictionaryContentsWithMessage(self.mutableDictionary, message);
}
// MARK: - NSDictionary - Helpers
- (NSArray<NSArray<NSString *> *> *)keyValuePairs
{
NSMutableArray *result = [NSMutableArray new];
if (self.from) {
[result addObject:@[kPepFrom, self.from]];
}
if (self.to) {
[result addObject:@[kPepTo, self.to]];
}
if (self.cc) {
[result addObject:@[kPepCC, self.cc]];
}
if (self.shortMessage) {
[result addObject:@[kPepShortMessage, self.shortMessage]];
}
if (self.longMessage) {
[result addObject:@[kPepLongMessage, self.longMessage]];
}
if (self.longMessageFormatted) {
[result addObject:@[kPepLongMessageFormatted, self.longMessageFormatted]];
}
if (self.attachments) {
[result addObject:@[kPepAttachments, self.attachments]];
}
if (self.references) {
[result addObject:@[kPepReferences, self.references]];
}
if (self.inReplyTo) {
[result addObject:@[kPepInReplyTo, self.inReplyTo]];
}
BOOL outgoing = self.direction == PEP_dir_outgoing ? YES:NO;
[result addObject:@[kPepOutgoing, [NSNumber numberWithBool:outgoing]]];
return result;
}
// MARK: - NSDictionary
- (nullable id)objectForKey:(NSString *)key
{
return [self valueForKey:key];
}
- (void)removeObjectForKey:(NSString *)key
{
if ([@"bcc" isEqualToString:key]) {
self.bcc = nil;
} else if ([@"cc" isEqualToString:key]) {
self.cc = nil;
} else if ([@"to" isEqualToString:key]) {
self.to = nil;
} else {
NSAssert1(false, @"Unsupported key for removeObjectForKey: |%@|", key);
}
}
- (NSInteger)count
{
return [[self keyValuePairs] count];
}
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block
{
BOOL stop = NO;
NSArray *pairs = [self keyValuePairs];
for (NSArray *pair in pairs) {
block(pair[0], pair[1], &stop);
if (stop) {
break;
}
}
}
// MARK: - NSMutableCopying
- (id)mutableCopyWithZone:(nullable NSZone *)zone
{
PEPMessage *newMessage = [PEPMessage new];
newMessage.messageID = self.messageID;
newMessage.from = self.from;
newMessage.to = self.to;
newMessage.cc = self.cc;
newMessage.bcc = self.bcc;
newMessage.shortMessage = self.shortMessage;
newMessage.longMessage = self.longMessage;
newMessage.longMessageFormatted = self.longMessageFormatted;
newMessage.replyTo = self.replyTo;
newMessage.inReplyTo = self.inReplyTo;
newMessage.references = self.references;
newMessage.sentDate = self.sentDate;
newMessage.receivedDate = self.receivedDate;
newMessage.attachments = self.attachments;
newMessage.optionalFields = self.optionalFields;
newMessage.keywords = self.keywords;
newMessage.receivedBy = self.receivedBy;
newMessage.direction = self.direction;
return newMessage;
}
// MARK: - Equality
/**
The keys that should be used to decide `isEqual` and compute the `hash`.
*/
static NSArray *s_keys;
- (BOOL)isEqualToPEPMessage:(PEPMessage * _Nonnull)message
{
return [self isEqualToObject:message basedOnKeys:s_keys];
}
- (NSUInteger)hash
{
return [self hashBasedOnKeys:s_keys];
}
- (BOOL)isEqual:(id)object
{
if (object == self) {
return YES;
}
if (!object || ![object isKindOfClass:[self class]]) {
return NO;
}
return [self isEqualToPEPMessage:object];
}
// MARK: - Static Initialization
+ (void)initialize
{
s_keys = @[
@"attachments",
@"bcc",
@"cc",
@"direction",
@"from",
@"inReplyTo",
@"keywords",
@"longMessage",
@"longMessageFormatted",
@"messageID",
@"optionalFields",
@"receivedBy",
@"receivedDate",
@"references",
@"replyTo",
@"sentDate",
@"shortMessage",
@"to",
];
}
@end