diff --git a/Postbox.xcodeproj/project.pbxproj b/Postbox.xcodeproj/project.pbxproj index f97d7f3d67..e61a4f7be5 100644 --- a/Postbox.xcodeproj/project.pbxproj +++ b/Postbox.xcodeproj/project.pbxproj @@ -231,8 +231,6 @@ D0B4185A1D7DFE29004562A4 /* ViewTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E1DE141C5E1C6900C7826E /* ViewTracker.swift */; }; D0B4185B1D7DFE2C004562A4 /* MurMurHash32.h in Headers */ = {isa = PBXBuildFile; fileRef = D044E1611B2AD667001EE087 /* MurMurHash32.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0B4185C1D7DFE2F004562A4 /* MurMurHash32.m in Sources */ = {isa = PBXBuildFile; fileRef = D044E1621B2AD677001EE087 /* MurMurHash32.m */; }; - D0B4185D1D7DFE35004562A4 /* IpcNotifier.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D511031D64D75200A97B8A /* IpcNotifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D0B4185E1D7DFE54004562A4 /* IpcNotifier.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0D511011D64D73D00A97B8A /* IpcNotifier.mm */; }; D0B418611D7DFE95004562A4 /* SwiftSignalKitMac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B418601D7DFE95004562A4 /* SwiftSignalKitMac.framework */; }; D0B844031DAB91A7005F29E1 /* PeerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DF0C8E1D81A350008AEB01 /* PeerView.swift */; }; D0B844051DAB91B5005F29E1 /* MediaBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = D055BD321B7D3D2D00F06C0A /* MediaBox.swift */; }; @@ -286,8 +284,6 @@ D0D510F61D63BBE100A97B8A /* MessageHistoryOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D510F51D63BBE100A97B8A /* MessageHistoryOperation.swift */; }; D0D510F91D63BCC200A97B8A /* IntermediateMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D510F81D63BCC200A97B8A /* IntermediateMessage.swift */; }; D0D511001D64A58900A97B8A /* IpcPipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D510FF1D64A58900A97B8A /* IpcPipe.swift */; }; - D0D511021D64D73D00A97B8A /* IpcNotifier.mm in Sources */ = {isa = PBXBuildFile; fileRef = D0D511011D64D73D00A97B8A /* IpcNotifier.mm */; }; - D0D511041D64D91C00A97B8A /* IpcNotifier.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D511031D64D75200A97B8A /* IpcNotifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0D949F51D35353900740E02 /* MappedFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0D949F41D35353900740E02 /* MappedFile.swift */; }; D0DA1D2F1F70419D0034E892 /* PendingPeerNotificationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DA1D2E1F70419D0034E892 /* PendingPeerNotificationSettingsView.swift */; }; D0DA1D301F70419D0034E892 /* PendingPeerNotificationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0DA1D2E1F70419D0034E892 /* PendingPeerNotificationSettingsView.swift */; }; @@ -1001,7 +997,6 @@ buildActionMask = 2147483647; files = ( D0B418201D7DFDFD004562A4 /* sqlite3ext.h in Headers */, - D0B4185D1D7DFE35004562A4 /* IpcNotifier.h in Headers */, D0FC195120208E8800FEDBB2 /* Crc32.h in Headers */, D050F2651E4A5B4800988324 /* fts3_tokenizer.h in Headers */, D0B4185B1D7DFE2C004562A4 /* MurMurHash32.h in Headers */, @@ -1018,7 +1013,6 @@ D07516771B2EC90400AE42E0 /* fts3_tokenizer.h in Headers */, D07516451B2D9CEF00AE42E0 /* sqlite3.h in Headers */, D0FC195020208E8800FEDBB2 /* Crc32.h in Headers */, - D0D511041D64D91C00A97B8A /* IpcNotifier.h in Headers */, D07516781B2EC90400AE42E0 /* SQLite-Bridging.h in Headers */, D0E3A7501B28A7E300A402D9 /* Postbox.h in Headers */, D07516461B2D9CEF00AE42E0 /* sqlite3ext.h in Headers */, @@ -1113,6 +1107,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = D0E3A7401B28A7E300A402D9; @@ -1227,7 +1222,6 @@ D08775011E3E3D9F00A97350 /* PreferencesTable.swift in Sources */, D0F7B1CC1E045C6A007EB8A5 /* ChatListIndexTable.swift in Sources */, D07047A61F3CF63800F6A8D4 /* MessageHistoryTagSummaryView.swift in Sources */, - D0B4185E1D7DFE54004562A4 /* IpcNotifier.mm in Sources */, D0F7B1D31E045C6A007EB8A5 /* CachedPeerDataTable.swift in Sources */, D079FCE71F06A31C0038FADE /* NoticeTable.swift in Sources */, D0F7B1D51E045C6A007EB8A5 /* PeerChatStateTable.swift in Sources */, @@ -1459,7 +1453,6 @@ D033A6F71C73D512006A2EAB /* MessageHistoryUnsentTable.swift in Sources */, D00C7CD41E365C4E0080C3D5 /* PeerChatListInclusion.swift in Sources */, D0A18D671E16874D004C6734 /* UnreadMessageCountsView.swift in Sources */, - D0D511021D64D73D00A97B8A /* IpcNotifier.mm in Sources */, D0B844511DAC04FE005F29E1 /* PeerPresence.swift in Sources */, D07827C11E0079CB00071108 /* StringIndexTokens.swift in Sources */, D0F3CC721DDE1CDC008148FA /* ItemCacheTable.swift in Sources */, @@ -1591,6 +1584,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1601,6 +1595,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -1608,13 +1603,15 @@ "-DSQLITE_DEFAULT_MEMSTATUS=0", "-DNDEBUG", ); + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = ReleaseHockeyapp; }; @@ -1671,7 +1668,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = ReleaseHockeyapp; }; @@ -1734,6 +1731,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1744,6 +1742,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -1752,13 +1751,15 @@ "-DNDEBUG", ); OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = DebugFork; }; @@ -1821,7 +1822,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = DebugFork; }; @@ -1884,6 +1885,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1894,6 +1896,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -1902,13 +1905,15 @@ "-DNDEBUG", ); OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = DebugAppStore; }; @@ -1971,7 +1976,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = DebugAppStore; }; @@ -2026,6 +2031,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2036,6 +2042,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -2043,13 +2050,15 @@ "-DSQLITE_DEFAULT_MEMSTATUS=0", "-DNDEBUG", ); + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = ReleaseAppStore; }; @@ -2122,6 +2131,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2132,6 +2142,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -2139,13 +2150,15 @@ "-DSQLITE_DEFAULT_MEMSTATUS=0", "-DNDEBUG", ); + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = ReleaseHockeyappInternal; }; @@ -2202,7 +2215,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = ReleaseHockeyappInternal; }; @@ -2265,6 +2278,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2275,6 +2289,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -2283,13 +2298,15 @@ "-DNDEBUG", ); OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = DebugAppStoreLLC; }; @@ -2352,7 +2369,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = DebugAppStoreLLC; }; @@ -2392,7 +2409,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = DebugHockeyapp; }; @@ -2429,7 +2446,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = ReleaseAppStore; }; @@ -2484,6 +2501,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2494,6 +2512,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -2501,13 +2520,15 @@ "-DSQLITE_DEFAULT_MEMSTATUS=0", "-DNDEBUG", ); + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = ReleaseAppStoreLLC; }; @@ -2562,7 +2583,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = ReleaseAppStoreLLC; }; @@ -2625,6 +2646,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CODE_SIGN_STYLE = Manual; + DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -2635,6 +2657,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = mh_dylib; OTHER_CFLAGS = ( "-DSQLITE_HAS_CODEC=1", "-DSQLCIPHER_CRYPTO_CC=1", @@ -2643,13 +2666,16 @@ "-DNDEBUG", ); OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + STRIP_SWIFT_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_REFLECTION_METADATA_LEVEL = all; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; }; name = DebugHockeyapp; }; diff --git a/Postbox/MediaBoxFile.swift b/Postbox/MediaBoxFile.swift index dc25ce8071..0976f6ed18 100644 --- a/Postbox/MediaBoxFile.swift +++ b/Postbox/MediaBoxFile.swift @@ -112,7 +112,7 @@ private final class MediaBoxFileMap { } fileprivate func fill(_ range: Range) { - let intRange = Range(Int(range.lowerBound) ..< Int(range.upperBound)) + let intRange: Range = Int(range.lowerBound) ..< Int(range.upperBound) let previousCount = self.ranges.count(in: intRange) self.ranges.insert(integersIn: intRange) self.sum += Int32(range.count - previousCount) @@ -135,7 +135,7 @@ private final class MediaBoxFileMap { } else { maxValue = Int.max } - let intRange = Range(Int(range.lowerBound) ..< min(maxValue, Int(range.upperBound))) + let intRange: Range = Int(range.lowerBound) ..< min(maxValue, Int(range.upperBound)) return self.ranges.contains(integersIn: intRange) } } @@ -343,7 +343,7 @@ final class MediaBoxPartialFile { assertionFailure() removeIndices.append((index, request)) } else { - let intRange = Range(Int(request.range.lowerBound) ..< Int(min(maxValue, request.range.upperBound))) + let intRange: Range = Int(request.range.lowerBound) ..< Int(min(maxValue, request.range.upperBound)) if self.fileMap.ranges.contains(integersIn: intRange) { removeIndices.append((index, request)) } @@ -684,7 +684,7 @@ private final class MediaBoxFileMissingRange { init(range: Range, priority: MediaBoxFetchPriority, error: @escaping (MediaResourceDataFetchError) -> Void, completion: @escaping () -> Void) { self.range = range self.priority = priority - let intRange = Range(Int(range.lowerBound) ..< Int(range.upperBound)) + let intRange: Range = Int(range.lowerBound) ..< Int(range.upperBound) self.remainingRanges = IndexSet(integersIn: intRange) self.error = error self.completion = completion @@ -790,7 +790,7 @@ private final class MediaBoxFileMissingRanges { } func fill(_ range: Range) -> ([(Range, MediaBoxFetchPriority)], [() -> Void])? { - let intRange = Range(Int(range.lowerBound) ..< Int(range.upperBound)) + let intRange: Range = Int(range.lowerBound) ..< Int(range.upperBound) if self.missingRanges.intersects(integersIn: intRange) { self.missingRanges.remove(integersIn: intRange) var completions: [() -> Void] = [] @@ -824,7 +824,7 @@ private final class MediaBoxFileMissingRanges { private func update(fileMap: MediaBoxFileMap) -> [(Range, MediaBoxFetchPriority)]? { var requested = IndexSet() for item in self.requestedRanges.copyItems() { - let intRange = Range(Int(item.range.lowerBound) ..< Int(item.range.upperBound)) + let intRange: Range = Int(item.range.lowerBound) ..< Int(item.range.upperBound) requested.insert(integersIn: intRange) } requested.subtract(fileMap.ranges) diff --git a/Postbox/MessageHistoryHolesView.swift b/Postbox/MessageHistoryHolesView.swift index aed8c63392..540b1b8317 100644 --- a/Postbox/MessageHistoryHolesView.swift +++ b/Postbox/MessageHistoryHolesView.swift @@ -4,6 +4,12 @@ public struct MessageHistoryHolesViewEntry: Equatable, Hashable { public let hole: MessageHistoryViewHole public let direction: MessageHistoryViewRelativeHoleDirection public let space: MessageHistoryHoleSpace + + public init(hole: MessageHistoryViewHole, direction: MessageHistoryViewRelativeHoleDirection, space: MessageHistoryHoleSpace) { + self.hole = hole + self.direction = direction + self.space = space + } } final class MutableMessageHistoryHolesView { diff --git a/Postbox/MessageHistoryTextIndexTable.swift b/Postbox/MessageHistoryTextIndexTable.swift index 29049ea9cc..945debe657 100644 --- a/Postbox/MessageHistoryTextIndexTable.swift +++ b/Postbox/MessageHistoryTextIndexTable.swift @@ -70,7 +70,7 @@ final class MessageHistoryTextIndexTable { } func search(peerId: PeerId?, text: String, tags: MessageTags?) -> [MessageId] { - var escapedText = String(text.characters.map({ c in + var escapedText = String(text.map({ c in var codeUnits: [UnicodeScalar] = [] for codeUnit in String(c).unicodeScalars { codeUnits.append(codeUnit) diff --git a/Postbox/Postbox.h b/Postbox/Postbox.h index 4e6ba942bf..4daa6ca180 100644 --- a/Postbox/Postbox.h +++ b/Postbox/Postbox.h @@ -17,4 +17,4 @@ FOUNDATION_EXPORT const unsigned char PostboxVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #import -#import +//#import diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index 1ecf918627..77763c3893 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -936,7 +936,7 @@ public final class Transaction { } } -fileprivate class PipeNotifier: NSObject { +/*fileprivate class PipeNotifier: NSObject { let notifier: RLMNotifier let thread: Thread @@ -953,7 +953,7 @@ fileprivate class PipeNotifier: NSObject { func notify() { notifier.notifyOtherRealms() } -} +}*/ public enum PostboxResult { case upgrading(Float) @@ -995,6 +995,8 @@ public func openPostbox(basePath: String, seedConfiguration: SeedConfiguration, //debugRestoreState(basePath: basePath, name: "previous1") #endif + let startTime = CFAbsoluteTimeGetCurrent() + loop: while true { let valueBox = SqliteValueBox(basePath: basePath + "/db", queue: queue, encryptionKey: encryptionKey) @@ -1037,6 +1039,9 @@ public func openPostbox(basePath: String, seedConfiguration: SeedConfiguration, metadataTable.setUserVersion(currentUserVersion) } + let endTime = CFAbsoluteTimeGetCurrent() + print("Postbox load took \((endTime - startTime) * 1000.0) ms") + subscriber.putNext(.postbox(Postbox(queue: queue, basePath: basePath, seedConfiguration: seedConfiguration, valueBox: valueBox))) subscriber.putCompletion() break diff --git a/Postbox/SqliteValueBox.swift b/Postbox/SqliteValueBox.swift index b23c0fa702..0c0e117d75 100644 --- a/Postbox/SqliteValueBox.swift +++ b/Postbox/SqliteValueBox.swift @@ -47,9 +47,9 @@ struct SqlitePreparedStatement { let res = sqlite3_step(statement) if res != SQLITE_ROW && res != SQLITE_DONE { if let error = sqlite3_errmsg(handle), let str = NSString(utf8String: error) { - print("SQL error \(res): \(str) on step") + postboxLog("SQL error \(res): \(str) on step") } else { - print("SQL error \(res) on step") + postboxLog("SQL error \(res) on step") } if res == SQLITE_CORRUPT { @@ -63,6 +63,26 @@ struct SqlitePreparedStatement { return res == SQLITE_ROW } + func tryStep(handle: OpaquePointer?, _ initial: Bool = false, path: String?) -> Bool { + let res = sqlite3_step(statement) + if res != SQLITE_ROW && res != SQLITE_DONE { + if let error = sqlite3_errmsg(handle), let str = NSString(utf8String: error) { + postboxLog("SQL error \(res): \(str) on step") + } else { + postboxLog("SQL error \(res) on step") + } + + if res == SQLITE_CORRUPT { + if let path = path { + postboxLog("Corrupted DB at step, dropping") + try? FileManager.default.removeItem(atPath: path) + preconditionFailure() + } + } + } + return res == SQLITE_ROW || res == SQLITE_DONE + } + func int32At(_ index: Int) -> Int32 { return sqlite3_column_int(statement, Int32(index)) } @@ -194,19 +214,39 @@ final class SqliteValueBox: ValueBox { if let encryptionKey = encryptionKey { let hexKey = hexString(encryptionKey) - resultCode = database.execute("PRAGMA key='\(hexKey)'") - assert(resultCode) + + if encryptionKey.count == 32 { + resultCode = database.execute("PRAGMA key=\"x'\(hexKey)'\"") + assert(resultCode) + + if self.isEncrypted(database) { + resultCode = database.execute("PRAGMA key=\"\(hexKey)\"") + assert(resultCode) + + if !self.isEncrypted(database) { + resultCode = database.execute("PRAGMA rekey=\"x'\(hexKey)'\"") + assert(resultCode) + } + } + } else { + assert(false) + resultCode = database.execute("PRAGMA key=\"\(hexKey)") + assert(resultCode) + } if self.isEncrypted(database) { postboxLog("Encryption key is invalid") + assert(false) + let _ = try? FileManager.default.removeItem(atPath: path) database = Database(path)! - resultCode = database.execute("PRAGMA key='\(hexKey)'") + resultCode = database.execute("PRAGMA key=\"x'\(hexKey)'\"") assert(resultCode) } } else { postboxLog("Encryption key is required") + assert(false) let _ = try? FileManager.default.removeItem(atPath: path) database = Database(path)! } @@ -323,15 +363,18 @@ final class SqliteValueBox: ValueBox { private func isEncrypted(_ database: Database) -> Bool { var statement: OpaquePointer? = nil - let status = sqlite3_prepare_v2(database.handle, "SELECT count(*) FROM sqlite_master", -1, &statement, nil) + let startTime = CFAbsoluteTimeGetCurrent() + let status = sqlite3_prepare_v2(database.handle, "SELECT * FROM sqlite_master LIMIT 1", -1, &statement, nil) if status == SQLITE_NOTADB { return true } let preparedStatement = SqlitePreparedStatement(statement: statement) - if !preparedStatement.step(handle: database.handle, path: self.databasePath) { + if !preparedStatement.tryStep(handle: database.handle, path: self.databasePath) { preparedStatement.destroy() return true } + let endTime = CFAbsoluteTimeGetCurrent() + print("sqlite_master select took \((endTime - startTime) * 1000.0) ms") preparedStatement.destroy() return status == SQLITE_NOTADB }