|
@@ -25,10 +25,19 @@ class OutgoingThread {
|
|
|
|
|
|
init() {
|
|
|
Database.shared.database?.inTransaction({ (fmdb, rollback) in
|
|
|
- if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select message from OUTGOING") {
|
|
|
+ if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select message, id from OUTGOING") {
|
|
|
while cursor.next() {
|
|
|
if let message = cursor.string(forColumnIndex: 0) {
|
|
|
- addQueue(message: TMessage(data: message))
|
|
|
+ if let cursorMessage = Database.shared.getRecords(fmdb: fmdb, query: "select message_id from MESSAGE where message_id = '\(cursor.string(forColumnIndex: 1)!)'") {
|
|
|
+ if cursorMessage.next() {
|
|
|
+ addQueue(message: TMessage(data: message))
|
|
|
+ } else {
|
|
|
+ delOutgoing(fmdb: fmdb, messageId: cursor.string(forColumnIndex: 1)!)
|
|
|
+ }
|
|
|
+ cursorMessage.close()
|
|
|
+ } else {
|
|
|
+ delOutgoing(fmdb: fmdb, messageId: cursor.string(forColumnIndex: 1)!)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
cursor.close()
|
|
@@ -121,6 +130,9 @@ class OutgoingThread {
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
+ private var maxRetryUpload: [String: Int] = [:]
|
|
|
+ private var maxRetryUploadTime: [String: Int] = [:]
|
|
|
+
|
|
|
private func sendChat(message: TMessage) {
|
|
|
// if media exist upload first
|
|
|
var fileName = message.getBody(key: CoreMessage_TMessageKey.IMAGE_ID, default_value: "")
|
|
@@ -135,6 +147,10 @@ class OutgoingThread {
|
|
|
}
|
|
|
let isMedia = !fileName.isEmpty
|
|
|
if isMedia {
|
|
|
+ if maxRetryUpload[message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)] == nil {
|
|
|
+ maxRetryUpload[message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)] = 0
|
|
|
+ maxRetryUploadTime[message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)] = Date().currentTimeMillis()
|
|
|
+ }
|
|
|
if (!message.getBody(key: CoreMessage_TMessageKey.THUMB_ID).isEmpty) {
|
|
|
Network().uploadHTTP(name: message.getBody(key: CoreMessage_TMessageKey.THUMB_ID)) { (result, progress, response) in
|
|
|
if result, progress == 100 {
|
|
@@ -164,13 +180,15 @@ class OutgoingThread {
|
|
|
self.delOutgoing(fmdb: fmdb, messageId: messageId)
|
|
|
})
|
|
|
} else {
|
|
|
- InquiryThread.default.addQueue(message: message)
|
|
|
+ self.retryUpload(message: message, fileName: fileName)
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- InquiryThread.default.addQueue(message: message)
|
|
|
+ self.retryUpload(message: message, fileName: fileName)
|
|
|
}
|
|
|
}
|
|
|
+ } else {
|
|
|
+ self.retryUpload(message: message, fileName: fileName)
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
@@ -190,11 +208,11 @@ class OutgoingThread {
|
|
|
self.delOutgoing(fmdb: fmdb, messageId: messageId)
|
|
|
})
|
|
|
} else {
|
|
|
- InquiryThread.default.addQueue(message: message)
|
|
|
+ self.retryUpload(message: message, fileName: fileName)
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- InquiryThread.default.addQueue(message: message)
|
|
|
+ self.retryUpload(message: message, fileName: fileName)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -214,6 +232,74 @@ class OutgoingThread {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private func retryUpload(message: TMessage, fileName: String) {
|
|
|
+ //print("masuk Retry")
|
|
|
+ var maxRetry = Utils.getMaxRetryUpload()
|
|
|
+ var maxRetryTime = Utils.getMaxRetryTimeUpload()
|
|
|
+
|
|
|
+ if maxRetry == "0" {
|
|
|
+ maxRetry = "5"
|
|
|
+ }
|
|
|
+ if maxRetryTime == "0" {
|
|
|
+ maxRetryTime = "60000"
|
|
|
+ }
|
|
|
+
|
|
|
+ var countRetry = 0
|
|
|
+ do {
|
|
|
+ countRetry = maxRetryUpload[message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)]!
|
|
|
+ countRetry += 1
|
|
|
+ //print("masuk Retry1 = \(countRetry)")
|
|
|
+ maxRetryUpload.updateValue(countRetry, forKey: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ } catch {}
|
|
|
+ if countRetry >= Int(maxRetry)! {
|
|
|
+ Database.shared.database?.inTransaction({ (fmdb, rollback) in
|
|
|
+ _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
|
|
|
+ "status" : "0"
|
|
|
+ ], _where: "message_id = '\(message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))'")
|
|
|
+ _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE_STATUS", cvalues: [
|
|
|
+ "status" : "0"
|
|
|
+ ], _where: "message_id = '\(message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))'")
|
|
|
+ self.delOutgoing(fmdb: fmdb, messageId: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ })
|
|
|
+ var dataMessage: [AnyHashable : Any] = [:]
|
|
|
+ dataMessage["message_id"] = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
|
|
|
+ dataMessage["status"] = "0"
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(rawValue: Nexilis.failedSendMessage), object: nil, userInfo: dataMessage)
|
|
|
+ maxRetryUpload.removeValue(forKey: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ maxRetryUploadTime.removeValue(forKey: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ if let delegate = Nexilis.shared.messageDelegate {
|
|
|
+ delegate.onUpload(name: fileName, progress: 100)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ let timeRetry = maxRetryUploadTime[message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)]!
|
|
|
+ if timeRetry != 0 {
|
|
|
+ if (timeRetry + Int(maxRetryTime)!) <= Date().currentTimeMillis() {
|
|
|
+ Database.shared.database?.inTransaction({ (fmdb, rollback) in
|
|
|
+ _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
|
|
|
+ "status" : "0"
|
|
|
+ ], _where: "message_id = '\(message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))'")
|
|
|
+ _ = Database.shared.updateRecord(fmdb: fmdb, table: "MESSAGE_STATUS", cvalues: [
|
|
|
+ "status" : "0"
|
|
|
+ ], _where: "message_id = '\(message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))'")
|
|
|
+ self.delOutgoing(fmdb: fmdb, messageId: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ })
|
|
|
+ var dataMessage: [AnyHashable : Any] = [:]
|
|
|
+ dataMessage["message_id"] = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
|
|
|
+ dataMessage["status"] = "0"
|
|
|
+ NotificationCenter.default.post(name: NSNotification.Name(rawValue: Nexilis.failedSendMessage), object: nil, userInfo: dataMessage)
|
|
|
+ maxRetryUpload.removeValue(forKey: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ maxRetryUploadTime.removeValue(forKey: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID))
|
|
|
+ if let delegate = Nexilis.shared.messageDelegate {
|
|
|
+ delegate.onUpload(name: fileName, progress: 100)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //print("retry sukses")
|
|
|
+ sendChat(message: message)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private func deleteMessage(message: TMessage) {
|
|
|
let messageId = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
|
|
|
let type = message.getBody(key: CoreMessage_TMessageKey.DELETE_MESSAGE_FLAG)
|