Swiftgram/submodules/LegacyComponents/Sources/TGForwardedMessageMediaAttachment.m
2020-02-22 15:38:54 +04:00

134 lines
4.2 KiB
Objective-C

#import "TGForwardedMessageMediaAttachment.h"
@implementation TGForwardedMessageMediaAttachment
- (id)init
{
self = [super init];
if (self != nil)
{
self.type = TGForwardedMessageMediaAttachmentType;
}
return self;
}
- (id)copyWithZone:(NSZone *)__unused zone
{
TGForwardedMessageMediaAttachment *attachment = [[TGForwardedMessageMediaAttachment alloc] init];
attachment.forwardSourcePeerId = _forwardSourcePeerId;
attachment.forwardPeerId = _forwardPeerId;
attachment.forwardDate = _forwardDate;
attachment.forwardAuthorUserId = _forwardAuthorUserId;
attachment.forwardPostId = _forwardPostId;
attachment.forwardMid = _forwardMid;
return attachment;
}
- (void)serialize:(NSMutableData *)data
{
int32_t magic = 0x72413fad;
[data appendBytes:&magic length:4];
int dataLengthPtr = (int)data.length;
int zero = 0;
[data appendBytes:&zero length:4];
[data appendBytes:&_forwardPeerId length:8];
[data appendBytes:&_forwardDate length:4];
[data appendBytes:&_forwardMid length:4];
[data appendBytes:&_forwardAuthorUserId length:4];
[data appendBytes:&_forwardPostId length:4];
[data appendBytes:&_forwardSourcePeerId length:8];
NSData *signatureData = [_forwardAuthorSignature dataUsingEncoding:NSUTF8StringEncoding];
int32_t signatureLength = (int32_t)signatureData.length;
[data appendBytes:&signatureLength length:4];
[data appendData:signatureData];
int dataLength = (int)(data.length - dataLengthPtr - 4);
[data replaceBytesInRange:NSMakeRange(dataLengthPtr, 4) withBytes:&dataLength];
}
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
{
int32_t magic = 0;
[is read:(uint8_t *)&magic maxLength:4];
int32_t dataLength = 0;
int32_t version = 0;
if (magic == 0x72413faa) {
version = 2;
[is read:(uint8_t *)&dataLength maxLength:4];
} else if (magic == 0x72413fab) {
version = 3;
[is read:(uint8_t *)&dataLength maxLength:4];
} else if (magic == 0x72413fac) {
version = 4;
[is read:(uint8_t *)&dataLength maxLength:4];
} else if (magic == 0x72413fad) {
version = 5;
[is read:(uint8_t *)&dataLength maxLength:4];
} else {
dataLength = magic;
}
TGForwardedMessageMediaAttachment *messageAttachment = [[TGForwardedMessageMediaAttachment alloc] init];
if (version >= 2) {
int64_t forwardPeerId = 0;
[is read:(uint8_t *)&forwardPeerId maxLength:8];
messageAttachment.forwardPeerId = forwardPeerId;
} else {
int32_t forwardUid = 0;
[is read:(uint8_t *)&forwardUid maxLength:4];
messageAttachment.forwardPeerId = forwardUid;
}
int forwardDate = 0;
[is read:(uint8_t *)&forwardDate maxLength:4];
messageAttachment.forwardDate = forwardDate;
int forwardMid = 0;
[is read:(uint8_t *)&forwardMid maxLength:4];
messageAttachment.forwardMid = forwardMid;
if (version >= 3) {
int32_t forwardAuthorUserId = 0;
[is read:(uint8_t *)&forwardAuthorUserId maxLength:4];
messageAttachment.forwardAuthorUserId = forwardAuthorUserId;
int32_t forwardPostId = 0;
[is read:(uint8_t *)&forwardPostId maxLength:4];
messageAttachment.forwardPostId = forwardPostId;
}
if (version >= 4) {
int64_t forwardSourcePeerId = 0;
[is read:(uint8_t *)&forwardSourcePeerId maxLength:8];
messageAttachment.forwardSourcePeerId = forwardSourcePeerId;
}
if (version >= 5) {
int32_t signatureLength = 0;
[is read:(uint8_t *)&signatureLength maxLength:4];
uint8_t *signatureBytes = malloc(signatureLength);
[is read:signatureBytes maxLength:signatureLength];
NSString *signature = [[NSString alloc] initWithBytesNoCopy:signatureBytes length:signatureLength encoding:NSUTF8StringEncoding freeWhenDone:true];
if (signatureLength != 0) {
messageAttachment.forwardAuthorSignature = signature;
} else {
messageAttachment.forwardAuthorSignature = nil;
}
}
return messageAttachment;
}
@end