From e2f19e6b0300d955a9ac3e75330d8e95b51ec1d3 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 14 Jul 2017 15:25:56 +0300 Subject: [PATCH] no message --- Postbox.xcodeproj/project.pbxproj | 600 +++++++++--------- .../xcschemes/PostboxTests.xcscheme | 2 +- .../xcschemes/xcschememanagement.plist | 4 +- Postbox/IntermediateMessage.swift | 5 +- Postbox/ItemCacheTable.swift | 4 + Postbox/Message.swift | 8 +- Postbox/MessageHistoryTable.swift | 55 +- Postbox/NoticeTable.swift | 80 +++ Postbox/Postbox.swift | 26 + PostboxTests/MessageHistoryTableTests.swift | 2 +- 10 files changed, 493 insertions(+), 293 deletions(-) create mode 100644 Postbox/NoticeTable.swift diff --git a/Postbox.xcodeproj/project.pbxproj b/Postbox.xcodeproj/project.pbxproj index 40c2c41531..6d03ae4fb8 100644 --- a/Postbox.xcodeproj/project.pbxproj +++ b/Postbox.xcodeproj/project.pbxproj @@ -89,6 +89,8 @@ D07827C11E0079CB00071108 /* StringIndexTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07827C01E0079CB00071108 /* StringIndexTokens.swift */; }; D07827C31E008F7300071108 /* ReverseIndexReferenceTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07827C21E008F7300071108 /* ReverseIndexReferenceTable.swift */; }; D07827C51E00B23F00071108 /* PeerNameIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07827C41E00B23F00071108 /* PeerNameIndexTable.swift */; }; + D079FCE61F06A3170038FADE /* NoticeTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCE51F06A3170038FADE /* NoticeTable.swift */; }; + D079FCE71F06A31C0038FADE /* NoticeTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D079FCE51F06A3170038FADE /* NoticeTable.swift */; }; D07CFF811DCA765D00761F81 /* PeerChatInterfaceState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07CFF801DCA765D00761F81 /* PeerChatInterfaceState.swift */; }; D07CFF831DCA909100761F81 /* PeerChatInterfaceStateTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07CFF821DCA909100761F81 /* PeerChatInterfaceStateTable.swift */; }; D07CFF851DCA99C400761F81 /* InitialMessageHistoryData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D07CFF841DCA99C400761F81 /* InitialMessageHistoryData.swift */; }; @@ -344,6 +346,7 @@ D07827C01E0079CB00071108 /* StringIndexTokens.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringIndexTokens.swift; sourceTree = ""; }; D07827C21E008F7300071108 /* ReverseIndexReferenceTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReverseIndexReferenceTable.swift; sourceTree = ""; }; D07827C41E00B23F00071108 /* PeerNameIndexTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerNameIndexTable.swift; sourceTree = ""; }; + D079FCE51F06A3170038FADE /* NoticeTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoticeTable.swift; sourceTree = ""; }; D07CFF801DCA765D00761F81 /* PeerChatInterfaceState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerChatInterfaceState.swift; sourceTree = ""; }; D07CFF821DCA909100761F81 /* PeerChatInterfaceStateTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerChatInterfaceStateTable.swift; sourceTree = ""; }; D07CFF841DCA99C400761F81 /* InitialMessageHistoryData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InitialMessageHistoryData.swift; sourceTree = ""; }; @@ -601,6 +604,7 @@ D0F82CFC1E4345D7007E499C /* OrderedItemListTable.swift */, D0F82D0E1E43A024007E499C /* OrderedItemListIndexTable.swift */, D01C7F061EFC1ED3008305F1 /* UnorderedItemListTable.swift */, + D079FCE51F06A3170038FADE /* NoticeTable.swift */, ); name = Tables; sourceTree = ""; @@ -883,6 +887,7 @@ }; D0E3A7541B28A7E300A402D9 = { CreatedOnToolsVersion = 6.3.1; + ProvisioningStyle = Manual; }; }; }; @@ -979,6 +984,7 @@ D0F7B1CC1E045C6A007EB8A5 /* ChatListIndexTable.swift in Sources */, D0B4185E1D7DFE54004562A4 /* IpcNotifier.mm in Sources */, D0F7B1D31E045C6A007EB8A5 /* CachedPeerDataTable.swift in Sources */, + D079FCE71F06A31C0038FADE /* NoticeTable.swift in Sources */, D0F7B1D51E045C6A007EB8A5 /* PeerChatStateTable.swift in Sources */, D0F82CFE1E4345D7007E499C /* OrderedItemListTable.swift in Sources */, D0F7B1C51E045C6A007EB8A5 /* MessageHistoryMetadataTable.swift in Sources */, @@ -1110,6 +1116,7 @@ D0AAD1B51E32673C00D5B9DE /* TimestampBasedMessageAttributesView.swift in Sources */, D010B61A1E1E463900C3E282 /* PeerMergedOperationLogIndexTable.swift in Sources */, D0F9E8671C58D08900037222 /* ChatListIndexTable.swift in Sources */, + D079FCE61F06A3170038FADE /* NoticeTable.swift in Sources */, D0E3A7A21B28B7DC00A402D9 /* Media.swift in Sources */, D0E3A7881B28AE9C00A402D9 /* Coding.swift in Sources */, D0C9DA391C65782500855278 /* SimpleSet.swift in Sources */, @@ -1219,7 +1226,7 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - C22069C81E8EB4BF00E82730 /* AppStore */ = { + C22069C81E8EB4BF00E82730 /* Release Hockeyapp */ = { isa = XCBuildConfiguration; baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; buildSettings = { @@ -1255,14 +1262,15 @@ MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = AppStore; + name = "Release Hockeyapp"; }; - C22069C91E8EB4BF00E82730 /* AppStore */ = { + C22069C91E8EB4BF00E82730 /* Release Hockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; @@ -1292,11 +1300,12 @@ SWIFT_REFLECTION_METADATA_LEVEL = none; SWIFT_VERSION = 3.0; }; - name = AppStore; + name = "Release Hockeyapp"; }; - C22069CA1E8EB4BF00E82730 /* AppStore */ = { + C22069CA1E8EB4BF00E82730 /* Release Hockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -1306,12 +1315,13 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; }; - name = AppStore; + name = "Release Hockeyapp"; }; - C22069CB1E8EB4BF00E82730 /* AppStore */ = { + C22069CB1E8EB4BF00E82730 /* Release Hockeyapp */ = { isa = XCBuildConfiguration; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; @@ -1345,208 +1355,9 @@ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; }; - name = AppStore; + name = "Release Hockeyapp"; }; - D086A5711CC0116A00F08284 /* Hockeyapp */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.10; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Hockeyapp; - }; - D086A5721CC0116A00F08284 /* Hockeyapp */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Postbox/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_CFLAGS = ( - "-DSQLITE_HAS_CODEC=1", - "-DSQLCIPHER_CRYPTO_CC=1", - "-DSQLITE_ENABLE_FTS5", - "-DSQLITE_DEFAULT_MEMSTATUS=0", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = X834Q8SBVP/; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_REFLECTION_METADATA_LEVEL = none; - SWIFT_VERSION = 3.0; - }; - name = Hockeyapp; - }; - D086A5731CC0116A00F08284 /* Hockeyapp */ = { - isa = XCBuildConfiguration; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "/Users/peter/Documents/PostBoxTest/submodules/SSignalKit/build/Debug-iphoneos", - ); - INFOPLIST_FILE = PostboxTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Hockeyapp; - }; - D0B418181D7DFAF3004562A4 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = PostboxMac/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - OTHER_CFLAGS = ( - "-DSQLITE_HAS_CODEC=1", - "-DSQLCIPHER_CRYPTO_CC=1", - "-DSQLITE_ENABLE_FTS5", - "-DSQLITE_DEFAULT_MEMSTATUS=0", - ); - OTHER_SWIFT_FLAGS = "-DDEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - D0B418191D7DFAF3004562A4 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = PostboxMac/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - OTHER_CFLAGS = ( - "-DSQLITE_HAS_CODEC=1", - "-DSQLCIPHER_CRYPTO_CC=1", - "-DSQLITE_ENABLE_FTS5", - "-DSQLITE_DEFAULT_MEMSTATUS=0", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - D0B4181A1D7DFAF3004562A4 /* Hockeyapp */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = PostboxMac/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - OTHER_CFLAGS = ( - "-DSQLITE_HAS_CODEC=1", - "-DSQLCIPHER_CRYPTO_CC=1", - "-DSQLITE_ENABLE_FTS5", - "-DSQLITE_DEFAULT_MEMSTATUS=0", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - }; - name = Hockeyapp; - }; - D0E3A75E1B28A7E300A402D9 /* Debug */ = { + D079FD0C1F06BE070038FADE /* Debug AppStore */ = { isa = XCBuildConfiguration; baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; buildSettings = { @@ -1595,9 +1406,103 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = "Debug AppStore"; }; - D0E3A75F1B28A7E300A402D9 /* Release */ = { + D079FD0D1F06BE070038FADE /* Debug AppStore */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Postbox/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + ); + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = X834Q8SBVP/; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_REFLECTION_METADATA_LEVEL = none; + SWIFT_VERSION = 3.0; + }; + name = "Debug AppStore"; + }; + D079FD0E1F06BE070038FADE /* Debug AppStore */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; + buildSettings = { + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "/Users/peter/Documents/PostBoxTest/submodules/SSignalKit/build/Debug-iphoneos", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = PostboxTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 3.0; + }; + name = "Debug AppStore"; + }; + D079FD0F1F06BE070038FADE /* Debug AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = PostboxMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + ); + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 3.0; + }; + name = "Debug AppStore"; + }; + D086A5711CC0116A00F08284 /* Release AppStore */ = { isa = XCBuildConfiguration; baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; buildSettings = { @@ -1633,14 +1538,188 @@ MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = "Release AppStore"; }; - D0E3A7611B28A7E300A402D9 /* Debug */ = { + D086A5721CC0116A00F08284 /* Release AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Postbox/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = X834Q8SBVP/; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_REFLECTION_METADATA_LEVEL = none; + SWIFT_VERSION = 3.0; + }; + name = "Release AppStore"; + }; + D086A5731CC0116A00F08284 /* Release AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "/Users/peter/Documents/PostBoxTest/submodules/SSignalKit/build/Debug-iphoneos", + ); + INFOPLIST_FILE = PostboxTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 3.0; + }; + name = "Release AppStore"; + }; + D0B418181D7DFAF3004562A4 /* Debug Hockeyapp */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = PostboxMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + ); + OTHER_SWIFT_FLAGS = "-DDEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 3.0; + }; + name = "Debug Hockeyapp"; + }; + D0B4181A1D7DFAF3004562A4 /* Release AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = PostboxMac/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + OTHER_CFLAGS = ( + "-DSQLITE_HAS_CODEC=1", + "-DSQLCIPHER_CRYPTO_CC=1", + "-DSQLITE_ENABLE_FTS5", + "-DSQLITE_DEFAULT_MEMSTATUS=0", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.PostboxMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + }; + name = "Release AppStore"; + }; + D0E3A75E1B28A7E300A402D9 /* Debug Hockeyapp */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = "Debug Hockeyapp"; + }; + D0E3A7611B28A7E300A402D9 /* Debug Hockeyapp */ = { isa = XCBuildConfiguration; baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; buildSettings = { @@ -1672,44 +1751,13 @@ SWIFT_REFLECTION_METADATA_LEVEL = none; SWIFT_VERSION = 3.0; }; - name = Debug; + name = "Debug Hockeyapp"; }; - D0E3A7621B28A7E300A402D9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Postbox/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_CFLAGS = ( - "-DSQLITE_HAS_CODEC=1", - "-DSQLCIPHER_CRYPTO_CC=1", - "-DSQLITE_ENABLE_FTS5", - "-DSQLITE_DEFAULT_MEMSTATUS=0", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = X834Q8SBVP/; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_REFLECTION_METADATA_LEVEL = none; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - D0E3A7641B28A7E300A402D9 /* Debug */ = { + D0E3A7641B28A7E300A402D9 /* Debug Hockeyapp */ = { isa = XCBuildConfiguration; baseConfigurationReference = D07516491B2D9E2500AE42E0 /* Postbox.xcconfig */; buildSettings = { + DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -1723,26 +1771,10 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 3.0; }; - name = Debug; - }; - D0E3A7651B28A7E300A402D9 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "/Users/peter/Documents/PostBoxTest/submodules/SSignalKit/build/Debug-iphoneos", - ); - INFOPLIST_FILE = PostboxTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.telegram.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - }; - name = Release; + name = "Debug Hockeyapp"; }; /* End XCBuildConfiguration section */ @@ -1750,46 +1782,46 @@ D0B4181B1D7DFAF3004562A4 /* Build configuration list for PBXNativeTarget "PostboxMac" */ = { isa = XCConfigurationList; buildConfigurations = ( - D0B418181D7DFAF3004562A4 /* Debug */, - D0B418191D7DFAF3004562A4 /* Release */, - C22069CB1E8EB4BF00E82730 /* AppStore */, - D0B4181A1D7DFAF3004562A4 /* Hockeyapp */, + D0B418181D7DFAF3004562A4 /* Debug Hockeyapp */, + D079FD0F1F06BE070038FADE /* Debug AppStore */, + C22069CB1E8EB4BF00E82730 /* Release Hockeyapp */, + D0B4181A1D7DFAF3004562A4 /* Release AppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = "Debug Hockeyapp"; }; D0E3A7441B28A7E300A402D9 /* Build configuration list for PBXProject "Postbox" */ = { isa = XCConfigurationList; buildConfigurations = ( - D0E3A75E1B28A7E300A402D9 /* Debug */, - D0E3A75F1B28A7E300A402D9 /* Release */, - C22069C81E8EB4BF00E82730 /* AppStore */, - D086A5711CC0116A00F08284 /* Hockeyapp */, + D0E3A75E1B28A7E300A402D9 /* Debug Hockeyapp */, + D079FD0C1F06BE070038FADE /* Debug AppStore */, + C22069C81E8EB4BF00E82730 /* Release Hockeyapp */, + D086A5711CC0116A00F08284 /* Release AppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = "Debug Hockeyapp"; }; D0E3A7601B28A7E300A402D9 /* Build configuration list for PBXNativeTarget "Postbox" */ = { isa = XCConfigurationList; buildConfigurations = ( - D0E3A7611B28A7E300A402D9 /* Debug */, - D0E3A7621B28A7E300A402D9 /* Release */, - C22069C91E8EB4BF00E82730 /* AppStore */, - D086A5721CC0116A00F08284 /* Hockeyapp */, + D0E3A7611B28A7E300A402D9 /* Debug Hockeyapp */, + D079FD0D1F06BE070038FADE /* Debug AppStore */, + C22069C91E8EB4BF00E82730 /* Release Hockeyapp */, + D086A5721CC0116A00F08284 /* Release AppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = "Debug Hockeyapp"; }; D0E3A7631B28A7E300A402D9 /* Build configuration list for PBXNativeTarget "PostboxTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - D0E3A7641B28A7E300A402D9 /* Debug */, - D0E3A7651B28A7E300A402D9 /* Release */, - C22069CA1E8EB4BF00E82730 /* AppStore */, - D086A5731CC0116A00F08284 /* Hockeyapp */, + D0E3A7641B28A7E300A402D9 /* Debug Hockeyapp */, + D079FD0E1F06BE070038FADE /* Debug AppStore */, + C22069CA1E8EB4BF00E82730 /* Release Hockeyapp */, + D086A5731CC0116A00F08284 /* Release AppStore */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = "Debug Hockeyapp"; }; /* End XCConfigurationList section */ }; diff --git a/Postbox.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/PostboxTests.xcscheme b/Postbox.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/PostboxTests.xcscheme index 7d3a550cd8..28b94f0d46 100644 --- a/Postbox.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/PostboxTests.xcscheme +++ b/Postbox.xcodeproj/xcuserdata/peter.xcuserdatad/xcschemes/PostboxTests.xcscheme @@ -7,7 +7,7 @@ buildImplicitDependencies = "YES"> PostboxMac.xcscheme orderHint - 21 + 22 PostboxTests.xcscheme orderHint - 4 + 5 SuppressBuildableAutocreation diff --git a/Postbox/IntermediateMessage.swift b/Postbox/IntermediateMessage.swift index 1d7416bb89..3facd5d6df 100644 --- a/Postbox/IntermediateMessage.swift +++ b/Postbox/IntermediateMessage.swift @@ -5,12 +5,14 @@ struct IntermediateMessageForwardInfo { let sourceId: PeerId? let sourceMessageId: MessageId? let date: Int32 + let authorSignature: String? - init(authorId: PeerId, sourceId: PeerId?, sourceMessageId: MessageId?, date: Int32) { + init(authorId: PeerId, sourceId: PeerId?, sourceMessageId: MessageId?, date: Int32, authorSignature: String?) { self.authorId = authorId self.sourceId = sourceId self.sourceMessageId = sourceMessageId self.date = date + self.authorSignature = authorSignature } init(_ storeInfo: StoreMessageForwardInfo) { @@ -18,6 +20,7 @@ struct IntermediateMessageForwardInfo { self.sourceId = storeInfo.sourceId self.sourceMessageId = storeInfo.sourceMessageId self.date = storeInfo.date + self.authorSignature = storeInfo.authorSignature } } diff --git a/Postbox/ItemCacheTable.swift b/Postbox/ItemCacheTable.swift index ba6751785f..e82a72b547 100644 --- a/Postbox/ItemCacheTable.swift +++ b/Postbox/ItemCacheTable.swift @@ -60,6 +60,10 @@ final class ItemCacheTable: Table { return nil } + func remove(id: ItemCacheEntryId, metaTable: ItemCacheMetaTable) { + self.valueBox.remove(self.table, key: self.itemKey(id: id)) + } + override func clearMemoryCache() { } diff --git a/Postbox/Message.swift b/Postbox/Message.swift index 79ddf2c60a..1037c282a5 100644 --- a/Postbox/Message.swift +++ b/Postbox/Message.swift @@ -337,12 +337,14 @@ public struct StoreMessageForwardInfo { public let sourceId: PeerId? public let sourceMessageId: MessageId? public let date: Int32 + public let authorSignature: String? - public init(authorId: PeerId, sourceId: PeerId?, sourceMessageId: MessageId?, date: Int32) { + public init(authorId: PeerId, sourceId: PeerId?, sourceMessageId: MessageId?, date: Int32, authorSignature: String?) { self.authorId = authorId self.sourceId = sourceId self.sourceMessageId = sourceMessageId self.date = date + self.authorSignature = authorSignature } } @@ -351,6 +353,7 @@ public struct MessageForwardInfo: Equatable { public let source: Peer? public let sourceMessageId: MessageId? public let date: Int32 + public let authorSignature: String? } public func ==(lhs: MessageForwardInfo, rhs: MessageForwardInfo) -> Bool { @@ -370,6 +373,9 @@ public func ==(lhs: MessageForwardInfo, rhs: MessageForwardInfo) -> Bool { if lhs.date != rhs.date { return false } + if lhs.authorSignature != rhs.authorSignature { + return false + } return true } diff --git a/Postbox/MessageHistoryTable.swift b/Postbox/MessageHistoryTable.swift index 943de8d34f..0dc9ff68b7 100644 --- a/Postbox/MessageHistoryTable.swift +++ b/Postbox/MessageHistoryTable.swift @@ -666,6 +666,9 @@ final class MessageHistoryTable: Table { if forwardInfo.sourceMessageId != nil { forwardInfoFlags |= 4 } + if forwardInfo.authorSignature != nil { + forwardInfoFlags |= 8 + } sharedBuffer.write(&forwardInfoFlags, offset: 0, length: 1) var forwardAuthorId: Int64 = forwardInfo.authorId.toInt64() var forwardDate: Int32 = forwardInfo.date @@ -685,6 +688,17 @@ final class MessageHistoryTable: Table { sharedBuffer.write(&sourceMessageIdNamespace, offset: 0, length: 4) sharedBuffer.write(&sourceMessageIdId, offset: 0, length: 4) } + + if let authorSignature = forwardInfo.authorSignature { + if let data = authorSignature.data(using: .utf8, allowLossyConversion: true) { + var length: Int32 = Int32(data.count) + sharedBuffer.write(&length, offset: 0, length: 4) + sharedBuffer.write(data) + } else { + var length: Int32 = 0 + sharedBuffer.write(&length, offset: 0, length: 4) + } + } } else { var forwardInfoFlags: Int8 = 0 sharedBuffer.write(&forwardInfoFlags, offset: 0, length: 1) @@ -1130,6 +1144,9 @@ final class MessageHistoryTable: Table { if forwardInfo.sourceMessageId != nil { forwardInfoFlags |= 4 } + if forwardInfo.authorSignature != nil { + forwardInfoFlags |= 8 + } sharedBuffer.write(&forwardInfoFlags, offset: 0, length: 1) var forwardAuthorId: Int64 = forwardInfo.authorId.toInt64() var forwardDate: Int32 = forwardInfo.date @@ -1149,6 +1166,17 @@ final class MessageHistoryTable: Table { sharedBuffer.write(&sourceMessageIdNamespace, offset: 0, length: 4) sharedBuffer.write(&sourceMessageIdId, offset: 0, length: 4) } + + if let authorSignature = forwardInfo.authorSignature { + if let data = authorSignature.data(using: .utf8, allowLossyConversion: true) { + var length: Int32 = Int32(data.count) + sharedBuffer.write(&length, offset: 0, length: 4) + sharedBuffer.write(data) + } else { + var length: Int32 = 0 + sharedBuffer.write(&length, offset: 0, length: 4) + } + } } else { var forwardInfoFlags: Int8 = 0 sharedBuffer.write(&forwardInfoFlags, offset: 0, length: 1) @@ -1350,6 +1378,9 @@ final class MessageHistoryTable: Table { if forwardInfo.sourceMessageId != nil { forwardInfoFlags |= 4 } + if forwardInfo.authorSignature != nil { + forwardInfoFlags |= 8 + } sharedBuffer.write(&forwardInfoFlags, offset: 0, length: 1) var forwardAuthorId: Int64 = forwardInfo.authorId.toInt64() var forwardDate: Int32 = forwardInfo.date @@ -1369,6 +1400,17 @@ final class MessageHistoryTable: Table { sharedBuffer.write(&sourceMessageIdNamespace, offset: 0, length: 4) sharedBuffer.write(&sourceMessageIdId, offset: 0, length: 4) } + + if let authorSignature = forwardInfo.authorSignature { + if let data = authorSignature.data(using: .utf8, allowLossyConversion: true) { + var length: Int32 = Int32(data.count) + sharedBuffer.write(&length, offset: 0, length: 4) + sharedBuffer.write(data) + } else { + var length: Int32 = 0 + sharedBuffer.write(&length, offset: 0, length: 4) + } + } } else { var forwardInfoFlags: Int8 = 0 sharedBuffer.write(&forwardInfoFlags, offset: 0, length: 1) @@ -1494,6 +1536,7 @@ final class MessageHistoryTable: Table { var forwardDate: Int32 = 0 var forwardSourceId: PeerId? var forwardSourceMessageId: MessageId? + var authorSignature: String? = nil value.read(&forwardAuthorId, offset: 0, length: 8) value.read(&forwardDate, offset: 0, length: 4) @@ -1514,7 +1557,14 @@ final class MessageHistoryTable: Table { forwardSourceMessageId = MessageId(peerId: PeerId(forwardSourceMessagePeerId), namespace: forwardSourceMessageNamespace, id: forwardSourceMessageIdId) } - forwardInfo = IntermediateMessageForwardInfo(authorId: PeerId(forwardAuthorId), sourceId: forwardSourceId, sourceMessageId: forwardSourceMessageId, date: forwardDate) + if (forwardInfoFlags & 8) != 0 { + var signatureLength: Int32 = 0 + value.read(&signatureLength, offset: 0, length: 4) + authorSignature = String(data: Data(bytes: value.memory.assumingMemoryBound(to: UInt8.self).advanced(by: value.offset), count: Int(signatureLength)), encoding: .utf8) + value.skip(Int(signatureLength)) + } + + forwardInfo = IntermediateMessageForwardInfo(authorId: PeerId(forwardAuthorId), sourceId: forwardSourceId, sourceMessageId: forwardSourceMessageId, date: forwardDate, authorSignature: authorSignature) } var hasAuthor: Int8 = 0 @@ -1529,7 +1579,6 @@ final class MessageHistoryTable: Table { var textLength: Int32 = 0 value.read(&textLength, offset: 0, length: 4) let text = String(data: Data(bytes: value.memory.assumingMemoryBound(to: UInt8.self).advanced(by: value.offset), count: Int(textLength)), encoding: .utf8) ?? "" - //let text = NSString(bytes: value.memory + value.offset, length: Int(textLength), encoding: NSUTF8StringEncoding) ?? "" value.skip(Int(textLength)) let attributesOffset = value.offset @@ -1630,7 +1679,7 @@ final class MessageHistoryTable: Table { if let sourceId = internalForwardInfo.sourceId { source = peerTable.get(sourceId) } - forwardInfo = MessageForwardInfo(author: forwardAuthor, source: source, sourceMessageId: internalForwardInfo.sourceMessageId, date: internalForwardInfo.date) + forwardInfo = MessageForwardInfo(author: forwardAuthor, source: source, sourceMessageId: internalForwardInfo.sourceMessageId, date: internalForwardInfo.date, authorSignature: internalForwardInfo.authorSignature) } var author: Peer? diff --git a/Postbox/NoticeTable.swift b/Postbox/NoticeTable.swift new file mode 100644 index 0000000000..3a09cb8fe7 --- /dev/null +++ b/Postbox/NoticeTable.swift @@ -0,0 +1,80 @@ +import Foundation + +public struct NoticeEntryKey: Hashable { + public let namespace: ValueBoxKey + public let key: ValueBoxKey + + fileprivate let combinedKey: ValueBoxKey + + public init(namespace: ValueBoxKey, key: ValueBoxKey) { + self.namespace = namespace + self.key = key + + let combinedKey = ValueBoxKey(length: namespace.length + key.length) + memcpy(combinedKey.memory, namespace.memory, namespace.length) + memcpy(combinedKey.memory.advanced(by: namespace.length), key.memory, key.length) + self.combinedKey = combinedKey + } + + public static func ==(lhs: NoticeEntryKey, rhs: NoticeEntryKey) -> Bool { + return lhs.combinedKey == rhs.combinedKey + } + + public var hashValue: Int { + return self.combinedKey.hashValue + } +} + +private struct CachedEntry { + let entry: Coding? +} + +final class NoticeTable: Table { + private var cachedEntries: [NoticeEntryKey: CachedEntry] = [:] + private var updatedEntryKeys = Set() + + static func tableSpec(_ id: Int32) -> ValueBoxTable { + return ValueBoxTable(id: id, keyType: .binary) + } + + func get(key: NoticeEntryKey) -> Coding? { + if let cached = self.cachedEntries[key] { + return cached.entry + } else { + if let value = self.valueBox.get(self.table, key: key.combinedKey), let object = Decoder(buffer: value).decodeRootObject() { + self.cachedEntries[key] = CachedEntry(entry: object) + return object + } else { + self.cachedEntries[key] = CachedEntry(entry: nil) + return nil + } + } + } + + func set(key: NoticeEntryKey, value: Coding?) { + self.cachedEntries[key] = CachedEntry(entry: value) + updatedEntryKeys.insert(key) + } + + override func clearMemoryCache() { + assert(self.updatedEntryKeys.isEmpty) + } + + override func beforeCommit() { + if !self.updatedEntryKeys.isEmpty { + for key in self.updatedEntryKeys { + if let value = self.cachedEntries[key]?.entry { + let encoder = Encoder() + encoder.encodeRootObject(value) + withExtendedLifetime(encoder, { + self.valueBox.set(self.table, key: key.combinedKey, value: encoder.readBufferNoCopy()) + }) + } else { + self.valueBox.remove(self.table, key: key.combinedKey) + } + } + + self.updatedEntryKeys.removeAll() + } + } +} diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index d3ce4dca90..f37cf67a62 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -457,6 +457,11 @@ public final class Modifier { self.postbox?.putItemCacheEntry(id: id, entry: entry, collectionSpec: collectionSpec) } + public func removeItemCacheEntry(id: ItemCacheEntryId) { + assert(!self.disposed) + self.postbox?.removeItemCacheEntry(id: id) + } + public func retrieveItemCacheEntry(id: ItemCacheEntryId) -> Coding? { assert(!self.disposed) return self.postbox?.retrieveItemCacheEntry(id: id) @@ -607,6 +612,20 @@ public final class Modifier { return false } } + + public func getNoticeEntry(key: NoticeEntryKey) -> Coding? { + assert(!self.disposed) + if let postbox = self.postbox { + return postbox.noticeTable.get(key: key) + } else { + return nil + } + } + + public func setNoticeEntry(key: NoticeEntryKey, value: Coding?) { + assert(!self.disposed) + self.postbox?.noticeTable.set(key: key, value: value) + } } fileprivate class PipeNotifier: NSObject { @@ -797,6 +816,7 @@ public final class Postbox { let orderedItemListIndexTable: OrderedItemListIndexTable let textIndexTable: MessageHistoryTextIndexTable let unorderedItemListTable: UnorderedItemListTable + let noticeTable: NoticeTable //temporary let peerRatingTable: RatingTable @@ -871,6 +891,7 @@ public final class Postbox { self.orderedItemListIndexTable = OrderedItemListIndexTable(valueBox: self.valueBox, table: OrderedItemListIndexTable.tableSpec(37)) self.orderedItemListTable = OrderedItemListTable(valueBox: self.valueBox, table: OrderedItemListTable.tableSpec(38), indexTable: self.orderedItemListIndexTable) self.unorderedItemListTable = UnorderedItemListTable(valueBox: self.valueBox, table: UnorderedItemListTable.tableSpec(42)) + self.noticeTable = NoticeTable(valueBox: self.valueBox, table: NoticeTable.tableSpec(43)) var tables: [Table] = [] tables.append(self.metadataTable) @@ -914,6 +935,7 @@ public final class Postbox { tables.append(self.orderedItemListTable) tables.append(self.orderedItemListIndexTable) tables.append(self.unorderedItemListTable) + tables.append(self.noticeTable) self.tables = tables @@ -1587,6 +1609,10 @@ public final class Postbox { return self.itemCacheTable.retrieve(id: id, metaTable: self.itemCacheMetaTable) } + fileprivate func removeItemCacheEntry(id: ItemCacheEntryId) { + self.itemCacheTable.remove(id: id, metaTable: self.itemCacheMetaTable) + } + fileprivate func replaceGlobalMessageTagsHole(globalTags: GlobalMessageTags, index: MessageIndex, with updatedIndex: MessageIndex?, messages: [StoreMessage]) { var allTagsMatch = true for tag in globalTags { diff --git a/PostboxTests/MessageHistoryTableTests.swift b/PostboxTests/MessageHistoryTableTests.swift index 705e09cb3f..c41ce46fc7 100644 --- a/PostboxTests/MessageHistoryTableTests.swift +++ b/PostboxTests/MessageHistoryTableTests.swift @@ -277,7 +277,7 @@ class MessageHistoryTableTests: XCTestCase { var unsentMessageOperations: [IntermediateMessageHistoryUnsentOperation] = [] var updatedPeerReadStateOperations: [PeerId: PeerReadStateSynchronizationOperation?] = [:] var globalTagsOperations: [GlobalMessageHistoryTagsOperation] = [] - let _ = self.historyTable!.addMessages([StoreMessage(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, timestamp: timestamp, flags: flags, tags: tags, globalTags: [], forwardInfo: nil, authorId: authorPeerId, text: text, attributes: [], media: media)], location: .Random, operationsByPeerId: &operationsByPeerId, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations) + let _ = self.historyTable!.addMessages([StoreMessage(id: MessageId(peerId: peerId, namespace: namespace, id: id), globallyUniqueId: nil, timestamp: timestamp, flags: flags, tags: tags, globalTags: [], forwardInfo: StoreMessageForwardInfo(authorId: peerId, sourceId: peerId, sourceMessageId: MessageId(peerId: peerId, namespace: 0, id: 10), date: 10, authorSignature: "abc"), authorId: authorPeerId, text: text, attributes: [], media: media)], location: .Random, operationsByPeerId: &operationsByPeerId, unsentMessageOperations: &unsentMessageOperations, updatedPeerReadStateOperations: &updatedPeerReadStateOperations, globalTagsOperations: &globalTagsOperations) } private func updateMessage(_ previousId: Int32, _ id: Int32, _ timestamp: Int32, _ text: String = "", _ media: [Media] = [], _ flags: StoreMessageFlags, _ tags: MessageTags) {