ably-cocoa/Source/ARTBaseMessage.m

101 lines
3.8 KiB
Objective-C

#import "ARTBaseMessage+Private.h"
#import "ARTLog.h"
#import "ARTStatus.h"
@implementation ARTBaseMessage
- (void)setClientId:(NSString *)clientId {
if(clientId) {
const char* c = [clientId UTF8String];
_clientId = [NSString stringWithUTF8String:c];
}
else {
_clientId = nil;
}
}
- (id)copyWithZone:(NSZone *)zone {
ARTBaseMessage *message = [[self.class allocWithZone:zone] init];
message->_id = self.id;
message->_clientId = self.clientId;
message->_timestamp = self.timestamp;
message->_data = [self.data copy];
message->_connectionId = self.connectionId;
message->_encoding = self.encoding;
return message;
}
- (id)decodeWithEncoder:(ARTDataEncoder*)encoder error:(NSError **)error {
ARTDataEncoderOutput *decoded = [encoder decode:self.data encoding:self.encoding];
if (decoded.errorInfo && error) {
*error = [NSError errorWithDomain:ARTAblyErrorDomain code:decoded.errorInfo.code userInfo:@{NSLocalizedDescriptionKey: @"decoding failed",
NSLocalizedFailureReasonErrorKey: decoded.errorInfo.message}];
}
id ret = [self copy];
((ARTBaseMessage *)ret).data = decoded.data;
((ARTBaseMessage *)ret).encoding = decoded.encoding;
return ret;
}
- (id)encodeWithEncoder:(ARTDataEncoder*)encoder error:(NSError **)error {
ARTDataEncoderOutput *encoded = [encoder encode:self.data];
if (encoded.errorInfo && error) {
*error = [NSError errorWithDomain:ARTAblyErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey: @"encoding failed",
NSLocalizedFailureReasonErrorKey: encoded.errorInfo.message}];
}
id ret = [self copy];
((ARTBaseMessage *)ret).data = encoded.data;
((ARTBaseMessage *)ret).encoding = [NSString artAddEncoding:encoded.encoding toString:self.encoding];
return ret;
}
- (NSString *)description {
NSMutableString *description = [NSMutableString stringWithFormat:@"<%@: %p> {\n", self.class, self];
[description appendFormat:@" id: %@,\n", self.id];
[description appendFormat:@" clientId: %@,\n", self.clientId];
[description appendFormat:@" connectionId: %@,\n", self.connectionId];
[description appendFormat:@" timestamp: %@,\n", self.timestamp];
[description appendFormat:@" encoding: %@,\n", self.encoding];
[description appendFormat:@" data: %@\n", self.data];
[description appendFormat:@"}"];
return description;
}
- (NSInteger)messageSize {
// TO3l8*
NSInteger finalResult = 0;
finalResult += [[self.extras toJSONString] lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
finalResult += [self.clientId lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
if (self.data) {
if ([self.data isKindOfClass:[NSString class]]) {
finalResult += [self.data lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
}
else if ([self.data isKindOfClass:[NSData class]]) {
finalResult += [self.data length];
}
else {
NSError *error = nil;
NSJSONWritingOptions options;
if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) {
options = NSJSONWritingWithoutEscapingSlashes;
}
else {
options = 0; //no specific format
}
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self.data
options:options
error:&error];
if (!error) {
finalResult += [jsonData length];
}
}
}
return finalResult;
}
- (BOOL)isIdEmpty {
return self.id == nil || [self.id isEqualToString:@""];
}
@end