/
QMChatAttachmentService.m
142 lines (88 loc) · 5.1 KB
/
QMChatAttachmentService.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//
// QMChatAttachmentService.m
// QMServices
//
// Created by Injoit on 7/1/15.
// Copyright (c) 2015 Quickblox Team. All rights reserved.
//
#import "QMChatAttachmentService.h"
#import "QMChatService.h"
#import "QBChatMessage+QMCustomParameters.h"
#import "QMChatService+AttachmentService.h"
static NSString* attachmentCacheDir() {
static NSString *attachmentCacheDirString;
if (!attachmentCacheDirString) {
NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
attachmentCacheDirString = [cacheDir stringByAppendingPathComponent:@"Attachment"];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (![[NSFileManager defaultManager] fileExistsAtPath:attachmentCacheDirString]) {
[[NSFileManager defaultManager] createDirectoryAtPath:attachmentCacheDirString withIntermediateDirectories:NO attributes:nil error:nil];
}
});
}
return attachmentCacheDirString;
}
static NSString* attachmentPath(QBChatAttachment *attachment) {
return [attachmentCacheDir() stringByAppendingPathComponent:[NSString stringWithFormat:@"attachment-%@", attachment.ID]];
}
@implementation QMChatAttachmentService
- (void)sendMessage:(QBChatMessage *)message toDialog:(QBChatDialog *)dialog withChatService:(QMChatService *)chatService withAttachedImage:(UIImage *)image completion:(void (^)(NSError *))completion {
[chatService.messagesMemoryStorage addMessage:message forDialogID:dialog.ID];
[self changeMessageAttachmentStatus:QMMessageAttachmentStatusLoading forMessage:message];
NSData *imageData = UIImagePNGRepresentation(image);
[QBRequest TUploadFile:imageData fileName:@"attachment" contentType:@"image/png" isPublic:YES successBlock:^(QBResponse *response, QBCBlob *blob) {
QBChatAttachment *attachment = [QBChatAttachment new];
attachment.type = @"image";
attachment.ID = [@(blob.ID) stringValue];
attachment.url = [blob publicUrl];
message.attachments = @[attachment];
message.text = @"Attachment image";
[self saveImageData:imageData chatAttachment:attachment error:nil];
[self changeMessageAttachmentStatus:QMMessageAttachmentStatusLoaded forMessage:message];
[chatService sendMessage:message type:QMMessageTypeText toDialog:dialog save:YES saveToStorage:NO completion:completion];
} statusBlock:^(QBRequest *request, QBRequestStatus *status) {
} errorBlock:^(QBResponse *response) {
[self changeMessageAttachmentStatus:QMMessageAttachmentStatusNotLoaded forMessage:message];
if (completion) completion(response.error.error);
}];
}
- (void)getImageForChatAttachment:(QBChatAttachment *)attachment completion:(void (^)(NSError *error, UIImage *image))completion {
NSString *path = attachmentPath(attachment);
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSError *error;
NSData *data = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedIfSafe error:&error];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) completion(error, image);
});
});
return;
}
[QBRequest downloadFileWithID:attachment.ID.integerValue successBlock:^(QBResponse *response, NSData *fileData) {
UIImage *image = [UIImage imageWithData:fileData];
NSError *error;
[self saveImageData:fileData chatAttachment:attachment error:&error];
if (completion) completion(error, image);
} statusBlock:^(QBRequest *request, QBRequestStatus *status) {
if ([self.delegate respondsToSelector:@selector(chatAttachmentService:didChangeLoadingProgress:forChatAttachment:)]) {
[self.delegate chatAttachmentService:self didChangeLoadingProgress:status.percentOfCompletion forChatAttachment:attachment];
}
} errorBlock:^(QBResponse *response) {
if (completion) completion(response.error.error, nil);
}];
}
- (void)saveImageData:(NSData *)imageData chatAttachment:(QBChatAttachment *)attachment error:(NSError **)errorPtr {
NSString *path = attachmentPath(attachment);
[imageData writeToFile:path options:NSDataWritingAtomic error:errorPtr];
}
- (void)changeMessageAttachmentStatus:(QMMessageAttachmentStatus)status forMessage:(QBChatMessage *)message {
message.attachmentStatus = status;
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.delegate respondsToSelector:@selector(chatAttachmentService:didChangeAttachmentStatus:forMessage:)]) {
[self.delegate chatAttachmentService:self didChangeAttachmentStatus:status forMessage:message];
}
});
}
@end