mirror of
https://github.com/danog/Telegram.git
synced 2024-12-04 10:27:46 +01:00
102 lines
3.2 KiB
Objective-C
102 lines
3.2 KiB
Objective-C
#import "TGLocalMessageMetaMediaAttachment.h"
|
|
|
|
#import "TGImageInfo.h"
|
|
|
|
@implementation TGLocalMessageMetaMediaAttachment
|
|
|
|
@synthesize imageInfoList = _imageInfoList;
|
|
@synthesize imageUrlToDataFile = _imageUrlToDataFile;
|
|
@synthesize localMediaId = _localMediaId;
|
|
|
|
- (id)init
|
|
{
|
|
self = [super init];
|
|
if (self != nil)
|
|
{
|
|
self.type = TGLocalMessageMetaMediaAttachmentType;
|
|
|
|
_imageInfoList = [[NSMutableArray alloc] init];
|
|
_imageUrlToDataFile = [[NSMutableDictionary alloc] init];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)serialize:(NSMutableData *)data
|
|
{
|
|
int dataLengthPtr = (int)data.length;
|
|
int zero = 0;
|
|
[data appendBytes:&zero length:4];
|
|
|
|
int count = (int)_imageInfoList.count;
|
|
[data appendBytes:&count length:4];
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
[(TGImageInfo *)[_imageInfoList objectAtIndex:i] serialize:data];
|
|
}
|
|
|
|
count = (int)_imageUrlToDataFile.count;
|
|
[data appendBytes:&count length:4];
|
|
[_imageUrlToDataFile enumerateKeysAndObjectsUsingBlock:^(NSString *imageUrl, NSString *filePath, __unused BOOL *stop)
|
|
{
|
|
NSData *byteData = [imageUrl dataUsingEncoding:NSUTF8StringEncoding];
|
|
int length = (int)byteData.length;
|
|
[data appendBytes:&length length:4];
|
|
[data appendData:byteData];
|
|
|
|
byteData = [filePath dataUsingEncoding:NSUTF8StringEncoding];
|
|
length = (int)byteData.length;
|
|
[data appendBytes:&length length:4];
|
|
[data appendData:byteData];
|
|
}];
|
|
|
|
[data appendBytes:&_localMediaId length:4];
|
|
|
|
int dataLength = (int)(data.length - dataLengthPtr - 4);
|
|
[data replaceBytesInRange:NSMakeRange(dataLengthPtr, 4) withBytes:&dataLength];
|
|
}
|
|
|
|
- (TGMediaAttachment *)parseMediaAttachment:(NSInputStream *)is
|
|
{
|
|
int dataLength = 0;
|
|
[is read:(uint8_t *)&dataLength maxLength:4];
|
|
|
|
TGLocalMessageMetaMediaAttachment *attachment = [[TGLocalMessageMetaMediaAttachment alloc] init];
|
|
|
|
int count = 0;
|
|
[is read:(uint8_t *)&count maxLength:4];
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
TGImageInfo *imageInfo = [TGImageInfo deserialize:is];
|
|
if (imageInfo != nil)
|
|
[attachment.imageInfoList addObject:imageInfo];
|
|
}
|
|
|
|
count = 0;
|
|
[is read:(uint8_t *)&count maxLength:4];
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
int length = 0;
|
|
[is read:(uint8_t *)&length maxLength:4];
|
|
uint8_t *bytes = malloc(length);
|
|
[is read:bytes maxLength:length];
|
|
NSString *imageUrl = [[NSString alloc] initWithBytesNoCopy:bytes length:length encoding:NSUTF8StringEncoding freeWhenDone:true];
|
|
|
|
length = 0;
|
|
[is read:(uint8_t *)&length maxLength:4];
|
|
bytes = malloc(length);
|
|
[is read:bytes maxLength:length];
|
|
NSString *filePath = [[NSString alloc] initWithBytesNoCopy:bytes length:length encoding:NSUTF8StringEncoding freeWhenDone:true];
|
|
|
|
if (imageUrl != nil && filePath != nil)
|
|
[attachment.imageUrlToDataFile setObject:filePath forKey:imageUrl];
|
|
}
|
|
|
|
int mediaId = 0;
|
|
[is read:(uint8_t *)&mediaId maxLength:4];
|
|
attachment.localMediaId = mediaId;
|
|
|
|
return attachment;
|
|
}
|
|
|
|
@end
|