From d3a85be396d550470e89251eec6be7928e3b0e2a Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 16 Jul 2015 23:25:26 +0300 Subject: [PATCH] no message --- Postbox/Postbox.swift | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index 21d5fbb882..91ccd421b5 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -3,25 +3,26 @@ import Foundation import SwiftSignalKit public protocol PostboxState: Coding { + } public class Modifier { - private unowned var postbox: Postbox + private weak var postbox: Postbox? private init(postbox: Postbox) { self.postbox = postbox } public func addMessages(messages: [Message], medias: [Media]) { - self.postbox.addMessages(messages, medias: medias) + self.postbox?.addMessages(messages, medias: medias) } public func deleteMessagesWithIds(ids: [MessageId]) { - self.postbox.deleteMessagesWithIds(ids) + self.postbox?.deleteMessagesWithIds(ids) } public func setState(state: State) { - self.postbox.setState(state) + self.postbox?.setState(state) } } @@ -61,6 +62,9 @@ public final class Postbox { //state self.database.execute("CREATE TABLE state (id INTEGER, data BLOB)") + //keychain + self.database.execute("CREATE TABLE keychain (key BLOB, data BLOB)") + //peer_messages self.database.execute("CREATE TABLE peer_messages (peerId INTEGER, namespace INTEGER, id INTEGER, data BLOB, associatedMediaIds BLOB, timestamp INTEGER, PRIMARY KEY(peerId, namespace, id))") @@ -354,6 +358,32 @@ public final class Postbox { } } + public func keychainEntryForKey(key: String) -> Signal { + return Signal { subscriber in + self.queue.dispatch { + let blob = Blob(data: key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) + var buffer: ReadBuffer? + for row in self.database.prepareCached("SELECT data FROM keychain WHERE key = ?").run(blob) { + let data = (row[0] as! Blob).data + let memory = malloc(data.length) + memcpy(memory, data.bytes, data.length) + buffer = ReadBuffer(memory: UnsafeMutablePointer(memory), length: data.length, freeWhenDone: true) + break + } + subscriber.putNext(buffer) + subscriber.putCompletion() + } + return EmptyDisposable + } + } + + public func setKeychainEntry(key: String, value: NSData) { + self.queue.dispatch { + let keyBlob = Blob(data: key.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!) + self.database.prepareCached("INSERT OR REPLACE INTO keychain (key, data) VALUES (?, ?)").run(keyBlob, Blob(data: value)) + } + } + private func addMessages(messages: [Message], medias: [Media]) { let messageInsertStatement = self.database.prepare("INSERT INTO peer_messages (peerId, namespace, id, data, associatedMediaIds, timestamp) VALUES (?, ?, ?, ?, ?, ?)") let peerMediaInsertStatement = self.database.prepare("INSERT INTO peer_media (peerId, mediaNamespace, messageNamespace, messageId) VALUES (?, ?, ?, ?)")