marinofaggiana 6 سال پیش
والد
کامیت
f72dde58cc
100فایلهای تغییر یافته به همراه1400 افزوده شده و 2953 حذف شده
  1. 12 12
      Cartfile
  2. 5 5
      Cartfile.resolved
  3. 12 0
      Carthage/Checkouts/CocoaLumberjack/CHANGELOG.md
  4. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/CLI/CLIColor.h
  5. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/CLI/CLIColor.m
  6. 18 18
      Carthage/Checkouts/CocoaLumberjack/Classes/CocoaLumberjack.h
  7. 6 6
      Carthage/Checkouts/CocoaLumberjack/Classes/CocoaLumberjack.swift
  8. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogCapture.h
  9. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogCapture.m
  10. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogger.h
  11. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogger.m
  12. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDAbstractDatabaseLogger.h
  13. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDAbstractDatabaseLogger.m
  14. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDAssertMacros.h
  15. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDFileLogger.h
  16. 39 23
      Carthage/Checkouts/CocoaLumberjack/Classes/DDFileLogger.m
  17. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDLegacyMacros.h
  18. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDLog+LOGV.h
  19. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDLog.h
  20. 68 52
      Carthage/Checkouts/CocoaLumberjack/Classes/DDLog.m
  21. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDLogMacros.h
  22. 14 2
      Carthage/Checkouts/CocoaLumberjack/Classes/DDOSLogger.h
  23. 55 17
      Carthage/Checkouts/CocoaLumberjack/Classes/DDOSLogger.m
  24. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDTTYLogger.h
  25. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/DDTTYLogger.m
  26. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDContextFilterLogFormatter.h
  27. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDContextFilterLogFormatter.m
  28. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDDispatchQueueLogFormatter.h
  29. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDDispatchQueueLogFormatter.m
  30. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDMultiFormatter.h
  31. 1 1
      Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDMultiFormatter.m
  32. 1 1
      Carthage/Checkouts/CocoaLumberjack/CocoaLumberjack.podspec
  33. 1 1
      Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjack-Info.plist
  34. 1 1
      Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjack-Prefix.pch
  35. 1 1
      Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjackSwift-Info.plist
  36. 1 1
      Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjackSwift.h
  37. 1 1
      Carthage/Checkouts/CocoaLumberjack/Tests/Tests/DDBasicLoggingTests.m
  38. 1 1
      Carthage/Checkouts/CocoaLumberjack/Tests/Tests/DDLogMessageTests.m
  39. 1 1
      Carthage/Checkouts/CocoaLumberjack/Tests/Tests/DDLogTests.m
  40. 1 1
      Carthage/Checkouts/KTVHTTPCache/Framework/Info.plist
  41. 0 30
      Carthage/Checkouts/KTVHTTPCache/Framework/KTVHTTPCache.h
  42. 11 3
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache.podspec
  43. 0 15
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCCommon.h
  44. 1 2
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCError.h
  45. 17 17
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCError.m
  46. 11 18
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCLog.h
  47. 48 47
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCLog.m
  48. 6 5
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCRange.h
  49. 38 45
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCRange.m
  50. 6 5
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItem.h
  51. 8 22
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItem.m
  52. 2 2
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItemZone.h
  53. 4 10
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItemZone.m
  54. 7 17
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataFileSource.h
  55. 42 58
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataFileSource.m
  56. 10 12
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataLoader.h
  57. 31 43
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataLoader.m
  58. 9 19
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataNetworkSource.h
  59. 87 131
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataNetworkSource.m
  60. 0 27
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataPrivate.h
  61. 11 13
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataReader.h
  62. 68 100
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataReader.m
  63. 4 7
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataRequest.h
  64. 11 19
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataRequest.m
  65. 7 12
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataResponse.h
  66. 11 41
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataResponse.m
  67. 9 20
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceManager.h
  68. 121 91
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceManager.m
  69. 0 25
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceProtocol.h
  70. 0 39
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceQueue.h
  71. 0 152
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceQueue.m
  72. 3 3
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataStorage.h
  73. 11 13
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataStorage.m
  74. 16 21
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnit.h
  75. 127 175
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnit.m
  76. 8 10
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitItem.h
  77. 25 31
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitItem.m
  78. 1 1
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitPool.h
  79. 71 91
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitPool.m
  80. 2 2
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitQueue.h
  81. 20 35
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitQueue.m
  82. 10 10
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDownload/KTVHCDownload.h
  83. 118 135
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDownload/KTVHCDownload.m
  84. 0 2
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPConnection.h
  85. 8 30
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPConnection.m
  86. 0 24
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPPingResponse.h
  87. 0 98
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPPingResponse.m
  88. 0 23
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPRequest.h
  89. 2 2
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPResponse.h
  90. 28 31
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPResponse.m
  91. 2 2
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPServer.h
  92. 108 100
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPServer.m
  93. 0 32
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPURL.h
  94. 0 116
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPURL.m
  95. 0 34
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCPathTools.h
  96. 0 184
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCPathTools.m
  97. 0 27
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCURLTools.h
  98. 0 145
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCURLTools.m
  99. 0 139
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHTTPCacheImp.h
  100. 0 224
      Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHTTPCacheImp.m

+ 12 - 12
Cartfile

@@ -1,16 +1,16 @@
-github "tilltue/TLPhotoPicker"
-github "kishikawakatsumi/UICKeyChainStore"
+github "tilltue/TLPhotoPicker" == 1.8.3
+github "kishikawakatsumi/UICKeyChainStore" == 2.1.2
 github "danielsaidi/Sheeeeeeeeet" == 1.2.2
-github "sgr-ksmt/PDFGenerator" ~> 2.1
-github "MortimerGoro/MGSwipeTableCell"
-github "dzenbot/DZNEmptyDataSet"
-github "ealeksandrov/EAIntroView"
-github "calimarkus/JDStatusBarNotification"
-github "ChangbaDevs/KTVHTTPCache" ~> 1.1.7
-github "jdg/MBProgressHUD" ~> 1.1.0
-github "realm/realm-cocoa"
-github "SVGKit/SVGKit" "2.x"
+github "sgr-ksmt/PDFGenerator" == 2.1
+github "MortimerGoro/MGSwipeTableCell" == 1.6.8
+github "dzenbot/DZNEmptyDataSet" == 1.8.1
+github "ealeksandrov/EAIntroView" == 2.12.0
+github "calimarkus/JDStatusBarNotification" == 1.6.0
+github "ChangbaDevs/KTVHTTPCache" == 2.0.0
+github "jdg/MBProgressHUD" == 1.1.0
+github "realm/realm-cocoa" == 3.13.1
+github "SVGKit/SVGKit" == 2.1.0
 github "WeTransfer/WeScan" == 0.9.1
-github "malcommac/SwiftRichString"
+github "malcommac/SwiftRichString" == 2.0.1
 github "https://github.com/marinofaggiana/FastScroll" "master"
 github "yannickl/QRCodeReader.swift" >= 10.0.0

+ 5 - 5
Cartfile.resolved

@@ -1,7 +1,7 @@
-github "ChangbaDevs/KTVHTTPCache" "1.1.7"
-github "CocoaLumberjack/CocoaLumberjack" "3.5.1"
+github "ChangbaDevs/KTVHTTPCache" "2.0.0"
+github "CocoaLumberjack/CocoaLumberjack" "3.5.2"
 github "MortimerGoro/MGSwipeTableCell" "1.6.8"
-github "SVGKit/SVGKit" "4b507e48da30711e25d1bcdd19580f25887a2267"
+github "SVGKit/SVGKit" "2.1.0"
 github "WeTransfer/WeScan" "v0.9.1"
 github "calimarkus/JDStatusBarNotification" "1.6.0"
 github "danielsaidi/Sheeeeeeeeet" "1.2.2"
@@ -10,9 +10,9 @@ github "ealeksandrov/EAIntroView" "2.12.0"
 github "ealeksandrov/EARestrictedScrollView" "1.1.0"
 github "jdg/MBProgressHUD" "1.1.0"
 github "kishikawakatsumi/UICKeyChainStore" "v2.1.2"
-github "malcommac/SwiftRichString" "2.1.0"
+github "malcommac/SwiftRichString" "2.0.1"
 github "marinofaggiana/FastScroll" "81967c2309d29bc2c330d422da612160a30bade8"
 github "realm/realm-cocoa" "v3.13.1"
-github "sgr-ksmt/PDFGenerator" "2.1.1"
+github "sgr-ksmt/PDFGenerator" "2.1"
 github "tilltue/TLPhotoPicker" "1.8.3"
 github "yannickl/QRCodeReader.swift" "10.0.0"

+ 12 - 0
Carthage/Checkouts/CocoaLumberjack/CHANGELOG.md

@@ -1,3 +1,15 @@
+## [3.5.2 - Xcode 10.1 on 15th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.2)
+
+### Public
+- Fix reusing of log files after rolling (#1042)
+- Fix creation of too many log files (#1049)
+- Preliminary compatibility with Swift 5 (backwards compatible with Swift 4) (#1044)
+- core: loggers os logger variations have been added (#1039)
+
+### Internal
+- Sync internal queues to prevent cleaning up log files too soon in tests (#1053)
+- DDLog checks for NULL values and for global queue dispatching has been added (#1045)
+
 ## [3.5.1 - Xcode 10 on Feb 4th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.1)
 
 ### Public

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/CLI/CLIColor.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/CLI/CLIColor.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 18 - 18
Carthage/Checkouts/CocoaLumberjack/Classes/CocoaLumberjack.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,
@@ -71,33 +71,33 @@ FOUNDATION_EXPORT const unsigned char CocoaLumberjackVersionString[];
 #endif
 
 // Core
-#import "DDLog.h"
+#import <CocoaLumberjack/DDLog.h>
 
 // Main macros
-#import "DDLogMacros.h"
-#import "DDAssertMacros.h"
+#import <CocoaLumberjack/DDLogMacros.h>
+#import <CocoaLumberjack/DDAssertMacros.h>
 
 // Capture ASL
-#import "DDASLLogCapture.h"
+#import <CocoaLumberjack/DDASLLogCapture.h>
 
 // Loggers
-#import "DDLoggerNames.h"
+#import <CocoaLumberjack/DDLoggerNames.h>
 
-#import "DDTTYLogger.h"
-#import "DDASLLogger.h"
-#import "DDFileLogger.h"
-#import "DDOSLogger.h"
+#import <CocoaLumberjack/DDTTYLogger.h>
+#import <CocoaLumberjack/DDASLLogger.h>
+#import <CocoaLumberjack/DDFileLogger.h>
+#import <CocoaLumberjack/DDOSLogger.h>
 
 // Extensions
-#import "DDContextFilterLogFormatter.h"
-#import "DDDispatchQueueLogFormatter.h"
-#import "DDMultiFormatter.h"
-#import "DDFileLogger+Buffering.h"
+#import <CocoaLumberjack/DDContextFilterLogFormatter.h>
+#import <CocoaLumberjack/DDDispatchQueueLogFormatter.h>
+#import <CocoaLumberjack/DDMultiFormatter.h>
+#import <CocoaLumberjack/DDFileLogger+Buffering.h>
 
 // CLI
-#import "CLIColor.h"
+#import <CocoaLumberjack/CLIColor.h>
 
 // etc
-#import "DDAbstractDatabaseLogger.h"
-#import "DDLog+LOGV.h"
-#import "DDLegacyMacros.h"
+#import <CocoaLumberjack/DDAbstractDatabaseLogger.h>
+#import <CocoaLumberjack/DDLog+LOGV.h>
+#import <CocoaLumberjack/DDLegacyMacros.h>

+ 6 - 6
Carthage/Checkouts/CocoaLumberjack/Classes/CocoaLumberjack.swift

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,
@@ -111,7 +111,7 @@ public func DDLogDebug(_ message: @autoclosure () -> String,
                        tag: Any? = nil,
                        asynchronous async: Bool = asyncLoggingEnabled,
                        ddlog: DDLog = .sharedInstance) {
-    _DDLogMessage(message, level: level, flag: .debug, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
+    _DDLogMessage(message(), level: level, flag: .debug, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
 }
 
 @inlinable
@@ -124,7 +124,7 @@ public func DDLogInfo(_ message: @autoclosure () -> String,
                       tag: Any? = nil,
                       asynchronous async: Bool = asyncLoggingEnabled,
                       ddlog: DDLog = .sharedInstance) {
-    _DDLogMessage(message, level: level, flag: .info, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
+    _DDLogMessage(message(), level: level, flag: .info, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
 }
 
 @inlinable
@@ -137,7 +137,7 @@ public func DDLogWarn(_ message: @autoclosure () -> String,
                       tag: Any? = nil,
                       asynchronous async: Bool = asyncLoggingEnabled,
                       ddlog: DDLog = .sharedInstance) {
-    _DDLogMessage(message, level: level, flag: .warning, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
+    _DDLogMessage(message(), level: level, flag: .warning, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
 }
 
 @inlinable
@@ -150,7 +150,7 @@ public func DDLogVerbose(_ message: @autoclosure () -> String,
                          tag: Any? = nil,
                          asynchronous async: Bool = asyncLoggingEnabled,
                          ddlog: DDLog = .sharedInstance) {
-    _DDLogMessage(message, level: level, flag: .verbose, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
+    _DDLogMessage(message(), level: level, flag: .verbose, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
 }
 
 @inlinable
@@ -163,7 +163,7 @@ public func DDLogError(_ message: @autoclosure () -> String,
                        tag: Any? = nil,
                        asynchronous async: Bool = false,
                        ddlog: DDLog = .sharedInstance) {
-    _DDLogMessage(message, level: level, flag: .error, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
+    _DDLogMessage(message(), level: level, flag: .error, context: context, file: file, function: function, line: line, tag: tag, asynchronous: async, ddlog: ddlog)
 }
 
 /// Returns a String of the current filename, without full path or extension.

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogCapture.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogCapture.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogger.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDASLLogger.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDAbstractDatabaseLogger.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDAbstractDatabaseLogger.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDAssertMacros.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDFileLogger.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 39 - 23
Carthage/Checkouts/CocoaLumberjack/Classes/DDFileLogger.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,
@@ -1007,39 +1007,55 @@ unsigned long long const kDDDefaultLogFilesDiskQuota   = 20 * 1024 * 1024; // 20
 - (DDLogFileInfo *)lt_currentLogFileInfo {
     NSAssert([self isOnInternalLoggerQueue], @"lt_ methods should be on logger queue.");
 
-    BOOL isResuming = _currentLogFileInfo == nil;
+    // Get the current log file info ivar (might be nil).
+    DDLogFileInfo *newCurrentLogFile = _currentLogFileInfo;
+
+    // Check if we're resuming and if so, get the first of the sorted log file infos.
+    BOOL isResuming = newCurrentLogFile == nil;
     if (isResuming) {
         NSArray *sortedLogFileInfos = [_logFileManager sortedLogFileInfos];
-        _currentLogFileInfo = sortedLogFileInfos.firstObject;
+        newCurrentLogFile = sortedLogFileInfos.firstObject;
     }
 
-    if (_currentLogFileInfo) {
-        BOOL isMostRecentLogArchived = _currentLogFileInfo.isArchived;
-        BOOL forceArchive = _doNotReuseLogFiles && isMostRecentLogArchived == NO;
-
-        if (forceArchive || [self lt_shouldLogFileBeArchived:_currentLogFileInfo]) {
-            _currentLogFileInfo.isArchived = YES;
-            NSString *archivedLogFilePath = [_currentLogFileInfo.fileName copy];
-            _currentLogFileInfo = nil;
-
-            if ([_logFileManager respondsToSelector:@selector(didArchiveLogFile:)]) {
-                dispatch_async(_completionQueue, ^{
-                    [self->_logFileManager didArchiveLogFile:archivedLogFilePath];
-                });
-            }
+    // Check if the file we've found is still valid. Otherwise create a new one.
+    if (newCurrentLogFile != nil && [self lt_shouldUseLogFile:newCurrentLogFile isResuming:isResuming]) {
+        if (isResuming) {
+            NSLogVerbose(@"DDFileLogger: Resuming logging with file %@", newCurrentLogFile.fileName);
         }
+        _currentLogFileInfo = newCurrentLogFile;
+    } else {
+        NSString *currentLogFilePath = [_logFileManager createNewLogFile];
+        _currentLogFileInfo = [[DDLogFileInfo alloc] initWithFilePath:currentLogFilePath];
     }
 
-    if (isResuming && _currentLogFileInfo) {
-        NSLogVerbose(@"DDFileLogger: Resuming logging with file %@", _currentLogFileInfo.fileName);
+    return _currentLogFileInfo;
+}
+
+- (BOOL)lt_shouldUseLogFile:(nonnull DDLogFileInfo *)logFileInfo isResuming:(BOOL)isResuming {
+    NSAssert([self isOnInternalLoggerQueue], @"lt_ methods should be on logger queue.");
+    NSParameterAssert(logFileInfo);
+
+    // Check if the log file is archived. We must not use archived log files.
+    if (logFileInfo.isArchived) {
+        return NO;
     }
 
-    if (!_currentLogFileInfo) {
-        NSString *currentLogFilePath = [_logFileManager createNewLogFile];
-        _currentLogFileInfo = [[DDLogFileInfo alloc] initWithFilePath:currentLogFilePath];
+    // If we're resuming, we need to check if the log file is allowed for reuse or needs to be archived.
+    if (isResuming && (_doNotReuseLogFiles || [self lt_shouldLogFileBeArchived:logFileInfo])) {
+        logFileInfo.isArchived = YES;
+        NSString *archivedLogFilePath = [logFileInfo.fileName copy];
+
+        if ([_logFileManager respondsToSelector:@selector(didArchiveLogFile:)]) {
+            dispatch_async(_completionQueue, ^{
+                [self->_logFileManager didArchiveLogFile:archivedLogFilePath];
+            });
+        }
+
+        return NO;
     }
 
-    return _currentLogFileInfo;
+    // All checks have passed. It's valid.
+    return YES;
 }
 
 - (void)lt_monitorCurrentLogFileForExternalChanges {

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDLegacyMacros.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDLog+LOGV.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDLog.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 68 - 52
Carthage/Checkouts/CocoaLumberjack/Classes/DDLog.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,
@@ -127,12 +127,12 @@ static NSUInteger _numProcessors;
  */
 + (instancetype)sharedInstance {
     static id sharedInstance = nil;
-    
+
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         sharedInstance = [[self alloc] init];
     });
-    
+
     return sharedInstance;
 }
 
@@ -146,23 +146,23 @@ static NSUInteger _numProcessors;
  **/
 + (void)initialize {
     static dispatch_once_t DDLogOnceToken;
-    
+
     dispatch_once(&DDLogOnceToken, ^{
         NSLogDebug(@"DDLog: Using grand central dispatch");
-        
+
         _loggingQueue = dispatch_queue_create("cocoa.lumberjack", NULL);
         _loggingGroup = dispatch_group_create();
-        
+
         void *nonNullValue = GlobalLoggingQueueIdentityKey; // Whatever, just not null
         dispatch_queue_set_specific(_loggingQueue, GlobalLoggingQueueIdentityKey, nonNullValue, NULL);
-        
+
         _queueSemaphore = dispatch_semaphore_create(DDLOG_MAX_QUEUE_SIZE);
-        
+
         // Figure out how many processors are available.
         // This may be used later for an optimization on uniprocessor machines.
-        
+
         _numProcessors = MAX([NSProcessInfo processInfo].processorCount, (NSUInteger) 1);
-        
+
         NSLogDebug(@"DDLog: numProcessors = %@", @(_numProcessors));
     });
 }
@@ -175,10 +175,10 @@ static NSUInteger _numProcessors;
  */
 - (id)init {
     self = [super init];
-    
+
     if (self) {
         self._loggers = [[NSMutableArray alloc] initWithCapacity:4];
-        
+
 #if TARGET_OS_IOS
         NSString *notificationName = UIApplicationWillTerminateNotification;
 #else
@@ -199,9 +199,9 @@ static NSUInteger _numProcessors;
                 [weakSelf applicationWillTerminate:nil];
             });
         }
-        
+
 #endif /* if TARGET_OS_IOS */
-        
+
         if (notificationName) {
             [[NSNotificationCenter defaultCenter] addObserver:self
                                                      selector:@selector(applicationWillTerminate:)
@@ -209,7 +209,7 @@ static NSUInteger _numProcessors;
                                                        object:nil];
         }
     }
-    
+
     return self;
 }
 
@@ -248,7 +248,7 @@ static NSUInteger _numProcessors;
     if (!logger) {
         return;
     }
-    
+
     dispatch_async(_loggingQueue, ^{ @autoreleasepool {
         [self lt_addLogger:logger level:level];
     } });
@@ -262,7 +262,7 @@ static NSUInteger _numProcessors;
     if (!logger) {
         return;
     }
-    
+
     dispatch_async(_loggingQueue, ^{ @autoreleasepool {
         [self lt_removeLogger:logger];
     } });
@@ -284,11 +284,11 @@ static NSUInteger _numProcessors;
 
 - (NSArray<id<DDLogger>> *)allLoggers {
     __block NSArray *theLoggers;
-    
+
     dispatch_sync(_loggingQueue, ^{ @autoreleasepool {
         theLoggers = [self lt_allLoggers];
     } });
-    
+
     return theLoggers;
 }
 
@@ -298,11 +298,11 @@ static NSUInteger _numProcessors;
 
 - (NSArray<DDLoggerInformation *> *)allLoggersWithLevel {
     __block NSArray *theLoggersWithLevel;
-    
+
     dispatch_sync(_loggingQueue, ^{ @autoreleasepool {
         theLoggersWithLevel = [self lt_allLoggersWithLevel];
     } });
-    
+
     return theLoggersWithLevel;
 }
 
@@ -378,16 +378,16 @@ static NSUInteger _numProcessors;
         tag:(id)tag
      format:(NSString *)format, ... {
     va_list args;
-    
+
     if (format) {
         va_start(args, format);
-        
+
         NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
-        
+
         va_end(args);
-        
+
         va_start(args, format);
-        
+
         [self log:asynchronous
           message:message
             level:level
@@ -397,7 +397,7 @@ static NSUInteger _numProcessors;
          function:function
              line:line
               tag:tag];
-        
+
         va_end(args);
     }
 }
@@ -412,16 +412,16 @@ static NSUInteger _numProcessors;
         tag:(id)tag
      format:(NSString *)format, ... {
     va_list args;
-    
+
     if (format) {
         va_start(args, format);
-        
+
         NSString *message = [[NSString alloc] initWithFormat:format arguments:args];
-        
+
         va_end(args);
-        
+
         va_start(args, format);
-        
+
         [self log:asynchronous
           message:message
             level:level
@@ -431,7 +431,7 @@ static NSUInteger _numProcessors;
          function:function
              line:line
               tag:tag];
-        
+
         va_end(args);
     }
 }
@@ -504,7 +504,7 @@ static NSUInteger _numProcessors;
                                                                  tag:tag
                                                              options:(DDLogMessageOptions)0
                                                            timestamp:nil];
-    
+
     [self queueLogMessage:logMessage asynchronously:asynchronous];
 }
 
@@ -753,19 +753,19 @@ static NSUInteger _numProcessors;
             break;
         }
     }
-    
+
     if (loggerNode == nil) {
         NSLogDebug(@"DDLog: Request to remove logger which wasn't added");
         return;
     }
-    
+
     // Notify logger
     if ([logger respondsToSelector:@selector(willRemoveLogger)]) {
         dispatch_async(loggerNode->_loggerQueue, ^{ @autoreleasepool {
             [logger willRemoveLogger];
         } });
     }
-    
+
     // Remove from loggers array
     [self._loggers removeObject:loggerNode];
 }
@@ -773,7 +773,7 @@ static NSUInteger _numProcessors;
 - (void)lt_removeAllLoggers {
     NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
              @"This method should only be run on the logging thread/queue");
-    
+
     // Notify all loggers
     for (DDLoggerNode *loggerNode in self._loggers) {
         if ([loggerNode->_logger respondsToSelector:@selector(willRemoveLogger)]) {
@@ -782,7 +782,7 @@ static NSUInteger _numProcessors;
             } });
         }
     }
-    
+
     // Remove all loggers from array
 
     [self._loggers removeAllObjects];
@@ -804,14 +804,14 @@ static NSUInteger _numProcessors;
 - (NSArray *)lt_allLoggersWithLevel {
     NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
              @"This method should only be run on the logging thread/queue");
-    
+
     NSMutableArray *theLoggersWithLevel = [NSMutableArray new];
-    
+
     for (DDLoggerNode *loggerNode in self._loggers) {
         [theLoggersWithLevel addObject:[DDLoggerInformation informationWithLogger:loggerNode->_logger
                                                                          andLevel:loggerNode->_level]];
     }
-    
+
     return [theLoggersWithLevel copy];
 }
 
@@ -835,23 +835,39 @@ static NSUInteger _numProcessors;
             if (!(logMessage->_flag & loggerNode->_level)) {
                 continue;
             }
-            
+
             dispatch_group_async(_loggingGroup, loggerNode->_loggerQueue, ^{ @autoreleasepool {
                 [loggerNode->_logger logMessage:logMessage];
             } });
         }
-        
+
         dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER);
     } else {
         // Execute each logger serially, each within its own queue.
-        
+
         for (DDLoggerNode *loggerNode in self._loggers) {
             // skip the loggers that shouldn't write this message based on the log level
 
             if (!(logMessage->_flag & loggerNode->_level)) {
                 continue;
             }
-            
+
+#if DD_DEBUG
+            // we must assure that we aren not on loggerNode->_loggerQueue.
+            if (loggerNode->_loggerQueue == NULL) {
+              // tell that we can't dispatch logger node on queue that is NULL.
+              NSLogDebug(@"DDLog: current node has loggerQueue == NULL");
+            }
+            else {
+              dispatch_async(loggerNode->_loggerQueue, ^{
+                if (dispatch_get_specific(GlobalLoggingQueueIdentityKey)) {
+                  // tell that we somehow on logging queue?
+                  NSLogDebug(@"DDLog: current node has loggerQueue == globalLoggingQueue");
+                }
+              });
+            }
+#endif
+            // next, we must check that node is OK.
             dispatch_sync(loggerNode->_loggerQueue, ^{ @autoreleasepool {
                 [loggerNode->_logger logMessage:logMessage];
             } });
@@ -880,10 +896,10 @@ static NSUInteger _numProcessors;
     //
     // Now we need to propagate the flush request to any loggers that implement the flush method.
     // This is designed for loggers that buffer IO.
-    
+
     NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey),
              @"This method should only be run on the logging thread/queue");
-    
+
     for (DDLoggerNode *loggerNode in self._loggers) {
         if ([loggerNode->_logger respondsToSelector:@selector(flush)]) {
             dispatch_group_async(_loggingGroup, loggerNode->_loggerQueue, ^{ @autoreleasepool {
@@ -891,7 +907,7 @@ static NSUInteger _numProcessors;
             } });
         }
     }
-    
+
     dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER);
 }
 
@@ -1052,7 +1068,7 @@ NSString * __nullable DDExtractFileNameWithoutExtension(const char *filePath, BO
         {
             _fileName = [_fileName substringToIndex:dotLocation];
         }
-        
+
         // Try to get the current queue's label
         _queueLabel = [[NSString alloc] initWithFormat:@"%s", dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];
     }
@@ -1061,7 +1077,7 @@ NSString * __nullable DDExtractFileNameWithoutExtension(const char *filePath, BO
 
 - (id)copyWithZone:(NSZone * __attribute__((unused)))zone {
     DDLogMessage *newMessage = [DDLogMessage new];
-    
+
     newMessage->_message = _message;
     newMessage->_level = _level;
     newMessage->_flag = _flag;
@@ -1216,7 +1232,7 @@ NSString * __nullable DDExtractFileNameWithoutExtension(const char *filePath, BO
                 }
 
                 self->_logFormatter = logFormatter;
- 
+
                 if ([self->_logFormatter respondsToSelector:@selector(didAddToLogger:inQueue:)]) {
                     [self->_logFormatter didAddToLogger:self inQueue:self->_loggerQueue];
                 } else if ([self->_logFormatter respondsToSelector:@selector(didAddToLogger:)]) {

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDLogMacros.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 14 - 2
Carthage/Checkouts/CocoaLumberjack/Classes/DDOSLogger.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,
@@ -31,8 +31,20 @@ API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0))
 /**
  *  Singleton method
  *
- *  @return the shared instance
+ *  @return the shared instance with OS_LOG_DEFAULT.
  */
 @property (class, readonly, strong) DDOSLogger *sharedInstance;
 
+/**
+ Designed initializer
+ 
+ @param subsystem Desired subsystem in log. Consider "org.example"
+ @param category Desired category in log. Consider "Point of interests."
+ @return New instance of DDOSLogger.
+ 
+ @discussion This method accepts parameters of type (String, String)?
+ If both parameters are nil, this method will return logger wrapper for `OS_LOG_DEFAULT`.
+ If both parameters are not nil, it will return logger wrapper for `os_log_create(subsystem, category)`
+ */
+- (instancetype)initWithSubsystem:(NSString *)subsystem category:(NSString *)category NS_DESIGNATED_INITIALIZER;
 @end

+ 55 - 17
Carthage/Checkouts/CocoaLumberjack/Classes/DDOSLogger.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,
@@ -17,10 +17,41 @@
 
 #import <os/log.h>
 
+@interface DDOSLogger () {
+    NSString *_subsystem;
+    NSString *_category;
+}
+@property (copy, nonatomic, readonly) NSString *subsystem;
+@property (copy, nonatomic, readonly) NSString *category;
+@property (strong, nonatomic, readwrite) os_log_t  logger;
+@end
+
 @implementation DDOSLogger
 
+@synthesize subsystem = _subsystem;
+@synthesize category = _category;
+
+#pragma mark - Initialization
+
+/**
+ * Assertion
+ * Swift: (String, String)?
+ */
+- (instancetype)initWithSubsystem:(NSString *)subsystem category:(NSString *)category {
+    NSAssert((subsystem == nil) == (category == nil), @"Either both subsystem and category or neither can be nil.");
+    if (self = [super init]) {
+        _subsystem = [subsystem copy];
+        _category = [category copy];
+    }
+    return self;
+}
+
 static DDOSLogger *sharedInstance;
 
+- (instancetype)init {
+    return [self initWithSubsystem:nil category:nil];
+}
+
 + (instancetype)sharedInstance {
     static dispatch_once_t DDOSLoggerOnceToken;
 
@@ -31,46 +62,54 @@ static DDOSLogger *sharedInstance;
     return sharedInstance;
 }
 
-- (instancetype)init {
-    if (sharedInstance != nil) {
-        return nil;
-    }
+#pragma mark - os_log
 
-    if (self = [super init]) {
-        return self;
+- (os_log_t)getLogger {
+    if (self.subsystem == nil || self.category == nil) {
+        return OS_LOG_DEFAULT;
     }
+    __auto_type subdomain = self.subsystem.UTF8String;
+    __auto_type category = self.category.UTF8String;
+    return os_log_create(subdomain, category);
+}
 
-    return nil;
+- (os_log_t)logger {
+    if (_logger == nil)  {
+        _logger = [self getLogger];
+    }
+    return _logger;
 }
 
+#pragma mark - DDLogger
+
 - (void)logMessage:(DDLogMessage *)logMessage {
     // Skip captured log messages
     if ([logMessage->_fileName isEqualToString:@"DDASLLogCapture"]) {
         return;
     }
-    
+
     if(@available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *)) {
-        
+
         NSString * message = _logFormatter ? [_logFormatter formatLogMessage:logMessage] : logMessage->_message;
-        if (message) {
+        if (message != nil) {
             const char *msg = [message UTF8String];
-            
+            __auto_type logger = [self logger];
             switch (logMessage->_flag) {
                 case DDLogFlagError     :
-                    os_log_error(OS_LOG_DEFAULT, "%{public}s", msg);
+                    os_log_error(logger, "%{public}s", msg);
                     break;
                 case DDLogFlagWarning   :
                 case DDLogFlagInfo      :
-                    os_log_info(OS_LOG_DEFAULT, "%{public}s", msg);
+                    os_log_info(logger, "%{public}s", msg);
                     break;
                 case DDLogFlagDebug     :
                 case DDLogFlagVerbose   :
                 default                 :
-                    os_log_debug(OS_LOG_DEFAULT, "%{public}s", msg);
+                    os_log_debug(logger, "%{public}s", msg);
                     break;
             }
         }
-        
+
     }
 
 }
@@ -78,5 +117,4 @@ static DDOSLogger *sharedInstance;
 - (DDLoggerName)loggerName {
     return DDLoggerNameOS;
 }
-
 @end

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDTTYLogger.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/DDTTYLogger.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDContextFilterLogFormatter.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDContextFilterLogFormatter.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDDispatchQueueLogFormatter.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDDispatchQueueLogFormatter.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDMultiFormatter.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Classes/Extensions/DDMultiFormatter.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/CocoaLumberjack.podspec

@@ -2,7 +2,7 @@
 Pod::Spec.new do |s|
 
   s.name     = 'CocoaLumberjack'
-  s.version  = '3.5.1'
+  s.version  = '3.5.2'
   s.license  = 'BSD'
   s.summary  = 'A fast & simple, yet powerful & flexible logging framework for Mac and iOS.'
   s.homepage = 'https://github.com/CocoaLumberjack/CocoaLumberjack'

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjack-Info.plist

@@ -17,7 +17,7 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>3.5.1</string>
+	<string>3.5.2</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjack-Prefix.pch

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjackSwift-Info.plist

@@ -17,7 +17,7 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>3.5.1</string>
+	<string>3.5.2</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Framework/Lumberjack/CocoaLumberjackSwift.h

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Tests/Tests/DDBasicLoggingTests.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Tests/Tests/DDLogMessageTests.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/CocoaLumberjack/Tests/Tests/DDLogTests.m

@@ -1,6 +1,6 @@
 // Software License Agreement (BSD License)
 //
-// Copyright (c) 2010-2018, Deusty, LLC
+// Copyright (c) 2010-2019, Deusty, LLC
 // All rights reserved.
 //
 // Redistribution and use of this software in source and binary forms,

+ 1 - 1
Carthage/Checkouts/KTVHTTPCache/Framework/Info.plist

@@ -15,7 +15,7 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.1.7</string>
+	<string>2.0.0</string>
 	<key>CFBundleVersion</key>
 	<string>$(CURRENT_PROJECT_VERSION)</string>
 	<key>LSApplicationCategoryType</key>

+ 0 - 30
Carthage/Checkouts/KTVHTTPCache/Framework/KTVHTTPCache.h

@@ -1,30 +0,0 @@
-//
-//  KTVHTTPCache.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/10.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-FOUNDATION_EXPORT double KTVHTTPCacheVersionNumber;
-FOUNDATION_EXPORT const unsigned char KTVHTTPCacheVersionString[];
-
-#pragma mark - Interface
-
-#import <KTVHTTPCache/KTVHTTPCacheImp.h>
-
-#pragma mark - Data Storage
-
-#import <KTVHTTPCache/KTVHCDataReader.h>
-#import <KTVHTTPCache/KTVHCDataLoader.h>
-#import <KTVHTTPCache/KTVHCDataRequest.h>
-#import <KTVHTTPCache/KTVHCDataResponse.h>
-#import <KTVHTTPCache/KTVHCDataCacheItem.h>
-#import <KTVHTTPCache/KTVHCDataCacheItemZone.h>
-
-#pragma mark - Common
-
-#import <KTVHTTPCache/KTVHCRange.h>
-#import <KTVHTTPCache/KTVHCCommon.h>

+ 11 - 3
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache.podspec

@@ -1,7 +1,7 @@
 Pod::Spec.new do |s|
   s.name                = "KTVHTTPCache"
-  s.version             = "1.1.7"
-  s.summary             = "A media cache framework from Changba iOS Team."
+  s.version             = "2.0.0"
+  s.summary             = "A powerful media cache framework."
   s.homepage            = "https://github.com/ChangbaDevs/KTVHTTPCache"
   s.license             = { :type => "MIT", :file => "LICENSE" }
   s.author              = { "Single" => "libobjc@gmail.com" }
@@ -9,7 +9,15 @@ Pod::Spec.new do |s|
   s.platform            = :ios, "8.0"
   s.source              = { :git => "https://github.com/ChangbaDevs/KTVHTTPCache.git", :tag => "#{s.version}" }
   s.source_files        = "KTVHTTPCache", "KTVHTTPCache/**/*.{h,m}"
-  s.public_header_files = "KTVHTTPCache/**/*.h"
+  s.public_header_files =
+                          "KTVHTTPCache/KTVHTTPCache.h",
+                          "KTVHTTPCache/Classes/KTVHCCommon/KTVHCRange.h",
+                          "KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataReader.h",
+                          "KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataLoader.h",
+                          "KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataRequest.h",
+                          "KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataResponse.h",
+                          "KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItem.h",
+                          "KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItemZone.h"
   s.frameworks          = "UIKit", "Foundation"
   s.requires_arc        = true
   s.dependency 'KTVCocoaHTTPServer'

+ 0 - 15
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCCommon.h

@@ -1,15 +0,0 @@
-//
-//  KTVHCCommon.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/17.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-#if defined(__cplusplus)
-#define KTVHTTPCACHE_EXTERN extern "C"
-#else
-#define KTVHTTPCACHE_EXTERN extern
-#endif

+ 1 - 2
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCError.h

@@ -8,8 +8,7 @@
 
 #import <Foundation/Foundation.h>
 
-typedef NS_ENUM(NSInteger, KTVHCErrorCode)
-{
+typedef NS_ENUM(NSInteger, KTVHCErrorCode) {
     KTVHCErrorCodeResponseUnavailable  = -192700,
     KTVHCErrorCodeUnsupportContentType = -192701,
     KTVHCErrorCodeNotEnoughDiskSpace   = -192702,

+ 17 - 17
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCError.m

@@ -18,7 +18,7 @@ NSString * const KTVHCErrorUserInfoKeyResponse = @"KTVHCErrorUserInfoKeyResponse
                                  request:(NSURLRequest *)request
                                 response:(NSURLResponse *)response
 {
-    NSMutableDictionary * userInfo = [NSMutableDictionary dictionary];
+    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
     if (URL) {
         [userInfo setObject:URL forKey:KTVHCErrorUserInfoKeyURL];
     }
@@ -28,9 +28,9 @@ NSString * const KTVHCErrorUserInfoKeyResponse = @"KTVHCErrorUserInfoKeyResponse
     if (response) {
         [userInfo setObject:response forKey:KTVHCErrorUserInfoKeyResponse];
     }
-    NSError * error = [NSError errorWithDomain:@"KTVHTTPCache error"
-                                          code:KTVHCErrorCodeResponseUnavailable
-                                      userInfo:userInfo];
+    NSError *error = [NSError errorWithDomain:@"KTVHTTPCache error"
+                                         code:KTVHCErrorCodeResponseUnavailable
+                                     userInfo:userInfo];
     return error;
 }
 
@@ -38,7 +38,7 @@ NSString * const KTVHCErrorUserInfoKeyResponse = @"KTVHCErrorUserInfoKeyResponse
                                   request:(NSURLRequest *)request
                                  response:(NSURLResponse *)response
 {
-    NSMutableDictionary * userInfo = [NSMutableDictionary dictionary];
+    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
     if (URL) {
         [userInfo setObject:URL forKey:KTVHCErrorUserInfoKeyURL];
     }
@@ -48,9 +48,9 @@ NSString * const KTVHCErrorUserInfoKeyResponse = @"KTVHCErrorUserInfoKeyResponse
     if (response) {
         [userInfo setObject:response forKey:KTVHCErrorUserInfoKeyResponse];
     }
-    NSError * error = [NSError errorWithDomain:@"KTVHTTPCache error"
-                                          code:KTVHCErrorCodeUnsupportContentType
-                                      userInfo:userInfo];
+    NSError *error = [NSError errorWithDomain:@"KTVHTTPCache error"
+                                         code:KTVHCErrorCodeUnsupportContentType
+                                     userInfo:userInfo];
     return error;
 }
 
@@ -59,20 +59,20 @@ NSString * const KTVHCErrorUserInfoKeyResponse = @"KTVHCErrorUserInfoKeyResponse
                        totalCacheLength:(long long)totalCacheLength
                          maxCacheLength:(long long)maxCacheLength
 {
-    NSError * error = [NSError errorWithDomain:@"KTVHTTPCache error"
-                                          code:KTVHCErrorCodeNotEnoughDiskSpace
-                                      userInfo:@{@"totlaContentLength" : @(totlaContentLength),
-                                                 @"currentContentLength" : @(currentContentLength),
-                                                 @"totalCacheLength" : @(totalCacheLength),
-                                                 @"maxCacheLength" : @(maxCacheLength)}];
+    NSError *error = [NSError errorWithDomain:@"KTVHTTPCache error"
+                                         code:KTVHCErrorCodeNotEnoughDiskSpace
+                                     userInfo:@{@"totlaContentLength" : @(totlaContentLength),
+                                                @"currentContentLength" : @(currentContentLength),
+                                                @"totalCacheLength" : @(totalCacheLength),
+                                                @"maxCacheLength" : @(maxCacheLength)}];
     return error;
 }
 
 + (NSError *)errorForException:(NSException *)exception
 {
-    NSError * error = [NSError errorWithDomain:@"KTVHTTPCache error"
-                                          code:KTVHCErrorCodeException
-                                      userInfo:exception.userInfo];
+    NSError *error = [NSError errorWithDomain:@"KTVHTTPCache error"
+                                        code:KTVHCErrorCodeException
+                                    userInfo:exception.userInfo];
     return error;
 }
 

+ 11 - 18
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCLog.h

@@ -28,10 +28,7 @@ KTVHCLogEnable(Common,            YES, YES)
  */
 KTVHCLogEnable(HTTPServer,        YES, YES)
 KTVHCLogEnable(HTTPConnection,    YES, YES)
-KTVHCLogEnable(HTTPRequest,       YES, YES)
 KTVHCLogEnable(HTTPResponse,      YES, YES)
-KTVHCLogEnable(HTTPResponsePing,  YES, YES)
-KTVHCLogEnable(HTTPURL,           YES, YES)
 
 /**
  *  Data Storage
@@ -48,7 +45,6 @@ KTVHCLogEnable(DataUnitPool,      YES, YES)
 KTVHCLogEnable(DataUnitQueue,     YES, YES)
 
 KTVHCLogEnable(DataSourceManager, YES, YES)
-KTVHCLogEnable(DataSourceQueue,   YES, YES)
 KTVHCLogEnable(DataFileSource,    YES, YES)
 KTVHCLogEnable(DataNetworkSource, YES, YES)
 
@@ -69,8 +65,8 @@ KTVHCLogEnable(Dealloc,           YES, YES)
 #define KTVHCLogging(target, console_log_enable, record_log_enable, ...)            \
 if (([KTVHCLog log].consoleLogEnable && console_log_enable) || ([KTVHCLog log].recordLogEnable && record_log_enable))       \
 {                                                                                   \
-    NSString * va_args = [NSString stringWithFormat:__VA_ARGS__];                   \
-    NSString * log = [NSString stringWithFormat:@"%@  :   %@", target, va_args];    \
+    NSString *va_args = [NSString stringWithFormat:__VA_ARGS__];                    \
+    NSString *log = [NSString stringWithFormat:@"%@  :   %@", target, va_args];     \
     if ([KTVHCLog log].recordLogEnable && record_log_enable) {                      \
         [[KTVHCLog log] addRecordLog:log];                                          \
     }                                                                               \
@@ -83,17 +79,14 @@ if (([KTVHCLog log].consoleLogEnable && console_log_enable) || ([KTVHCLog log].r
 /**
  *  Common
  */
-#define KTVHCLogCommon(...)                 KTVHCLogging(@"KTVHCCommon           ", KTVHCLogEnableValueConsoleLog(Common),            KTVHCLogEnableValueRecordLog(Common),            ##__VA_ARGS__)
+#define KTVHCLogCommon(...)                 KTVHCLogging(@"KTVHCMacro           ", KTVHCLogEnableValueConsoleLog(Common),            KTVHCLogEnableValueRecordLog(Common),            ##__VA_ARGS__)
 
 /**
  *  HTTP Server
  */
 #define KTVHCLogHTTPServer(...)             KTVHCLogging(@"KTVHCHTTPServer       ", KTVHCLogEnableValueConsoleLog(HTTPServer),        KTVHCLogEnableValueRecordLog(HTTPServer),        ##__VA_ARGS__)
 #define KTVHCLogHTTPConnection(...)         KTVHCLogging(@"KTVHCHTTPConnection   ", KTVHCLogEnableValueConsoleLog(HTTPConnection),    KTVHCLogEnableValueRecordLog(HTTPConnection),    ##__VA_ARGS__)
-#define KTVHCLogHTTPRequest(...)            KTVHCLogging(@"KTVHCHTTPRequest      ", KTVHCLogEnableValueConsoleLog(HTTPRequest),       KTVHCLogEnableValueRecordLog(HTTPRequest),       ##__VA_ARGS__)
 #define KTVHCLogHTTPResponse(...)           KTVHCLogging(@"KTVHCHTTPResponse     ", KTVHCLogEnableValueConsoleLog(HTTPResponse),      KTVHCLogEnableValueRecordLog(HTTPResponse),      ##__VA_ARGS__)
-#define KTVHCLogHTTPResponsePing(...)       KTVHCLogging(@"KTVHCHTTPPingResponse ", KTVHCLogEnableValueConsoleLog(HTTPResponsePing),  KTVHCLogEnableValueRecordLog(HTTPResponsePing),  ##__VA_ARGS__)
-#define KTVHCLogHTTPURL(...)                KTVHCLogging(@"KTVHCHTTPURL          ", KTVHCLogEnableValueConsoleLog(HTTPURL),           KTVHCLogEnableValueRecordLog(HTTPURL),           ##__VA_ARGS__)
 
 /**
  *  Data Storage
@@ -110,7 +103,6 @@ if (([KTVHCLog log].consoleLogEnable && console_log_enable) || ([KTVHCLog log].r
 #define KTVHCLogDataUnitQueue(...)          KTVHCLogging(@"KTVHCDataUnitQueue    ", KTVHCLogEnableValueConsoleLog(DataUnitQueue),     KTVHCLogEnableValueRecordLog(DataUnitQueue),     ##__VA_ARGS__)
 
 #define KTVHCLogDataSourceManager(...)      KTVHCLogging(@"KTVHCDataSourceManager", KTVHCLogEnableValueConsoleLog(DataSourceManager), KTVHCLogEnableValueRecordLog(DataSourceManager), ##__VA_ARGS__)
-#define KTVHCLogDataSourceQueue(...)        KTVHCLogging(@"KTVHCDataSourceQueue  ", KTVHCLogEnableValueConsoleLog(DataSourceQueue),   KTVHCLogEnableValueRecordLog(DataSourceQueue),   ##__VA_ARGS__)
 #define KTVHCLogDataFileSource(...)         KTVHCLogging(@"KTVHCDataFileSource   ", KTVHCLogEnableValueConsoleLog(DataFileSource),    KTVHCLogEnableValueRecordLog(DataFileSource),    ##__VA_ARGS__)
 #define KTVHCLogDataNetworkSource(...)      KTVHCLogging(@"KTVHCDataNetworkSource", KTVHCLogEnableValueConsoleLog(DataNetworkSource), KTVHCLogEnableValueRecordLog(DataNetworkSource), ##__VA_ARGS__)
 
@@ -136,24 +128,25 @@ if (([KTVHCLog log].consoleLogEnable && console_log_enable) || ([KTVHCLog log].r
  *  DEBUG   : default is NO.
  *  RELEASE : default is NO.
  */
-@property (nonatomic, assign) BOOL consoleLogEnable;
+@property (nonatomic) BOOL consoleLogEnable;
 
 /**
  *  DEBUG   : default is NO.
  *  RELEASE : default is NO.
  */
-@property (nonatomic, assign) BOOL recordLogEnable;
+@property (nonatomic) BOOL recordLogEnable;
 
 - (void)addRecordLog:(NSString *)log;
 
-- (NSString *)recordLogFilePath;
-- (void)deleteRecordLog;
+- (NSURL *)recordLogFileURL;
+- (void)deleteRecordLogFile;
 
 /**
  *  Error
  */
-- (NSError *)lastError;
-- (NSArray <NSError *> *)allErrors;
-- (void)addError:(NSError *)error;
+- (void)addError:(NSError *)error forURL:(NSURL *)URL;
+- (NSDictionary<NSURL *, NSError *> *)errors;
+- (NSError *)errorForURL:(NSURL *)URL;
+- (void)cleanErrorForURL:(NSURL *)URL;
 
 @end

+ 48 - 47
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCLog.m

@@ -7,15 +7,15 @@
 //
 
 #import "KTVHCLog.h"
-#import "KTVHCPathTools.h"
+#import "KTVHCPathTool.h"
 
 #import <UIKit/UIKit.h>
 
 @interface KTVHCLog ()
 
-@property (nonatomic, strong) NSLock * lock;
-@property (nonatomic, strong) NSFileHandle * writingHandle;
-@property (nonatomic, strong) NSMutableArray <NSError *> * internalErrors;
+@property (nonatomic, strong) NSLock *lock;
+@property (nonatomic, strong) NSFileHandle *writingHandle;
+@property (nonatomic, strong) NSMutableDictionary<NSURL *, NSError *> *internalErrors;
 
 @end
 
@@ -23,7 +23,7 @@
 
 + (instancetype)log
 {
-    static KTVHCLog * obj = nil;
+    static KTVHCLog *obj = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         obj = [[self alloc] init];
@@ -33,54 +33,49 @@
 
 - (instancetype)init
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         self.consoleLogEnable = NO;
         self.recordLogEnable = NO;
         self.lock = [[NSLock alloc] init];
-        self.internalErrors = [NSMutableArray array];
+        self.internalErrors = [NSMutableDictionary dictionary];
     }
     return self;
 }
 
 - (void)addRecordLog:(NSString *)log
 {
-    if (!self.recordLogEnable)
-    {
+    if (!self.recordLogEnable) {
         return;
     }
-    if (log.length <= 0)
-    {
+    if (log.length <= 0) {
         return;
     }
     [self.lock lock];
-    NSString * string = [NSString stringWithFormat:@"%@  %@\n", [NSDate date], log];
-    NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
-    if (!self.writingHandle)
-    {
-        [KTVHCPathTools deleteFileAtPath:[KTVHCPathTools logPath]];
-        [KTVHCPathTools createFileAtPath:[KTVHCPathTools logPath]];
-        self.writingHandle = [NSFileHandle fileHandleForWritingAtPath:[KTVHCPathTools logPath]];
+    NSString *string = [NSString stringWithFormat:@"%@  %@\n", [NSDate date], log];
+    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
+    if (!self.writingHandle) {
+        [KTVHCPathTool deleteFileAtPath:[KTVHCPathTool logPath]];
+        [KTVHCPathTool createFileAtPath:[KTVHCPathTool logPath]];
+        self.writingHandle = [NSFileHandle fileHandleForWritingAtPath:[KTVHCPathTool logPath]];
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
     }
     [self.writingHandle writeData:data];
     [self.lock unlock];
 }
 
-- (NSString *)recordLogFilePath
+- (NSURL *)recordLogFileURL
 {
-    NSString * path = nil;
+    NSURL *URL = nil;
     [self.lock lock];
-    long long size = [KTVHCPathTools sizeOfItemAtPath:[KTVHCPathTools logPath]];
-    if (size > 0)
-    {
-        path = [KTVHCPathTools logPath];
+    long long size = [KTVHCPathTool sizeAtPath:[KTVHCPathTool logPath]];
+    if (size > 0) {
+        URL = [NSURL fileURLWithPath:[KTVHCPathTool logPath]];
     }
     [self.lock unlock];
-    return path;
+    return URL;
 }
 
-- (void)deleteRecordLog
+- (void)deleteRecordLogFile
 {
     [self.lock lock];
     [self.writingHandle synchronizeFile];
@@ -90,41 +85,47 @@
     [self.lock unlock];
 }
 
-- (NSError *)lastError
+- (void)addError:(NSError *)error forURL:(NSURL *)URL
 {
-    if (self.internalErrors.count > 0)
-    {
-        return self.internalErrors.lastObject;
+    if (!URL || ![error isKindOfClass:[NSError class]]) {
+        return;
     }
-    return nil;
+    [self.lock lock];
+    [self.internalErrors setObject:error forKey:URL];
+    [self.lock unlock];
 }
 
-- (NSArray<NSError *> *)allErrors
+- (NSDictionary<NSURL *,NSError *> *)errors
 {
-    if (self.internalErrors.count > 0)
-    {
-        return [self.internalErrors copy];
-    }
-    return nil;
+    [self.lock lock];
+    NSDictionary<NSURL *,NSError *> *ret = [self.internalErrors copy];
+    [self.lock unlock];
+    return ret;
 }
 
-- (void)addError:(NSError *)error
+- (NSError *)errorForURL:(NSURL *)URL
 {
-    if (error && [error isKindOfClass:[NSError class]])
-    {
-        if (self.internalErrors.count >= 20)
-        {
-            [self.internalErrors removeObjectAtIndex:0];
-        }
-        [self.internalErrors addObject:error];
+    if (!URL) {
+        return nil;
     }
+    [self.lock lock];
+    NSError *ret = [self.internalErrors objectForKey:URL];
+    [self.lock unlock];
+    return ret;
+}
+
+- (void)cleanErrorForURL:(NSURL *)URL
+{
+    [self.lock lock];
+    [self.internalErrors removeObjectForKey:URL];
+    [self.lock unlock];
 }
 
 #pragma mark - UIApplicationWillTerminateNotification
 
 - (void)applicationWillTerminate:(NSNotification *)notification
 {
-    [self deleteRecordLog];
+    [self deleteRecordLogFile];
 }
 
 @end

+ 6 - 5
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCRange.h

@@ -21,14 +21,15 @@ BOOL KTVHCRangeIsInvaild(KTVHCRange range);
 BOOL KTVHCEqualRanges(KTVHCRange range1, KTVHCRange range2);
 long long KTVHCRangeGetLength(KTVHCRange range);
 NSString * KTVHCStringFromRange(KTVHCRange range);
-NSDictionary * KTVHCRangeFillToRequestHeaders(KTVHCRange range, NSDictionary * headers);
-NSDictionary * KTVHCRangeFillToResponseHeaders(KTVHCRange range, NSDictionary * headers, long long totalLength);
+NSDictionary * KTVHCRangeFillToRequestHeaders(KTVHCRange range, NSDictionary *eaders);
+NSDictionary * KTVHCRangeFillToRequestHeadersIfNeeded(KTVHCRange range, NSDictionary *headers);
+NSDictionary * KTVHCRangeFillToResponseHeaders(KTVHCRange range, NSDictionary *headers, long long totalLength);
 
 KTVHCRange KTVHCMakeRange(long long start, long long end);
 KTVHCRange KTVHCRangeZero(void);
 KTVHCRange KTVHCRangeFull(void);
 KTVHCRange KTVHCRangeInvaild(void);
-KTVHCRange KTVHCRangeWithSeparateValue(NSString * value);
-KTVHCRange KTVHCRangeWithRequestHeaderValue(NSString * value);
-KTVHCRange KTVHCRangeWithResponseHeaderValue(NSString * value, long long * totalLength);
+KTVHCRange KTVHCRangeWithSeparateValue(NSString *value);
+KTVHCRange KTVHCRangeWithRequestHeaderValue(NSString *value);
+KTVHCRange KTVHCRangeWithResponseHeaderValue(NSString *value, long long *totalLength);
 KTVHCRange KTVHCRangeWithEnsureLength(KTVHCRange range, long long ensureLength);

+ 38 - 45
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCCommon/KTVHCRange.m

@@ -30,43 +30,48 @@ BOOL KTVHCEqualRanges(KTVHCRange range1, KTVHCRange range2)
 
 long long KTVHCRangeGetLength(KTVHCRange range)
 {
-    if (range.start == KTVHCNotFound || range.end == KTVHCNotFound)
-    {
+    if (range.start == KTVHCNotFound || range.end == KTVHCNotFound) {
         return KTVHCNotFound;
     }
     return range.end - range.start + 1;
 }
 
-NSString * KTVHCStringFromRange(KTVHCRange range)
+NSString *KTVHCStringFromRange(KTVHCRange range)
 {
     return [NSString stringWithFormat:@"Range : {%lld, %lld}", range.start, range.end];
 }
 
-NSString * KTVHCRangeGetHeaderString(KTVHCRange range)
+NSString *KTVHCRangeGetHeaderString(KTVHCRange range)
 {
-    NSMutableString * string = [NSMutableString stringWithFormat:@"bytes="];
-    if (range.start != KTVHCNotFound)
-    {
+    NSMutableString *string = [NSMutableString stringWithFormat:@"bytes="];
+    if (range.start != KTVHCNotFound) {
         [string appendFormat:@"%lld", range.start];
     }
     [string appendFormat:@"-"];
-    if (range.end != KTVHCNotFound)
-    {
+    if (range.end != KTVHCNotFound) {
         [string appendFormat:@"%lld", range.end];
     }
     return [string copy];
 }
 
-NSDictionary * KTVHCRangeFillToRequestHeaders(KTVHCRange range, NSDictionary * headers)
+NSDictionary *KTVHCRangeFillToRequestHeaders(KTVHCRange range, NSDictionary *headers)
 {
-    NSMutableDictionary * ret = [NSMutableDictionary dictionaryWithDictionary:headers];
+    NSMutableDictionary *ret = [NSMutableDictionary dictionaryWithDictionary:headers];
     [ret setObject:KTVHCRangeGetHeaderString(range) forKey:@"Range"];
     return ret;
 }
 
-NSDictionary * KTVHCRangeFillToResponseHeaders(KTVHCRange range, NSDictionary * headers, long long totalLength)
+NSDictionary *KTVHCRangeFillToRequestHeadersIfNeeded(KTVHCRange range, NSDictionary *headers)
 {
-    NSMutableDictionary * ret = [NSMutableDictionary dictionaryWithDictionary:headers];
+    if ([headers objectForKey:@"Range"]) {
+        return headers;
+    }
+    return KTVHCRangeFillToRequestHeaders(range, headers);
+}
+
+NSDictionary *KTVHCRangeFillToResponseHeaders(KTVHCRange range, NSDictionary *headers, long long totalLength)
+{
+    NSMutableDictionary *ret = [NSMutableDictionary dictionaryWithDictionary:headers];
     long long currentLength = KTVHCRangeGetLength(range);
     [ret setObject:[NSString stringWithFormat:@"%lld", currentLength] forKey:@"Content-Length"];
     [ret setObject:[NSString stringWithFormat:@"bytes %lld-%lld/%lld", range.start, range.end, totalLength] forKey:@"Content-Range"];
@@ -94,35 +99,27 @@ KTVHCRange KTVHCRangeInvaild()
     return KTVHCMakeRange(KTVHCNotFound, KTVHCNotFound);
 }
 
-KTVHCRange KTVHCRangeWithSeparateValue(NSString * value)
+KTVHCRange KTVHCRangeWithSeparateValue(NSString *value)
 {
     KTVHCRange range = KTVHCRangeInvaild();
-    if (value.length > 0)
-    {
-        NSArray * components = [value componentsSeparatedByString:@","];
-        if (components.count == 1)
-        {
+    if (value.length > 0) {
+        NSArray *components = [value componentsSeparatedByString:@","];
+        if (components.count == 1) {
             components = [components.firstObject componentsSeparatedByString:@"-"];
-            if (components.count == 2)
-            {
-                NSString * startString = [components objectAtIndex:0];
+            if (components.count == 2) {
+                NSString *startString = [components objectAtIndex:0];
                 NSInteger startValue = [startString integerValue];
-                NSString * endString = [components objectAtIndex:1];
+                NSString *endString = [components objectAtIndex:1];
                 NSInteger endValue = [endString integerValue];
-                if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue))
-                {
+                if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue)) {
                     // The second 500 bytes: "500-999"
                     range.start = startValue;
                     range.end = endValue;
-                }
-                else if (startString.length && (startValue >= 0))
-                {
+                } else if (startString.length && (startValue >= 0)) {
                     // The bytes after 9500 bytes: "9500-"
                     range.start = startValue;
                     range.end = KTVHCNotFound;
-                }
-                else if (endString.length && (endValue > 0))
-                {
+                } else if (endString.length && (endValue > 0)) {
                     // The final 500 bytes: "-500"
                     range.start = KTVHCNotFound;
                     range.end = endValue;
@@ -133,27 +130,24 @@ KTVHCRange KTVHCRangeWithSeparateValue(NSString * value)
     return range;
 }
 
-KTVHCRange KTVHCRangeWithRequestHeaderValue(NSString * value)
+KTVHCRange KTVHCRangeWithRequestHeaderValue(NSString *value)
 {
-    if ([value hasPrefix:@"bytes="])
-    {
-        NSString * rangeString = [value substringFromIndex:6];
+    if ([value hasPrefix:@"bytes="]) {
+        NSString *rangeString = [value substringFromIndex:6];
         return KTVHCRangeWithSeparateValue(rangeString);
     }
     return KTVHCRangeInvaild();
 }
 
-KTVHCRange KTVHCRangeWithResponseHeaderValue(NSString * value, long long * totalLength)
+KTVHCRange KTVHCRangeWithResponseHeaderValue(NSString *value, long long *totalLength)
 {
-    if ([value hasPrefix:@"bytes "])
-    {
+    if ([value hasPrefix:@"bytes "]) {
         value = [value stringByReplacingOccurrencesOfString:@"bytes " withString:@""];
         NSRange range = [value rangeOfString:@"/"];
-        if (range.location != NSNotFound)
-        {
-            NSString * rangeString = [value substringToIndex:range.location];
-            NSString * totalLengthString = [value substringFromIndex:range.location + range.length];
-            * totalLength = totalLengthString.longLongValue;
+        if (range.location != NSNotFound) {
+            NSString *rangeString = [value substringToIndex:range.location];
+            NSString *totalLengthString = [value substringFromIndex:range.location + range.length];
+            *totalLength = totalLengthString.longLongValue;
             return KTVHCRangeWithSeparateValue(rangeString);
         }
     }
@@ -162,8 +156,7 @@ KTVHCRange KTVHCRangeWithResponseHeaderValue(NSString * value, long long * total
 
 KTVHCRange KTVHCRangeWithEnsureLength(KTVHCRange range, long long ensureLength)
 {
-    if (range.end == KTVHCNotFound && ensureLength > 0)
-    {
+    if (range.end == KTVHCNotFound && ensureLength > 0) {
         return KTVHCMakeRange(range.start, ensureLength - 1);
     }
     return range;

+ 6 - 5
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItem.h

@@ -15,10 +15,11 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-@property (nonatomic, copy, readonly) NSURL * URL;
-@property (nonatomic, assign, readonly) long long totalLength;
-@property (nonatomic, assign, readonly) long long cacheLength;
-@property (nonatomic, assign, readonly) long long vaildLength;
-@property (nonatomic, copy, readonly) NSArray <KTVHCDataCacheItemZone *> * zones;
+@property (nonatomic, copy, readonly) NSURL *URL;
+@property (nonatomic, copy, readonly) NSArray<KTVHCDataCacheItemZone *> *zones;
+
+@property (nonatomic, readonly) long long totalLength;
+@property (nonatomic, readonly) long long cacheLength;
+@property (nonatomic, readonly) long long vaildLength;
 
 @end

+ 8 - 22
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItem.m

@@ -7,36 +7,22 @@
 //
 
 #import "KTVHCDataCacheItem.h"
-#import "KTVHCDataPrivate.h"
+#import "KTVHCData+Internal.h"
 
 @implementation KTVHCDataCacheItem
 
-+ (instancetype)itemWithURL:(NSURL *)URL
-                totalLength:(long long)totalLength
-                cacheLength:(long long)cacheLength
-                vaildLength:(long long)vaildLength
-                      zones:(NSArray <KTVHCDataCacheItemZone *> *)zones
-{
-    return [[self alloc] initWithURL:URL
-                         totalLength:totalLength
-                         cacheLength:cacheLength
-                         vaildLength:vaildLength
-                               zones:zones];
-}
-
 - (instancetype)initWithURL:(NSURL *)URL
+                      zones:(NSArray<KTVHCDataCacheItemZone *> *)zones
                 totalLength:(long long)totalLength
                 cacheLength:(long long)cacheLength
                 vaildLength:(long long)vaildLength
-                      zones:(NSArray <KTVHCDataCacheItemZone *> *)zones
 {
-    if (self = [super init])
-    {
-        _URL = URL;
-        _totalLength = totalLength;
-        _cacheLength = cacheLength;
-        _vaildLength = vaildLength;
-        _zones = zones;
+    if (self = [super init]) {
+        self->_URL = [URL copy];
+        self->_zones = [zones copy];
+        self->_totalLength = totalLength;
+        self->_cacheLength = cacheLength;
+        self->_vaildLength = vaildLength;
     }
     return self;
 }

+ 2 - 2
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItemZone.h

@@ -13,7 +13,7 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-@property (nonatomic, assign, readonly) long long offset;
-@property (nonatomic, assign, readonly) long long length;
+@property (nonatomic, readonly) long long offset;
+@property (nonatomic, readonly) long long length;
 
 @end

+ 4 - 10
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataCacheItemZone.m

@@ -7,21 +7,15 @@
 //
 
 #import "KTVHCDataCacheItemZone.h"
-#import "KTVHCDataPrivate.h"
+#import "KTVHCData+Internal.h"
 
 @implementation KTVHCDataCacheItemZone
 
-+ (instancetype)itemZoneWithOffset:(long long)offset length:(long long)length
-{
-    return [[self alloc] initWithOffset:offset length:length];
-}
-
 - (instancetype)initWithOffset:(long long)offset length:(long long)length
 {
-    if (self = [super init])
-    {
-        _offset = offset;
-        _length = length;
+    if (self = [super init]) {
+        self->_offset = offset;
+        self->_length = length;
     }
     return self;
 }

+ 7 - 17
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataFileSource.h

@@ -7,36 +7,26 @@
 //
 
 #import <Foundation/Foundation.h>
-#import "KTVHCDataSourceProtocol.h"
+#import "KTVHCDataSource.h"
 
 @class KTVHCDataFileSource;
 
 @protocol KTVHCDataFileSourceDelegate <NSObject>
 
-- (void)fileSourceDidPrepared:(KTVHCDataFileSource *)fileSource;
-- (void)fileSource:(KTVHCDataFileSource *)fileSource didFailed:(NSError *)error;
+- (void)ktv_fileSourceDidPrepare:(KTVHCDataFileSource *)fileSource;
+- (void)ktv_fileSource:(KTVHCDataFileSource *)fileSource didFailWithError:(NSError *)error;
 
 @end
 
-@interface KTVHCDataFileSource : NSObject <KTVHCDataSourceProtocol>
+@interface KTVHCDataFileSource : NSObject <KTVHCDataSource>
 
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithPath:(NSString *)path range:(KTVHCRange)range readRange:(KTVHCRange)readRange;
+- (instancetype)initWithPath:(NSString *)path range:(KTVHCRange)range readRange:(KTVHCRange)readRange NS_DESIGNATED_INITIALIZER;
 
-@property (nonatomic, copy, readonly) NSString * path;
-@property (nonatomic, assign, readonly) KTVHCRange range;
-@property (nonatomic, assign, readonly) KTVHCRange readRange;
-
-@property (nonatomic, assign, readonly) BOOL didPrepared;
-@property (nonatomic, assign, readonly) BOOL didFinished;
-@property (nonatomic, assign, readonly) BOOL didClosed;
-
-- (void)prepare;
-- (void)close;
-
-- (NSData *)readDataOfLength:(NSUInteger)length;
+@property (nonatomic, copy, readonly) NSString *path;
+@property (nonatomic, readonly) KTVHCRange readRange;
 
 @property (nonatomic, weak, readonly) id<KTVHCDataFileSourceDelegate> delegate;
 @property (nonatomic, strong, readonly) dispatch_queue_t delegateQueue;

+ 42 - 58
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataFileSource.m

@@ -13,23 +13,28 @@
 
 @interface KTVHCDataFileSource () <NSLocking>
 
-@property (nonatomic, strong) NSError * error;
-@property (nonatomic, strong) NSLock * coreLock;
-@property (nonatomic, strong) NSFileHandle * readingHandle;
-@property (nonatomic, assign) long long readedLength;
+@property (nonatomic, strong) NSLock *coreLock;
+@property (nonatomic, strong) NSFileHandle *readingHandle;
 
 @end
 
 @implementation KTVHCDataFileSource
 
+@synthesize error = _error;
+@synthesize range = _range;
+@synthesize closed = _closed;
+@synthesize prepared = _prepared;
+@synthesize finished = _finished;
+@synthesize readedLength = _readedLength;
+
 - (instancetype)initWithPath:(NSString *)path range:(KTVHCRange)range readRange:(KTVHCRange)readRange
 {
     if (self = [super init])
     {
         KTVHCLogAlloc(self);
-        _path = path;
-        _range = range;
-        _readRange = readRange;
+        self->_path = path;
+        self->_range = range;
+        self->_readRange = readRange;
         KTVHCLogDataFileSource(@"%p, Create file source\npath : %@\nrange : %@\nreadRange : %@", self, path, KTVHCStringFromRange(range), KTVHCStringFromRange(readRange));
     }
     return self;
@@ -43,30 +48,25 @@
 - (void)prepare
 {
     [self lock];
-    if (self.didPrepared)
-    {
+    if (self.isPrepared) {
         [self unlock];
         return;
     }
     KTVHCLogDataFileSource(@"%p, Call prepare", self);
     self.readingHandle = [NSFileHandle fileHandleForReadingAtPath:self.path];
-    @try
-    {
+    @try {
         [self.readingHandle seekToFileOffset:self.readRange.start];
-        _didPrepared = YES;
-        if ([self.delegate respondsToSelector:@selector(fileSourceDidPrepared:)])
-        {
+        self->_prepared = YES;
+        if ([self.delegate respondsToSelector:@selector(ktv_fileSourceDidPrepare:)]) {
             KTVHCLogDataFileSource(@"%p, Callback for prepared - Begin", self);
             [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
                 KTVHCLogDataFileSource(@"%p, Callback for prepared - End", self);
-                [self.delegate fileSourceDidPrepared:self];
+                [self.delegate ktv_fileSourceDidPrepare:self];
             }];
         }
-    }
-    @catch (NSException * exception)
-    {
+    } @catch (NSException *exception) {
         KTVHCLogDataFileSource(@"%p, Seek file exception\nname : %@\nreason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
-        NSError * error = [KTVHCError errorForException:exception];
+        NSError *error = [KTVHCError errorForException:exception];
         [self callbackForFailed:error];
     }
     [self unlock];
@@ -75,12 +75,11 @@
 - (void)close
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    _didClosed = YES;
+    self->_closed = YES;
     KTVHCLogDataFileSource(@"%p, Call close", self);
     [self destoryReadingHandle];
     [self unlock];
@@ -89,38 +88,31 @@
 - (NSData *)readDataOfLength:(NSUInteger)length
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return nil;
     }
-    if (self.didFinished)
-    {
+    if (self.isFinished) {
         [self unlock];
         return nil;
     }
-    NSData * data = nil;
-    @try
-    {
+    NSData *data = nil;
+    @try {
         long long readLength = KTVHCRangeGetLength(self.readRange);
         length = (NSUInteger)MIN(readLength - self.readedLength, length);
         data = [self.readingHandle readDataOfLength:length];
-        if (data.length > 0)
-        {
-            self.readedLength += data.length;
+        self->_readedLength += data.length;
+        if (data.length > 0) {
             KTVHCLogDataFileSource(@"%p, Read data : %lld, %lld, %lld", self, (long long)data.length, self.readedLength, readLength);
         }
-        if (self.readedLength >= readLength)
-        {
+        if (self.readedLength >= readLength) {
             KTVHCLogDataFileSource(@"%p, Read data did finished", self);
             [self destoryReadingHandle];
-            _didFinished = YES;
+            self->_finished = YES;
         }
-    }
-    @catch (NSException * exception)
-    {
+    } @catch (NSException *exception) {
         KTVHCLogDataFileSource(@"%p, Read exception\nname : %@\nreason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
-        NSError * error = [KTVHCError errorForException:exception];
+        NSError *error = [KTVHCError errorForException:exception];
         [self callbackForFailed:error];
     }
     [self unlock];
@@ -129,14 +121,10 @@
 
 - (void)destoryReadingHandle
 {
-    if (self.readingHandle)
-    {
-        @try
-        {
+    if (self.readingHandle) {
+        @try {
             [self.readingHandle closeFile];
-        }
-        @catch (NSException * exception)
-        {
+        } @catch (NSException *exception) {
             KTVHCLogDataFileSource(@"%p, Close exception\nname : %@\nreason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
         }
         self.readingHandle = nil;
@@ -145,35 +133,31 @@
 
 - (void)callbackForFailed:(NSError *)error
 {
-    if (!error)
-    {
+    if (!error) {
         return;
     }
-    if (self.error)
-    {
+    if (self.error) {
         return;
     }
-    self.error = error;
-    if ([self.delegate respondsToSelector:@selector(fileSource:didFailed:)])
-    {
+    self->_error = error;
+    if ([self.delegate respondsToSelector:@selector(ktv_fileSource:didFailWithError:)]) {
         KTVHCLogDataFileSource(@"%p, Callback for prepared - Begin", self);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataFileSource(@"%p, Callback for prepared - End", self);
-            [self.delegate fileSource:self didFailed:self.error];
+            [self.delegate ktv_fileSource:self didFailWithError:self.error];
         }];
     }
 }
 
 - (void)setDelegate:(id <KTVHCDataFileSourceDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue
 {
-    _delegate = delegate;
-    _delegateQueue = delegateQueue;
+    self->_delegate = delegate;
+    self->_delegateQueue = delegateQueue;
 }
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSLock alloc] init];
     }
     [self.coreLock lock];

+ 10 - 12
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataLoader.h

@@ -14,9 +14,9 @@
 
 @protocol KTVHCDataLoaderDelegate <NSObject>
 
-- (void)loaderDidFinished:(KTVHCDataLoader *)loader;
-- (void)loader:(KTVHCDataLoader *)loader didFailed:(NSError *)error;
-- (void)loader:(KTVHCDataLoader *)loader didChangeProgress:(double)progress;
+- (void)ktv_loaderDidFinish:(KTVHCDataLoader *)loader;
+- (void)ktv_loader:(KTVHCDataLoader *)loader didFailWithError:(NSError *)error;
+- (void)ktv_loader:(KTVHCDataLoader *)loader didChangeProgress:(double)progress;
 
 @end
 
@@ -25,21 +25,19 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-+ (instancetype)loaderWithRequest:(KTVHCDataRequest *)request;
-
 @property (nonatomic, weak) id <KTVHCDataLoaderDelegate> delegate;
-
 @property (nonatomic, strong) id object;
 
-@property (nonatomic, strong, readonly) KTVHCDataRequest * request;
-@property (nonatomic, strong, readonly) KTVHCDataResponse * response;
+@property (nonatomic, strong, readonly) KTVHCDataRequest *request;
+@property (nonatomic, strong, readonly) KTVHCDataResponse *response;
 
-@property (nonatomic, strong, readonly) NSError * error;
+@property (nonatomic, copy, readonly) NSError *error;
 
-@property (nonatomic, assign, readonly) BOOL didClosed;
-@property (nonatomic, assign, readonly) BOOL didFinished;
+@property (nonatomic, readonly, getter=isFinished) BOOL finished;
+@property (nonatomic, readonly, getter=isClosed) BOOL closed;
 
-@property (nonatomic, assign, readonly) double progress;
+@property (nonatomic, readonly) long long loadedLength;
+@property (nonatomic, readonly) double progress;
 
 - (void)prepare;
 - (void)close;

+ 31 - 43
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataLoader.m

@@ -7,29 +7,22 @@
 //
 
 #import "KTVHCDataLoader.h"
-#import "KTVHCDataReader.h"
-#import "KTVHCDataResponse.h"
+#import "KTVHCData+Internal.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCDataLoader () <KTVHCDataReaderDelegate>
 
-@property (nonatomic, strong) KTVHCDataReader * reader;
+@property (nonatomic, strong) KTVHCDataReader *reader;
 
 @end
 
 @implementation KTVHCDataLoader
 
-+ (instancetype)loaderWithRequest:(KTVHCDataRequest *)request
-{
-    return [[self alloc] initWithRequest:request];
-}
-
 - (instancetype)initWithRequest:(KTVHCDataRequest *)request
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
-        self.reader = [KTVHCDataReader readerWithRequest:request];
+        self.reader = [[KTVHCDataReader alloc] initWithRequest:request];
         self.reader.delegate = self;
         KTVHCLogDataLoader(@"%p, Create loader\norignalRequest : %@\nreader : %@", self, request, self.reader);
     }
@@ -70,65 +63,60 @@
     return self.reader.error;
 }
 
-- (BOOL)didClosed
+- (BOOL)isFinished
 {
-    return self.reader.didClosed;
+    return self.reader.isFinished;
 }
 
-- (BOOL)didFinished
+- (BOOL)isClosed
 {
-    return self.reader.didFinished;
+    return self.reader.isClosed;
 }
 
 #pragma mark - KTVHCDataReaderDelegate
 
-- (void)readerDidPrepared:(KTVHCDataReader *)reader
+- (void)ktv_readerDidPrepare:(KTVHCDataReader *)reader
 {
     [self readData];
 }
 
-- (void)readerHasAvailableData:(KTVHCDataReader *)reader
+- (void)ktv_readerHasAvailableData:(KTVHCDataReader *)reader
 {
     [self readData];
 }
 
-- (void)reader:(KTVHCDataReader *)reader didFailed:(NSError *)error
+- (void)ktv_reader:(KTVHCDataReader *)reader didFailWithError:(NSError *)error
 {
     KTVHCLogDataLoader(@"%p, Callback for failed", self);
-    if ([self.delegate respondsToSelector:@selector(loader:didFailed:)])
-    {
-        [self.delegate loader:self didFailed:error];
+    if ([self.delegate respondsToSelector:@selector(ktv_loader:didFailWithError:)]) {
+        [self.delegate ktv_loader:self didFailWithError:error];
     }
 }
 
 - (void)readData
 {
-    while (YES)
-    {
-        @autoreleasepool
-        {
-            NSData * data = [self.reader readDataOfLength:1024 * 1024 * 1];
-            if (self.reader.didFinished)
-            {
-                _progress = 1.0f;
-                if ([self.delegate respondsToSelector:@selector(loader:didChangeProgress:)])
-                {
-                    [self.delegate loader:self didChangeProgress:_progress];
+    while (YES) {
+        @autoreleasepool {
+            NSData *data = [self.reader readDataOfLength:1024 * 1024 * 1];
+            if (self.reader.isFinished) {
+                self->_loadedLength = self.reader.readedLength;
+                self->_progress = 1.0f;
+                if ([self.delegate respondsToSelector:@selector(ktv_loader:didChangeProgress:)]) {
+                    [self.delegate ktv_loader:self didChangeProgress:self.progress];
                 }
                 KTVHCLogDataLoader(@"%p, Callback finished", self);
-                if ([self.delegate respondsToSelector:@selector(loaderDidFinished:)])
-                {
-                    [self.delegate loaderDidFinished:self];
+                if ([self.delegate respondsToSelector:@selector(ktv_loaderDidFinish:)]) {
+                    [self.delegate ktv_loaderDidFinish:self];
                 }
-            }
-            else if (data)
-            {
-                _progress = (double)self.reader.readOffset / (double)self.response.currentLength;
-                if ([self.delegate respondsToSelector:@selector(loader:didChangeProgress:)])
-                {
-                    [self.delegate loader:self didChangeProgress:_progress];
+            } else if (data) {
+                self->_loadedLength = self.reader.readedLength;
+                if (self.response.contentLength > 0) {
+                    self->_progress = (double)self.reader.readedLength / (double)self.response.contentLength;
+                }
+                if ([self.delegate respondsToSelector:@selector(ktv_loader:didChangeProgress:)]) {
+                    [self.delegate ktv_loader:self didChangeProgress:self.progress];
                 }
-                KTVHCLogDataLoader(@"%p, read data progress %f", self, _progress);
+                KTVHCLogDataLoader(@"%p, read data progress %f", self, self.progress);
                 continue;
             }
             KTVHCLogDataLoader(@"%p, read data break", self);

+ 9 - 19
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataNetworkSource.h

@@ -7,7 +7,7 @@
 //
 
 #import <Foundation/Foundation.h>
-#import "KTVHCDataSourceProtocol.h"
+#import "KTVHCDataSource.h"
 #import "KTVHCDataRequest.h"
 #import "KTVHCDataResponse.h"
 
@@ -15,32 +15,22 @@
 
 @protocol KTVHCDataNetworkSourceDelegate <NSObject>
 
-- (void)networkSourceDidPrepared:(KTVHCDataNetworkSource *)networkSource;
-- (void)networkSourceHasAvailableData:(KTVHCDataNetworkSource *)networkSource;
-- (void)networkSourceDidFinishedDownload:(KTVHCDataNetworkSource *)networkSource;
-- (void)networkSource:(KTVHCDataNetworkSource *)networkSource didFailed:(NSError *)error;
+- (void)ktv_networkSourceDidPrepare:(KTVHCDataNetworkSource *)networkSource;
+- (void)ktv_networkSourceHasAvailableData:(KTVHCDataNetworkSource *)networkSource;
+- (void)ktv_networkSourceDidFinisheDownload:(KTVHCDataNetworkSource *)networkSource;
+- (void)ktv_networkSource:(KTVHCDataNetworkSource *)networkSource didFailWithError:(NSError *)error;
 
 @end
 
-@interface KTVHCDataNetworkSource : NSObject <KTVHCDataSourceProtocol>
+@interface KTVHCDataNetworkSource : NSObject <KTVHCDataSource>
 
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithRequest:(KTVHCDataRequest *)reqeust;
+- (instancetype)initWithRequest:(KTVHCDataRequest *)reqeust NS_DESIGNATED_INITIALIZER;
 
-@property (nonatomic, strong, readonly) KTVHCDataRequest * request;
-@property (nonatomic, strong, readonly) KTVHCDataResponse * response;
-@property (nonatomic, assign, readonly) KTVHCRange range;
-
-@property (nonatomic, assign, readonly) BOOL didPrepared;
-@property (nonatomic, assign, readonly) BOOL didFinished;
-@property (nonatomic, assign, readonly) BOOL didClosed;
-
-- (void)prepare;
-- (void)close;
-
-- (NSData *)readDataOfLength:(NSUInteger)length;
+@property (nonatomic, strong, readonly) KTVHCDataRequest *request;
+@property (nonatomic, strong, readonly) KTVHCDataResponse *response;
 
 @property (nonatomic, weak, readonly) id<KTVHCDataNetworkSourceDelegate> delegate;
 @property (nonatomic, strong, readonly) dispatch_queue_t delegateQueue;

+ 87 - 131
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataNetworkSource.m

@@ -9,37 +9,42 @@
 #import "KTVHCDataNetworkSource.h"
 #import "KTVHCDataUnitPool.h"
 #import "KTVHCDataCallback.h"
-#import "KTVHCPathTools.h"
+#import "KTVHCPathTool.h"
 #import "KTVHCDownload.h"
 #import "KTVHCError.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCDataNetworkSource () <NSLocking, KTVHCDownloadDelegate>
 
-@property (nonatomic, strong) NSError * error;
-@property (nonatomic, strong) NSLock * coreLock;
-@property (nonatomic, assign) long long downloadLength;
-@property (nonatomic, assign) long long downloadReadedLength;
-@property (nonatomic, assign) BOOL downloadDidCallComplete;
-@property (nonatomic, assign) BOOL needCallHasAvailableData;
-@property (nonatomic, assign) BOOL didCalledPrepare;
+@property (nonatomic, strong) NSLock *coreLock;
+@property (nonatomic, strong) NSFileHandle *readingHandle;
+@property (nonatomic, strong) NSFileHandle *writingHandle;
+@property (nonatomic, strong) KTVHCDataUnitItem *unitItem;
+@property (nonatomic, strong) NSURLSessionTask *downlaodTask;
 
-@property (nonatomic, strong) KTVHCDataUnitItem * unitItem;
-@property (nonatomic, strong) NSFileHandle * readingHandle;
-@property (nonatomic, strong) NSFileHandle * writingHandle;
-@property (nonatomic, assign) NSURLSessionTask * downlaodTask;
+@property (nonatomic) long long downloadLength;
+@property (nonatomic) BOOL downloadCalledComplete;
+@property (nonatomic) BOOL callHasAvailableData;
+@property (nonatomic) BOOL calledPrepare;
 
 @end
 
 @implementation KTVHCDataNetworkSource
 
+@synthesize error = _error;
+@synthesize range = _range;
+@synthesize closed = _closed;
+@synthesize prepared = _prepared;
+@synthesize finished = _finished;
+@synthesize readedLength = _readedLength;
+
 - (instancetype)initWithRequest:(KTVHCDataRequest *)reqeust
 {
     if (self = [super init])
     {
         KTVHCLogAlloc(self);
-        _request = reqeust;
-        _range = reqeust.range;
+        self->_request = reqeust;
+        self->_range = reqeust.range;
         KTVHCLogDataNetworkSource(@"%p, Create network source\nrequest : %@\nrange : %@", self, self.request, KTVHCStringFromRange(self.range));
     }
     return self;
@@ -48,23 +53,21 @@
 - (void)dealloc
 {
     KTVHCLogDealloc(self);
-    KTVHCLogDataNetworkSource(@"%p, Destory network source\nError : %@\ndownloadLength : %lld\nreadedLength : %lld", self, self.error, self.downloadLength, self.downloadReadedLength);
+    KTVHCLogDataNetworkSource(@"%p, Destory network source\nError : %@\ndownloadLength : %lld\nreadedLength : %lld", self, self.error, self.downloadLength, self.readedLength);
 }
 
 - (void)prepare
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    if (self.didCalledPrepare)
-    {
+    if (self.calledPrepare) {
         [self unlock];
         return;
     }
-    _didCalledPrepare = YES;
+    self->_calledPrepare = YES;
     KTVHCLogDataNetworkSource(@"%p, Call prepare", self);
     self.downlaodTask = [[KTVHCDownload download] downloadWithRequest:self.request delegate:self];
     [self unlock];
@@ -73,15 +76,13 @@
 - (void)close
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    _didClosed = YES;
+    self->_closed = YES;
     KTVHCLogDataNetworkSource(@"%p, Call close", self);
-    if (!self.downloadDidCallComplete)
-    {
+    if (!self.downloadCalledComplete) {
         KTVHCLogDataNetworkSource(@"%p, Cancel download task", self);
         [self.downlaodTask cancel];
         self.downlaodTask = nil;
@@ -94,43 +95,34 @@
 - (NSData *)readDataOfLength:(NSUInteger)length
 {
     [self lock];
-    if (self.didClosed || self.didFinished || self.error)
-    {
+    if (self.isClosed || self.isFinished || self.error) {
         [self unlock];
         return nil;
     }
-    if (self.downloadReadedLength >= self.downloadLength)
-    {
-        if (self.downloadDidCallComplete)
-        {
-            KTVHCLogDataNetworkSource(@"%p, Read data failed\ndownloadLength : %lld\nreadedLength : %lld", self, self.downloadReadedLength, self.downloadLength);
+    if (self.readedLength >= self.downloadLength) {
+        if (self.downloadCalledComplete) {
+            KTVHCLogDataNetworkSource(@"%p, Read data failed\ndownloadLength : %lld\nreadedLength : %lld", self, self.readedLength, self.downloadLength);
             [self destoryReadingHandle];
-        }
-        else
-        {
+        } else {
             KTVHCLogDataNetworkSource(@"%p, Read data wait callback", self);
-            self.needCallHasAvailableData = YES;
+            self.callHasAvailableData = YES;
         }
         [self unlock];
         return nil;
     }
-    NSData * data = nil;
-    @try
-    {
-        data = [self.readingHandle readDataOfLength:(NSUInteger)MIN(self.downloadLength - self.downloadReadedLength, length)];
-        self.downloadReadedLength += data.length;
-        KTVHCLogDataNetworkSource(@"%p, Read data\nLength : %lld\ndownloadLength : %lld\nreadedLength : %lld", self, (long long)data.length, self.downloadReadedLength, self.downloadLength);
-        if (self.downloadReadedLength >= KTVHCRangeGetLength(self.response.range))
-        {
-            _didFinished = YES;
+    NSData *data = nil;
+    @try {
+        data = [self.readingHandle readDataOfLength:(NSUInteger)MIN(self.downloadLength - self.readedLength, length)];
+        self->_readedLength += data.length;
+        KTVHCLogDataNetworkSource(@"%p, Read data\nLength : %lld\ndownloadLength : %lld\nreadedLength : %lld", self, (long long)data.length, self.readedLength, self.downloadLength);
+        if (self.readedLength >= KTVHCRangeGetLength(self.response.contentRange)) {
+            self->_finished = YES;
             KTVHCLogDataNetworkSource(@"%p, Read data did finished", self);
             [self destoryReadingHandle];
         }
-    }
-    @catch (NSException * exception)
-    {
+    } @catch (NSException *exception) {
         KTVHCLogDataFileSource(@"%p, Read exception\nname : %@\nreason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
-        NSError * error = [KTVHCError errorForException:exception];
+        NSError *error = [KTVHCError errorForException:exception];
         [self callbackForFailed:error];
     }
     [self unlock];
@@ -139,63 +131,49 @@
 
 - (void)setDelegate:(id <KTVHCDataNetworkSourceDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue
 {
-    _delegate = delegate;
-    _delegateQueue = delegateQueue;
+    self->_delegate = delegate;
+    self->_delegateQueue = delegateQueue;
 }
 
-- (void)download:(KTVHCDownload *)download didCompleteWithError:(NSError *)error
+- (void)ktv_download:(KTVHCDownload *)download didCompleteWithError:(NSError *)error
 {
     [self lock];
-    self.downloadDidCallComplete = YES;
+    self.downloadCalledComplete = YES;
     [self destoryWritingHandle];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         KTVHCLogDataNetworkSource(@"%p, Complete but did closed\nError : %@", self, error);
-    }
-    else if (self.error)
-    {
+    } else if (self.error) {
         KTVHCLogDataNetworkSource(@"%p, Complete but did failed\nself.error : %@\nerror : %@", self, self.error, error);
-    }
-    else if (error)
-    {
-        if (error.code != NSURLErrorCancelled)
-        {
+    } else if (error) {
+        if (error.code != NSURLErrorCancelled) {
             [self callbackForFailed:error];
-        }
-        else
-        {
+        } else {
             KTVHCLogDataNetworkSource(@"%p, Complete with cancel\nError : %@", self, error);
         }
-    }
-    else if (self.downloadLength >= KTVHCRangeGetLength(self.response.range))
-    {
+    } else if (self.downloadLength >= KTVHCRangeGetLength(self.response.contentRange)) {
         KTVHCLogDataNetworkSource(@"%p, Complete and finisehed", self);
-        if ([self.delegate respondsToSelector:@selector(networkSourceDidFinishedDownload:)])
-        {
+        if ([self.delegate respondsToSelector:@selector(ktv_networkSourceDidFinisheDownload:)]) {
             [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
-                [self.delegate networkSourceDidFinishedDownload:self];
+                [self.delegate ktv_networkSourceDidFinisheDownload:self];
             }];
         }
-    }
-    else
-    {
+    } else {
         KTVHCLogDataNetworkSource(@"%p, Complete but not finisehed\ndownloadLength : %lld", self, self.downloadLength);
     }
     [self unlock];
 }
 
-- (void)download:(KTVHCDownload *)download didReceiveResponse:(KTVHCDataResponse *)response
+- (void)ktv_download:(KTVHCDownload *)download didReceiveResponse:(KTVHCDataResponse *)response
 {
     [self lock];
-    if (self.didClosed || self.error)
-    {
+    if (self.isClosed || self.error) {
         [self unlock];
         return;
     }
-    _response = response;
-    NSString * path = [KTVHCPathTools unitItemPathWithURL:self.request.URL offset:self.request.range.start];
+    self->_response = response;
+    NSString *path = [KTVHCPathTool filePathWithURL:self.request.URL offset:self.request.range.start];
     self.unitItem = [[KTVHCDataUnitItem alloc] initWithPath:path offset:self.request.range.start];
-    KTVHCDataUnit * unit = [[KTVHCDataUnitPool pool] unitWithURL:self.request.URL];
+    KTVHCDataUnit *unit = [[KTVHCDataUnitPool pool] unitWithURL:self.request.URL];
     [unit insertUnitItem:self.unitItem];
     KTVHCLogDataNetworkSource(@"%p, Receive response\nResponse : %@\nUnit : %@\nUnitItem : %@", self, response, unit, self.unitItem);
     [unit workingRelease];
@@ -205,29 +183,24 @@
     [self unlock];
 }
 
-- (void)download:(KTVHCDownload *)download didReceiveData:(NSData *)data
+- (void)ktv_download:(KTVHCDownload *)download didReceiveData:(NSData *)data
 {
     [self lock];
-    if (self.didClosed || self.error)
-    {
+    if (self.isClosed || self.error) {
         [self unlock];
         return;
     }
-    @try
-    {
+    @try {
         [self.writingHandle writeData:data];
         self.downloadLength += data.length;
-        [self.unitItem setLength:self.downloadLength];
+        [self.unitItem updateLength:self.downloadLength];
         KTVHCLogDataNetworkSource(@"%p, Receive data : %lld, %lld, %lld", self, (long long)data.length, self.downloadLength, self.unitItem.length);
         [self callbackForHasAvailableData];
-    }
-    @catch (NSException * exception)
-    {
-        NSError * error = [KTVHCError errorForException:exception];
+    } @catch (NSException *exception) {
+        NSError *error = [KTVHCError errorForException:exception];
         KTVHCLogDataNetworkSource(@"%p, write exception\nError : %@", self, error);
         [self callbackForFailed:error];
-        if (!self.downloadDidCallComplete)
-        {
+        if (!self.downloadCalledComplete) {
             KTVHCLogDataNetworkSource(@"%p, Cancel download task when write exception", self);
             [self.downlaodTask cancel];
             self.downlaodTask = nil;
@@ -238,14 +211,10 @@
 
 - (void)destoryReadingHandle
 {
-    if (self.readingHandle)
-    {
-        @try
-        {
+    if (self.readingHandle) {
+        @try {
             [self.readingHandle closeFile];
-        }
-        @catch (NSException * exception)
-        {
+        } @catch (NSException *exception) {
             KTVHCLogDataFileSource(@"%p, Close reading handle exception\nname : %@\nreason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
         }
         self.readingHandle = nil;
@@ -254,15 +223,11 @@
 
 - (void)destoryWritingHandle
 {
-    if (self.writingHandle)
-    {
-        @try
-        {
+    if (self.writingHandle) {
+        @try {
             [self.writingHandle synchronizeFile];
             [self.writingHandle closeFile];
-        }
-        @catch (NSException * exception)
-        {
+        } @catch (NSException *exception) {
             KTVHCLogDataFileSource(@"%p, Close writing handle exception\nname : %@\nreason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
         }
         self.writingHandle = nil;
@@ -271,66 +236,57 @@
 
 - (void)callbackForPrepared
 {
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         return;
     }
-    if (self.didPrepared)
-    {
+    if (self.isPrepared) {
         return;
     }
-    _didPrepared = YES;
-    if ([self.delegate respondsToSelector:@selector(networkSourceDidPrepared:)])
-    {
+    self->_prepared = YES;
+    if ([self.delegate respondsToSelector:@selector(ktv_networkSourceDidPrepare:)]) {
         KTVHCLogDataNetworkSource(@"%p, Callback for prepared - Begin", self);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataNetworkSource(@"%p, Callback for prepared - End", self);
-            [self.delegate networkSourceDidPrepared:self];
+            [self.delegate ktv_networkSourceDidPrepare:self];
         }];
     }
 }
 
 - (void)callbackForHasAvailableData
 {
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         return;
     }
-    if (!self.needCallHasAvailableData)
-    {
+    if (!self.callHasAvailableData) {
         return;
     }
-    self.needCallHasAvailableData = NO;
-    if ([self.delegate respondsToSelector:@selector(networkSourceHasAvailableData:)])
-    {
+    self.callHasAvailableData = NO;
+    if ([self.delegate respondsToSelector:@selector(ktv_networkSourceHasAvailableData:)]) {
         KTVHCLogDataNetworkSource(@"%p, Callback for has available data - Begin", self);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataNetworkSource(@"%p, Callback for has available data - End", self);
-            [self.delegate networkSourceHasAvailableData:self];
+            [self.delegate ktv_networkSourceHasAvailableData:self];
         }];
     }
 }
 
 - (void)callbackForFailed:(NSError *)error
 {
-    if (self.didClosed || !error || self.error)
-    {
+    if (self.isClosed || !error || self.error) {
         return;
     }
-    self.error = error;
+    self->_error = error;
     KTVHCLogDataNetworkSource(@"%p, Callback for failed\nError : %@", self, self.error);
-    if ([self.delegate respondsToSelector:@selector(networkSource:didFailed:)])
-    {
+    if ([self.delegate respondsToSelector:@selector(ktv_networkSource:didFailWithError:)]) {
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
-            [self.delegate networkSource:self didFailed:self.error];
+            [self.delegate ktv_networkSource:self didFailWithError:self.error];
         }];
     }
 }
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSLock alloc] init];
     }
     [self.coreLock lock];

+ 0 - 27
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataPrivate.h

@@ -1,27 +0,0 @@
-//
-//  KTVHCDataReaderPrivate.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/11.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "KTVHCDataCacheItem.h"
-#import "KTVHCDataCacheItemZone.h"
-
-@interface KTVHCDataCacheItem (Private)
-
-+ (instancetype)itemWithURL:(NSURL *)URL
-                totalLength:(long long)totalLength
-                cacheLength:(long long)cacheLength
-                vaildLength:(long long)vaildLength
-                      zones:(NSArray <KTVHCDataCacheItemZone *> *)zones;
-
-@end
-
-@interface KTVHCDataCacheItemZone (Private)
-
-+ (instancetype)itemZoneWithOffset:(long long)offset length:(long long)length;
-
-@end

+ 11 - 13
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataReader.h

@@ -14,9 +14,9 @@
 
 @protocol KTVHCDataReaderDelegate <NSObject>
 
-- (void)readerDidPrepared:(KTVHCDataReader *)reader;
-- (void)readerHasAvailableData:(KTVHCDataReader *)reader;
-- (void)reader:(KTVHCDataReader *)reader didFailed:(NSError *)error;
+- (void)ktv_readerDidPrepare:(KTVHCDataReader *)reader;
+- (void)ktv_readerHasAvailableData:(KTVHCDataReader *)reader;
+- (void)ktv_reader:(KTVHCDataReader *)reader didFailWithError:(NSError *)error;
 
 @end
 
@@ -25,22 +25,20 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-+ (instancetype)readerWithRequest:(KTVHCDataRequest *)request;
-
 @property (nonatomic, weak) id <KTVHCDataReaderDelegate> delegate;
-
 @property (nonatomic, strong) id object;
 
-@property (nonatomic, strong, readonly) KTVHCDataRequest * request;
-@property (nonatomic, strong, readonly) KTVHCDataResponse * response;
+@property (nonatomic, strong, readonly) KTVHCDataRequest *request;
+@property (nonatomic, strong, readonly) KTVHCDataResponse *response;
 
-@property (nonatomic, strong, readonly) NSError * error;
+@property (nonatomic, copy, readonly) NSError *error;
 
-@property (nonatomic, assign, readonly) BOOL didClosed;
-@property (nonatomic, assign, readonly) BOOL didPrepared;
-@property (nonatomic, assign, readonly) BOOL didFinished;
+@property (nonatomic, readonly, getter=isPrepared) BOOL prepared;
+@property (nonatomic, readonly, getter=isFinished) BOOL finished;
+@property (nonatomic, readonly, getter=isClosed) BOOL closed;
 
-@property (nonatomic, assign, readonly) long long readOffset;
+@property (nonatomic, readonly) long long readedLength;
+@property (nonatomic, readonly) double progress;
 
 - (void)prepare;
 - (void)close;

+ 68 - 100
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataReader.m

@@ -7,6 +7,7 @@
 //
 
 #import "KTVHCDataReader.h"
+#import "KTVHCData+Internal.h"
 #import "KTVHCDataSourceManager.h"
 #import "KTVHCDataUnitPool.h"
 #import "KTVHCDataCallback.h"
@@ -14,31 +15,23 @@
 
 @interface KTVHCDataReader () <KTVHCDataSourceManagerDelegate>
 
-@property (nonatomic, strong) NSRecursiveLock * coreLock;
+@property (nonatomic, strong) KTVHCDataUnit *unit;
+@property (nonatomic, strong) NSRecursiveLock *coreLock;
 @property (nonatomic, strong) dispatch_queue_t delegateQueue;
 @property (nonatomic, strong) dispatch_queue_t internalDelegateQueue;
-@property (nonatomic, assign) BOOL didCalledPrepare;
-
-@property (nonatomic, strong) KTVHCDataUnit * unit;
-@property (nonatomic, strong) KTVHCDataSourceManager * sourceManager;
+@property (nonatomic, strong) KTVHCDataSourceManager *sourceManager;
+@property (nonatomic) BOOL calledPrepare;
 
 @end
 
 @implementation KTVHCDataReader
 
-+ (instancetype)readerWithRequest:(KTVHCDataRequest *)request
-{
-    return [[self alloc] initWithRequest:request];
-}
-
 - (instancetype)initWithRequest:(KTVHCDataRequest *)request
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
         self.unit = [[KTVHCDataUnitPool pool] unitWithURL:request.URL];
-        _request = [request requestWithTotalLength:self.unit.totalLength];
-        [self.unit updateRequestHeaders:self.request.headers];
+        self->_request = [request newRequestWithTotalLength:self.unit.totalLength];
         self.delegateQueue = dispatch_queue_create("KTVHCDataReader_delegateQueue", DISPATCH_QUEUE_SERIAL);
         self.internalDelegateQueue = dispatch_queue_create("KTVHCDataReader_internalDelegateQueue", DISPATCH_QUEUE_SERIAL);
         KTVHCLogDataReader(@"%p, Create reader\norignalRequest : %@\nfinalRequest : %@\nUnit : %@", self, request, self.request, self.unit);
@@ -50,23 +43,21 @@
 {
     KTVHCLogDealloc(self);
     [self close];
-    KTVHCLogDataReader(@"%p, Destory reader\nError : %@\nreadOffset : %lld", self, self.error, self.readOffset);
+    KTVHCLogDataReader(@"%p, Destory reader\nError : %@\nreadOffset : %lld", self, self.error, self.readedLength);
 }
 
 - (void)prepare
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    if (self.didCalledPrepare)
-    {
+    if (self.calledPrepare) {
         [self unlock];
         return;
     }
-    _didCalledPrepare = YES;
+    self->_calledPrepare = YES;
     KTVHCLogDataReader(@"%p, Call prepare", self);
     [self prepareSourceManager];
     [self unlock];
@@ -75,12 +66,11 @@
 - (void)close
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    _didClosed = YES;
+    self->_closed = YES;
     KTVHCLogDataReader(@"%p, Call close", self);
     [self.sourceManager close];
     [self.unit workingRelease];
@@ -91,28 +81,29 @@
 - (NSData *)readDataOfLength:(NSUInteger)length
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return nil;
     }
-    if (self.didFinished)
-    {
+    if (self.isFinished) {
         [self unlock];
         return nil;
     }
-    if (self.error)
-    {
+    if (self.error) {
         [self unlock];
         return nil;
     }
-    NSData * data = [self.sourceManager readDataOfLength:length];;
-    _readOffset += data.length;
+    NSData *data = [self.sourceManager readDataOfLength:length];
+    if (data.length > 0) {
+        self->_readedLength += data.length;
+        if (self.response.contentLength > 0) {
+            self->_progress = (double)self.readedLength / (double)self.response.contentLength;
+        }
+    }
     KTVHCLogDataReader(@"%p, Read data : %lld", self, (long long)data.length);
-    if (self.sourceManager.didFinished)
-    {
+    if (self.sourceManager.isFinished) {
         KTVHCLogDataReader(@"%p, Read data did finished", self);
-        _didFinished = YES;
+        self->_finished = YES;
         [self close];
     }
     [self unlock];
@@ -121,35 +112,30 @@
 
 - (void)prepareSourceManager
 {
-    self.sourceManager = [[KTVHCDataSourceManager alloc] initWithDelegate:self delegateQueue:self.internalDelegateQueue];
-    NSMutableArray <KTVHCDataFileSource *> * fileSources = [NSMutableArray array];
-    NSMutableArray <KTVHCDataNetworkSource *> * networkSources = [NSMutableArray array];
+    NSMutableArray<KTVHCDataFileSource *> *fileSources = [NSMutableArray array];
+    NSMutableArray<KTVHCDataNetworkSource *> *networkSources = [NSMutableArray array];
     long long min = self.request.range.start;
     long long max = self.request.range.end;
-    NSArray * unitItems = self.unit.unitItems;
-    for (KTVHCDataUnitItem * item in unitItems)
-    {
+    NSArray *unitItems = self.unit.unitItems;
+    for (KTVHCDataUnitItem *item in unitItems) {
         long long itemMin = item.offset;
         long long itemMax = item.offset + item.length - 1;
-        if (itemMax < min || itemMin > max)
-        {
+        if (itemMax < min || itemMin > max) {
             continue;
         }
-        if (min > itemMin)
-        {
+        if (min > itemMin) {
             itemMin = min;
         }
-        if (max < itemMax)
-        {
+        if (max < itemMax) {
             itemMax = max;
         }
         min = itemMax + 1;
         KTVHCRange range = KTVHCMakeRange(item.offset, item.offset + item.length - 1);
         KTVHCRange readRange = KTVHCMakeRange(itemMin - item.offset, itemMax - item.offset);
-        KTVHCDataFileSource * source = [[KTVHCDataFileSource alloc] initWithPath:item.absolutePath range:range readRange:readRange];
+        KTVHCDataFileSource *source = [[KTVHCDataFileSource alloc] initWithPath:item.absolutePath range:range readRange:readRange];
         [fileSources addObject:source];
     }
-    [fileSources sortUsingComparator:^NSComparisonResult(KTVHCDataFileSource * obj1, KTVHCDataFileSource * obj2) {
+    [fileSources sortUsingComparator:^NSComparisonResult(KTVHCDataFileSource *obj1, KTVHCDataFileSource *obj2) {
         if (obj1.range.start < obj2.range.start) {
             return NSOrderedAscending;
         }
@@ -157,14 +143,12 @@
     }];
     long long offset = self.request.range.start;
     long long length = KTVHCRangeIsFull(self.request.range) ? KTVHCRangeGetLength(self.request.range) : (self.request.range.end - offset + 1);
-    for (KTVHCDataFileSource * obj in fileSources)
-    {
+    for (KTVHCDataFileSource *obj in fileSources) {
         long long delta = obj.range.start + obj.readRange.start - offset;
-        if (delta > 0)
-        {
+        if (delta > 0) {
             KTVHCRange range = KTVHCMakeRange(offset, offset + delta - 1);
-            KTVHCDataRequest * request = [self.request requestWithRange:range];
-            KTVHCDataNetworkSource * source = [[KTVHCDataNetworkSource alloc] initWithRequest:request];
+            KTVHCDataRequest *request = [self.request newRequestWithRange:range];
+            KTVHCDataNetworkSource *source = [[KTVHCDataNetworkSource alloc] initWithRequest:request];
             [networkSources addObject:source];
             offset += delta;
             length -= delta;
@@ -172,32 +156,27 @@
         offset += KTVHCRangeGetLength(obj.readRange);
         length -= KTVHCRangeGetLength(obj.readRange);
     }
-    if (length > 0)
-    {
+    if (length > 0) {
         KTVHCRange range = KTVHCMakeRange(offset, self.request.range.end);
-        KTVHCDataRequest * request = [self.request requestWithRange:range];
-        KTVHCDataNetworkSource * source = [[KTVHCDataNetworkSource alloc] initWithRequest:request];
+        KTVHCDataRequest *request = [self.request newRequestWithRange:range];
+        KTVHCDataNetworkSource *source = [[KTVHCDataNetworkSource alloc] initWithRequest:request];
         [networkSources addObject:source];
     }
-    for (KTVHCDataFileSource * obj in fileSources)
-    {
-        [self.sourceManager putSource:obj];
-    }
-    for (KTVHCDataNetworkSource * obj in networkSources)
-    {
-        [self.sourceManager putSource:obj];
-    }
+    NSMutableArray<id<KTVHCDataSource>> *sources = [NSMutableArray array];
+    [sources addObjectsFromArray:fileSources];
+    [sources addObjectsFromArray:networkSources];
+    self.sourceManager = [[KTVHCDataSourceManager alloc] initWithSources:sources delegate:self delegateQueue:self.internalDelegateQueue];
     [self.sourceManager prepare];
 }
 
-- (void)sourceManagerDidPrepared:(KTVHCDataSourceManager *)sourceManager
+- (void)ktv_sourceManagerDidPrepare:(KTVHCDataSourceManager *)sourceManager
 {
     [self lock];
     [self callbackForPrepared];
     [self unlock];
 }
 
-- (void)sourceManager:(KTVHCDataSourceManager *)sourceManager didReceiveResponse:(KTVHCDataResponse *)response
+- (void)ktv_sourceManager:(KTVHCDataSourceManager *)sourceManager didReceiveResponse:(KTVHCDataResponse *)response
 {
     [self lock];
     [self.unit updateResponseHeaders:response.headers totalLength:response.totalLength];
@@ -205,51 +184,45 @@
     [self unlock];
 }
 
-- (void)sourceManagerHasAvailableData:(KTVHCDataSourceManager *)sourceManager
+- (void)ktv_sourceManagerHasAvailableData:(KTVHCDataSourceManager *)sourceManager
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    if ([self.delegate respondsToSelector:@selector(readerHasAvailableData:)])
-    {
+    if ([self.delegate respondsToSelector:@selector(ktv_readerHasAvailableData:)]) {
         KTVHCLogDataReader(@"%p, Callback for has available data - Begin", self);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataReader(@"%p, Callback for has available data - End", self);
-            [self.delegate readerHasAvailableData:self];
+            [self.delegate ktv_readerHasAvailableData:self];
         }];
     }
     [self unlock];
 }
 
-- (void)sourceManager:(KTVHCDataSourceManager *)sourceManager didFailed:(NSError *)error
+- (void)ktv_sourceManager:(KTVHCDataSourceManager *)sourceManager didFailWithError:(NSError *)error
 {
-    if (!error)
-    {
+    if (!error) {
         return;
     }
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    if (self.error)
-    {
+    if (self.error) {
         [self unlock];
         return;
     }
-    _error = error;
+    self->_error = error;
     [self close];
-    [[KTVHCLog log] addError:self.error];
-    if ([self.delegate respondsToSelector:@selector(reader:didFailed:)])
-    {
+    [[KTVHCLog log] addError:self.error forURL:self.request.URL];
+    if ([self.delegate respondsToSelector:@selector(ktv_reader:didFailWithError:)]) {
         KTVHCLogDataReader(@"%p, Callback for failed - Begin\nError : %@", self, self.error);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataReader(@"%p, Callback for failed - End", self);
-            [self.delegate reader:self didFailed:self.error];
+            [self.delegate ktv_reader:self didFailWithError:self.error];
         }];
     }
     [self unlock];
@@ -257,28 +230,24 @@
 
 - (void)callbackForPrepared
 {
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         return;
     }
-    if (self.didPrepared)
-    {
+    if (self.isPrepared) {
         return;
     }
-    if (self.sourceManager.didPrepared && self.unit.totalLength > 0)
-    {
+    if (self.sourceManager.isPrepared && self.unit.totalLength > 0) {
         long long totalLength = self.unit.totalLength;
         KTVHCRange range = KTVHCRangeWithEnsureLength(self.request.range, totalLength);
-        NSDictionary * headers = KTVHCRangeFillToResponseHeaders(range, self.unit.responseHeaders, totalLength);
-        _response = [[KTVHCDataResponse alloc] initWithURL:self.request.URL headers:headers];
-        _didPrepared = YES;
+        NSDictionary *headers = KTVHCRangeFillToResponseHeaders(range, self.unit.responseHeaders, totalLength);
+        self->_response = [[KTVHCDataResponse alloc] initWithURL:self.request.URL headers:headers];
+        self->_prepared = YES;
         KTVHCLogDataReader(@"%p, Reader did prepared\nResponse : %@", self, self.response);
-        if ([self.delegate respondsToSelector:@selector(readerDidPrepared:)])
-        {
+        if ([self.delegate respondsToSelector:@selector(ktv_readerDidPrepare:)]) {
             KTVHCLogDataReader(@"%p, Callback for prepared - Begin", self);
             [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
                 KTVHCLogDataReader(@"%p, Callback for prepared - End", self);
-                [self.delegate readerDidPrepared:self];
+                [self.delegate ktv_readerDidPrepare:self];
             }];
         }
     }
@@ -286,8 +255,7 @@
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSRecursiveLock alloc] init];
     }
     [self.coreLock lock];

+ 4 - 7
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataRequest.h

@@ -14,13 +14,10 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers;
+- (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers NS_DESIGNATED_INITIALIZER;
 
-@property (nonatomic, copy, readonly) NSURL * URL;
-@property (nonatomic, copy, readonly) NSDictionary * headers;
-@property (nonatomic, assign, readonly) KTVHCRange range;
-
-- (KTVHCDataRequest *)requestWithRange:(KTVHCRange)range;
-- (KTVHCDataRequest *)requestWithTotalLength:(long long)totalLength;
+@property (nonatomic, copy, readonly) NSURL *URL;
+@property (nonatomic, copy, readonly) NSDictionary *headers;
+@property (nonatomic, readonly) KTVHCRange range;
 
 @end

+ 11 - 19
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataRequest.m

@@ -7,22 +7,18 @@
 //
 
 #import "KTVHCDataRequest.h"
+#import "KTVHCData+Internal.h"
 #import "KTVHCLog.h"
 
 @implementation KTVHCDataRequest
 
 - (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
-        _URL = URL;
-        if (![headers objectForKey:@"Range"]) {
-            _headers = KTVHCRangeFillToRequestHeaders(KTVHCRangeFull(), headers);
-        } else {
-            _headers = headers;
-        }
-        _range = KTVHCRangeWithRequestHeaderValue([_headers objectForKey:@"Range"]);
+        self->_URL = URL;
+        self->_headers = KTVHCRangeFillToRequestHeadersIfNeeded(KTVHCRangeFull(), headers);
+        self->_range = KTVHCRangeWithRequestHeaderValue([self.headers objectForKey:@"Range"]);
         KTVHCLogDataRequest(@"%p Create data request\nURL : %@\nHeaders : %@\nRange : %@", self, self.URL, self.headers, KTVHCStringFromRange(self.range));
     }
     return self;
@@ -33,21 +29,17 @@
     KTVHCLogDealloc(self);
 }
 
-- (KTVHCDataRequest *)requestWithRange:(KTVHCRange)range
+- (KTVHCDataRequest *)newRequestWithRange:(KTVHCRange)range
 {
-    if (!KTVHCEqualRanges(self.range, range))
-    {
-        NSDictionary * headers = KTVHCRangeFillToRequestHeaders(range, self.headers);
-        KTVHCDataRequest * obj = [[KTVHCDataRequest alloc] initWithURL:self.URL headers:headers];
-        return obj;
-    }
-    return self;
+    NSDictionary *headers = KTVHCRangeFillToRequestHeaders(range, self.headers);
+    KTVHCDataRequest *obj = [[KTVHCDataRequest alloc] initWithURL:self.URL headers:headers];
+    return obj;
 }
 
-- (KTVHCDataRequest *)requestWithTotalLength:(long long)totalLength
+- (KTVHCDataRequest *)newRequestWithTotalLength:(long long)totalLength
 {
     KTVHCRange range = KTVHCRangeWithEnsureLength(self.range, totalLength);
-    return [self requestWithRange:range];
+    return [self newRequestWithRange:range];
 }
 
 @end

+ 7 - 12
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataResponse.h

@@ -14,17 +14,12 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers;
-
-@property (nonatomic, copy, readonly) NSURL * URL;
-@property (nonatomic, copy, readonly) NSDictionary * headers;
-@property (nonatomic, copy, readonly) NSDictionary * headersWithoutRangeAndLength;
-
-@property (nonatomic, copy, readonly) NSString * contentType;
-@property (nonatomic, assign, readonly) KTVHCRange range;
-@property (nonatomic, assign, readonly) long long totalLength;
-@property (nonatomic, assign, readonly) long long currentLength;
-
-- (KTVHCDataResponse *)responseWithRange:(KTVHCRange)range;
+@property (nonatomic, copy, readonly) NSURL *URL;
+@property (nonatomic, copy, readonly) NSDictionary *headers;
+@property (nonatomic, copy, readonly) NSString *contentType;
+@property (nonatomic, copy, readonly) NSString *contentRangeString;
+@property (nonatomic, readonly) KTVHCRange contentRange;
+@property (nonatomic, readonly) long long contentLength;
+@property (nonatomic, readonly) long long totalLength;
 
 @end

+ 11 - 41
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataResponse.m

@@ -7,27 +7,22 @@
 //
 
 #import "KTVHCDataResponse.h"
+#import "KTVHCData+Internal.h"
 #import "KTVHCLog.h"
 
 @implementation KTVHCDataResponse
 
 - (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
-        _URL = URL;
-        _headers = headers;
-        NSMutableDictionary * headersWithoutRangeAndLength = [headers mutableCopy];
-        for (NSString * key in [self withoutHeaderKeys])
-        {
-            [headersWithoutRangeAndLength removeObjectForKey:key];
-        }
-        _headersWithoutRangeAndLength = [headersWithoutRangeAndLength copy];
-        _contentType = [self headerValueWithKey:@"Content-Type"];
-        _currentLength = [self headerValueWithKey:@"Content-Length"].longLongValue;
-        _range = KTVHCRangeWithResponseHeaderValue([self headerValueWithKey:@"Content-Range"], &_totalLength);
-        KTVHCLogDataResponse(@"%p Create data response\nURL : %@\nHeaders : %@\nheadersWithoutRangeAndLength : %@\ncontentType : %@\ntotalLength : %lld\ncurrentLength : %lld", self, self.URL, self.headers, self.headersWithoutRangeAndLength, self.contentType, self.totalLength, self.currentLength);
+        self->_URL = URL;
+        self->_headers = headers;
+        self->_contentType = [self headerValueWithKey:@"Content-Type"];
+        self->_contentRangeString = [self headerValueWithKey:@"Content-Range"];
+        self->_contentLength = [self headerValueWithKey:@"Content-Length"].longLongValue;
+        self->_contentRange = KTVHCRangeWithResponseHeaderValue(self.contentRangeString, &self->_totalLength);
+        KTVHCLogDataResponse(@"%p Create data response\nURL : %@\nHeaders : %@\ncontentType : %@\ntotalLength : %lld\ncurrentLength : %lld", self, self.URL, self.headers, self.contentType, self.totalLength, self.contentLength);
     }
     return self;
 }
@@ -39,36 +34,11 @@
 
 - (NSString *)headerValueWithKey:(NSString *)key
 {
-    NSString * value = [self.headers objectForKey:key];
-    if (!value)
-    {
+    NSString *value = [self.headers objectForKey:key];
+    if (!value) {
         value = [self.headers objectForKey:[key lowercaseString]];
     }
     return value;
 }
 
-- (NSArray <NSString *> *)withoutHeaderKeys
-{
-    static NSArray * obj = nil;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        obj = @[@"Content-Length",
-                @"content-length",
-                @"Content-Range",
-                @"content-range"];
-    });
-    return obj;
-}
-
-- (KTVHCDataResponse *)responseWithRange:(KTVHCRange)range
-{
-    if (!KTVHCEqualRanges(self.range, range))
-    {
-        NSDictionary * headers = KTVHCRangeFillToResponseHeaders(range, self.headers, self.totalLength);
-        KTVHCDataResponse * obj = [[KTVHCDataResponse alloc] initWithURL:self.URL headers:headers];
-        return obj;
-    }
-    return self;
-}
-
 @end

+ 9 - 20
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceManager.h

@@ -7,41 +7,30 @@
 //
 
 #import <Foundation/Foundation.h>
-#import "KTVHCDataFileSource.h"
 #import "KTVHCDataNetworkSource.h"
+#import "KTVHCDataFileSource.h"
 
 @class KTVHCDataSourceManager;
 
 @protocol KTVHCDataSourceManagerDelegate <NSObject>
 
-- (void)sourceManagerDidPrepared:(KTVHCDataSourceManager *)sourceManager;
-- (void)sourceManagerHasAvailableData:(KTVHCDataSourceManager *)sourceManager;
-- (void)sourceManager:(KTVHCDataSourceManager *)sourceManager didFailed:(NSError *)error;
-- (void)sourceManager:(KTVHCDataSourceManager *)sourceManager didReceiveResponse:(KTVHCDataResponse *)response;
+- (void)ktv_sourceManagerDidPrepare:(KTVHCDataSourceManager *)sourceManager;
+- (void)ktv_sourceManagerHasAvailableData:(KTVHCDataSourceManager *)sourceManager;
+- (void)ktv_sourceManager:(KTVHCDataSourceManager *)sourceManager didFailWithError:(NSError *)error;
+- (void)ktv_sourceManager:(KTVHCDataSourceManager *)sourceManager didReceiveResponse:(KTVHCDataResponse *)response;
 
 @end
 
-@interface KTVHCDataSourceManager : NSObject
+@interface KTVHCDataSourceManager : NSObject <KTVHCDataSource>
 
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithDelegate:(id <KTVHCDataSourceManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
+- (instancetype)initWithSources:(NSArray<id<KTVHCDataSource>> *)sources
+                       delegate:(id <KTVHCDataSourceManagerDelegate>)delegate
+                  delegateQueue:(dispatch_queue_t)delegateQueue NS_DESIGNATED_INITIALIZER;
 
 @property (nonatomic, weak, readonly) id <KTVHCDataSourceManagerDelegate> delegate;
 @property (nonatomic, strong, readonly) dispatch_queue_t delegateQueue;
 
-@property (nonatomic, strong, readonly) NSError * error;
-
-@property (nonatomic, assign, readonly) BOOL didClosed;
-@property (nonatomic, assign, readonly) BOOL didPrepared;
-@property (nonatomic, assign, readonly) BOOL didFinished;
-
-- (void)putSource:(id<KTVHCDataSourceProtocol>)source;
-
-- (void)prepare;
-- (void)close;
-
-- (NSData *)readDataOfLength:(NSUInteger)length;
-
 @end

+ 121 - 91
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceManager.m

@@ -7,32 +7,36 @@
 //
 
 #import "KTVHCDataSourceManager.h"
-#import "KTVHCDataSourceQueue.h"
 #import "KTVHCDataCallback.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCDataSourceManager () <NSLocking, KTVHCDataFileSourceDelegate, KTVHCDataNetworkSourceDelegate>
 
-@property (nonatomic, strong) NSLock * coreLock;
-@property (nonatomic, assign) BOOL didCalledPrepare;
-@property (nonatomic, assign) BOOL didCalledReceiveResponse;
-
-@property (nonatomic, strong) KTVHCDataSourceQueue * sourceQueue;
-@property (nonatomic, strong) id <KTVHCDataSourceProtocol> currentSource;
-@property (nonatomic, strong) KTVHCDataNetworkSource * currentNetworkSource;
+@property (nonatomic, strong) NSLock *coreLock;
+@property (nonatomic, strong) id <KTVHCDataSource> currentSource;
+@property (nonatomic, strong) KTVHCDataNetworkSource *currentNetworkSource;
+@property (nonatomic, strong) NSMutableArray<id<KTVHCDataSource>> *sources;
+@property (nonatomic) BOOL calledPrepare;
+@property (nonatomic) BOOL calledReceiveResponse;
 
 @end
 
 @implementation KTVHCDataSourceManager
 
-- (instancetype)initWithDelegate:(id <KTVHCDataSourceManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue
+@synthesize error = _error;
+@synthesize range = _range;
+@synthesize closed = _closed;
+@synthesize prepared = _prepared;
+@synthesize finished = _finished;
+@synthesize readedLength = _readedLength;
+
+- (instancetype)initWithSources:(NSArray<id<KTVHCDataSource>> *)sources delegate:(id<KTVHCDataSourceManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
-        _delegate = delegate;
-        _delegateQueue = delegateQueue;
-        self.sourceQueue = [KTVHCDataSourceQueue sourceQueue];
+        self->_sources = [sources mutableCopy];
+        self->_delegate = delegate;
+        self->_delegateQueue = delegateQueue;
     }
     return self;
 }
@@ -43,108 +47,141 @@
     KTVHCLogDataReader(@"%p, Destory reader\nError : %@\ncurrentSource : %@\ncurrentNetworkSource : %@", self, self.error, self.currentSource, self.currentNetworkSource);
 }
 
-- (void)putSource:(id<KTVHCDataSourceProtocol>)source
-{
-    KTVHCLogDataSourceManager(@"%p, Put source : %@", self, source);
-    [self.sourceQueue putSource:source];
-}
-
 - (void)prepare
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    if (self.didCalledPrepare)
-    {
+    if (self.calledPrepare) {
         [self unlock];
         return;
     }
-    _didCalledPrepare = YES;
+    self->_calledPrepare = YES;
     KTVHCLogDataSourceManager(@"%p, Call prepare", self);
-    [self.sourceQueue sortSources];
-    [self.sourceQueue setAllSourceDelegate:self delegateQueue:self.delegateQueue];
-    self.currentSource = [self.sourceQueue firstSource];
-    self.currentNetworkSource = [self.sourceQueue firstNetworkSource];
+    KTVHCLogDataSourceManager(@"%p, Sort sources - Begin\nSources : %@", self, self.sources);
+    [self.sources sortUsingComparator:^NSComparisonResult(id <KTVHCDataSource> obj1, id <KTVHCDataSource> obj2) {
+        if (obj1.range.start < obj2.range.start) {
+            return NSOrderedAscending;
+        }
+        return NSOrderedDescending;
+    }];
+    KTVHCLogDataSourceManager(@"%p, Sort sources - End  \nSources : %@", self, self.sources);
+    for (id <KTVHCDataSource> obj in self.sources) {
+        if ([obj isKindOfClass:[KTVHCDataFileSource class]]) {
+            KTVHCDataFileSource *source = (KTVHCDataFileSource *)obj;
+            [source setDelegate:self delegateQueue:self.delegateQueue];
+        }
+        else if ([obj isKindOfClass:[KTVHCDataNetworkSource class]]) {
+            KTVHCDataNetworkSource *source = (KTVHCDataNetworkSource *)obj;
+            [source setDelegate:self delegateQueue:self.delegateQueue];
+        }
+    }
+    self.currentSource = self.sources.firstObject;
+    for (id<KTVHCDataSource> obj in self.sources) {
+        if ([obj isKindOfClass:[KTVHCDataNetworkSource class]]) {
+            self.currentNetworkSource = obj;
+            break;
+        }
+    }
     KTVHCLogDataSourceManager(@"%p, Sort source\ncurrentSource : %@\ncurrentNetworkSource : %@", self, self.currentSource, self.currentNetworkSource);
     [self.currentSource prepare];
-    if (self.currentSource != self.currentNetworkSource)
-    {
-        [self.currentNetworkSource prepare];
-    }
+    [self.currentNetworkSource prepare];
     [self unlock];
 }
 
 - (void)close
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    _didClosed = YES;
+    self->_closed = YES;
     KTVHCLogDataSourceManager(@"%p, Call close", self);
-    [self.sourceQueue closeAllSource];
+    for (id <KTVHCDataSource> obj in self.sources) {
+        [obj close];
+    }
     [self unlock];
 }
 
 - (NSData *)readDataOfLength:(NSUInteger)length
 {
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return nil;
     }
-    if (self.didFinished)
-    {
+    if (self.isFinished) {
         [self unlock];
         return nil;
     }
-    if (self.error)
-    {
+    if (self.error) {
         [self unlock];
         return nil;
     }
-    NSData * data = [self.currentSource readDataOfLength:length];
+    NSData *data = [self.currentSource readDataOfLength:length];
+    self->_readedLength += data.length;
     KTVHCLogDataSourceManager(@"%p, Read data : %lld", self, (long long)data.length);
-    if (self.currentSource.didFinished)
-    {
-        self.currentSource = [self.sourceQueue nextSource:self.currentSource];
-        if (self.currentSource)
-        {
+    if (self.currentSource.isFinished) {
+        self.currentSource = [self nextSource];
+        if (self.currentSource) {
             KTVHCLogDataSourceManager(@"%p, Switch to next source, %@", self, self.currentSource);
-            if ([self.currentSource isKindOfClass:[KTVHCDataFileSource class]])
-            {
+            if ([self.currentSource isKindOfClass:[KTVHCDataFileSource class]]) {
                 [self.currentSource prepare];
             }
-        }
-        else
-        {
+        } else {
             KTVHCLogDataSourceManager(@"%p, Read data did finished", self);
-            _didFinished = YES;
+            self->_finished = YES;
         }
     }
     [self unlock];
     return data;
 }
 
-- (void)fileSourceDidPrepared:(KTVHCDataFileSource *)fileSource
+- (id<KTVHCDataSource>)nextSource
+{
+    NSUInteger index = [self.sources indexOfObject:self.currentSource] + 1;
+    if (index < self.sources.count) {
+        KTVHCLogDataSourceManager(@"%p, Fetch next source : %@", self, [self.sources objectAtIndex:index]);
+        return [self.sources objectAtIndex:index];
+    }
+    KTVHCLogDataSourceManager(@"%p, Fetch netxt source failed", self);
+    return nil;
+}
+
+- (KTVHCDataNetworkSource *)nextNetworkSource
+{
+    NSUInteger index = [self.sources indexOfObject:self.currentNetworkSource] + 1;
+    for (; index < self.sources.count; index++) {
+        id <KTVHCDataSource> obj = [self.sources objectAtIndex:index];
+        if ([obj isKindOfClass:[KTVHCDataNetworkSource class]]) {
+            KTVHCLogDataSourceManager(@"%p, Fetch next network source : %@", self, obj);
+            return obj;
+        }
+    }
+    KTVHCLogDataSourceManager(@"%p, Fetch netxt network source failed", self);
+    return nil;
+}
+
+#pragma mark - KTVHCDataFileSourceDelegate
+
+- (void)ktv_fileSourceDidPrepare:(KTVHCDataFileSource *)fileSource
 {
     [self lock];
     [self callbackForPrepared];
     [self unlock];
 }
 
-- (void)fileSource:(KTVHCDataFileSource *)fileSource didFailed:(NSError *)error
+- (void)ktv_fileSource:(KTVHCDataFileSource *)fileSource didFailWithError:(NSError *)error
 {
     [self callbackForFailed:error];
 }
 
-- (void)networkSourceDidPrepared:(KTVHCDataNetworkSource *)networkSource
+#pragma mark - KTVHCDataNetworkSourceDelegate
+
+- (void)ktv_networkSourceDidPrepare:(KTVHCDataNetworkSource *)networkSource
 {
     [self lock];
     [self callbackForPrepared];
@@ -152,105 +189,98 @@
     [self unlock];
 }
 
-- (void)networkSourceHasAvailableData:(KTVHCDataNetworkSource *)networkSource
+- (void)ktv_networkSourceHasAvailableData:(KTVHCDataNetworkSource *)networkSource
 {
     [self lock];
-    if ([self.delegate respondsToSelector:@selector(sourceManagerHasAvailableData:)])
-    {
+    if ([self.delegate respondsToSelector:@selector(ktv_sourceManagerHasAvailableData:)]) {
         KTVHCLogDataSourceManager(@"%p, Callback for has available data - Begin\nSource : %@", self, networkSource);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataSourceManager(@"%p, Callback for has available data - End", self);
-            [self.delegate sourceManagerHasAvailableData:self];
+            [self.delegate ktv_sourceManagerHasAvailableData:self];
         }];
     }
     [self unlock];
 }
 
-- (void)networkSourceDidFinishedDownload:(KTVHCDataNetworkSource *)networkSource
+- (void)ktv_networkSourceDidFinisheDownload:(KTVHCDataNetworkSource *)networkSource
 {
     [self lock];
-    self.currentNetworkSource = [self.sourceQueue nextNetworkSource:self.currentNetworkSource];
+    self.currentNetworkSource = [self nextNetworkSource];
     [self.currentNetworkSource prepare];
     [self unlock];
 }
 
-- (void)networkSource:(KTVHCDataNetworkSource *)networkSource didFailed:(NSError *)error
+- (void)ktv_networkSource:(KTVHCDataNetworkSource *)networkSource didFailWithError:(NSError *)error
 {
     [self callbackForFailed:error];
 }
 
+#pragma mark - Callback
+
 - (void)callbackForPrepared
 {
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         return;
     }
-    if (self.didPrepared)
-    {
+    if (self.isPrepared) {
         return;
     }
-    _didPrepared = YES;
-    if ([self.delegate respondsToSelector:@selector(sourceManagerDidPrepared:)])
-    {
+    self->_prepared = YES;
+    if ([self.delegate respondsToSelector:@selector(ktv_sourceManagerDidPrepare:)]) {
         KTVHCLogDataSourceManager(@"%p, Callback for prepared - Begin", self);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataSourceManager(@"%p, Callback for prepared - End", self);
-            [self.delegate sourceManagerDidPrepared:self];
+            [self.delegate ktv_sourceManagerDidPrepare:self];
         }];
     }
 }
 
 - (void)callbackForReceiveResponse:(KTVHCDataResponse *)response
 {
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         return;
     }
-    if (self.didCalledReceiveResponse)
-    {
+    if (self.calledReceiveResponse) {
         return;
     }
-    _didCalledReceiveResponse = YES;
-    if ([self.delegate respondsToSelector:@selector(sourceManager:didReceiveResponse:)])
-    {
+    self->_calledReceiveResponse = YES;
+    if ([self.delegate respondsToSelector:@selector(ktv_sourceManager:didReceiveResponse:)]) {
         KTVHCLogDataSourceManager(@"%p, Callback for did receive response - End", self);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataSourceManager(@"%p, Callback for did receive response - End", self);
-            [self.delegate sourceManager:self didReceiveResponse:response];
+            [self.delegate ktv_sourceManager:self didReceiveResponse:response];
         }];
     }
 }
 
 - (void)callbackForFailed:(NSError *)error
 {
-    if (!error)
-    {
+    if (!error) {
         return;
     }
     [self lock];
-    if (self.didClosed)
-    {
+    if (self.isClosed) {
         [self unlock];
         return;
     }
-    if (self.error)
-    {
+    if (self.error) {
         [self unlock];
         return;
     }
-    _error = error;
+    self->_error = error;
     KTVHCLogDataSourceManager(@"failure, %d", (int)self.error.code);
-    if (self.error && [self.delegate respondsToSelector:@selector(sourceManager:didFailed:)])
-    {
+    if (self.error && [self.delegate respondsToSelector:@selector(ktv_sourceManager:didFailWithError:)]) {
         KTVHCLogDataSourceManager(@"%p, Callback for network source failed - Begin\nError : %@", self, self.error);
         [KTVHCDataCallback callbackWithQueue:self.delegateQueue block:^{
             KTVHCLogDataSourceManager(@"%p, Callback for network source failed - End", self);
-            [self.delegate sourceManager:self didFailed:self.error];
+            [self.delegate ktv_sourceManager:self didFailWithError:self.error];
         }];
     }
     [self unlock];
 }
 
+#pragma mark - NSLocking
+
 - (void)lock
 {
     if (!self.coreLock) {

+ 0 - 25
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceProtocol.h

@@ -1,25 +0,0 @@
-//
-//  KTVHCDataSourceProtocol.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/11.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "KTVHCRange.h"
-
-@protocol KTVHCDataSourceProtocol <NSObject>
-
-- (KTVHCRange)range;
-
-- (BOOL)didPrepared;
-- (BOOL)didFinished;
-- (BOOL)didClosed;
-
-- (void)prepare;
-- (void)close;
-
-- (NSData *)readDataOfLength:(NSUInteger)length;
-
-@end

+ 0 - 39
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceQueue.h

@@ -1,39 +0,0 @@
-//
-//  KTVHCDataSourceQueue.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/11.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "KTVHCDataSourceProtocol.h"
-
-@class KTVHCDataFileSource;
-@class KTVHCDataNetworkSource;
-
-@protocol KTVHCDataFileSourceDelegate;
-@protocol KTVHCDataNetworkSourceDelegate;
-
-@interface KTVHCDataSourceQueue : NSObject
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-+ (instancetype)sourceQueue;
-
-- (void)putSource:(id<KTVHCDataSourceProtocol>)source;
-- (void)popSource:(id<KTVHCDataSourceProtocol>)source;
-
-- (void)setAllSourceDelegate:(id<KTVHCDataFileSourceDelegate, KTVHCDataNetworkSourceDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
-
-- (void)sortSources;
-- (void)closeAllSource;
-
-- (id<KTVHCDataSourceProtocol>)firstSource;
-- (id<KTVHCDataSourceProtocol>)nextSource:(id<KTVHCDataSourceProtocol>)currentSource;
-
-- (KTVHCDataNetworkSource *)firstNetworkSource;
-- (KTVHCDataNetworkSource *)nextNetworkSource:(KTVHCDataNetworkSource *)currentSource;
-
-@end

+ 0 - 152
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataSourceQueue.m

@@ -1,152 +0,0 @@
-//
-//  KTVHCDataSourceQueue.m
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/11.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import "KTVHCDataSourceQueue.h"
-#import "KTVHCDataFileSource.h"
-#import "KTVHCDataNetworkSource.h"
-#import "KTVHCLog.h"
-
-@interface KTVHCDataSourceQueue ()
-
-@property (nonatomic, strong) NSMutableArray <id<KTVHCDataSourceProtocol>> * sources;
-
-@end
-
-@implementation KTVHCDataSourceQueue
-
-+ (instancetype)sourceQueue
-{
-    return [[self alloc] init];
-}
-
-- (instancetype)init
-{
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        self.sources = [NSMutableArray array];
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    KTVHCLogDealloc(self);
-}
-
-- (void)putSource:(id<KTVHCDataSourceProtocol>)source
-{
-    if (!source) {
-        return;
-    } {
-        [self.sources addObject:source];
-    }
-}
-
-- (void)popSource:(id<KTVHCDataSourceProtocol>)source
-{
-    if (!source)
-    {
-        return;
-    }
-    if ([self.sources containsObject:source])
-    {
-        [self.sources removeObject:source];
-    }
-}
-
-- (void)setAllSourceDelegate:(id<KTVHCDataFileSourceDelegate, KTVHCDataNetworkSourceDelegate>)delegate delegateQueue:(dispatch_queue_t)delegateQueue
-{
-    for (id <KTVHCDataSourceProtocol> obj in self.sources)
-    {
-        if ([obj isKindOfClass:[KTVHCDataFileSource class]])
-        {
-            KTVHCDataFileSource * source = (KTVHCDataFileSource *)obj;
-            [source setDelegate:delegate delegateQueue:delegateQueue];
-        }
-        else if ([obj isKindOfClass:[KTVHCDataNetworkSource class]])
-        {
-            KTVHCDataNetworkSource * source = (KTVHCDataNetworkSource *)obj;
-            [source setDelegate:delegate delegateQueue:delegateQueue];
-        }
-    }
-}
-
-- (void)sortSources
-{
-    KTVHCLogDataSourceQueue(@"%p, Sort sources - Begin\nSources : %@", self, self.sources);
-    [self.sources sortUsingComparator:^NSComparisonResult(id <KTVHCDataSourceProtocol> obj1, id <KTVHCDataSourceProtocol> obj2) {
-        if (obj1.range.start < obj2.range.start)
-        {
-            return NSOrderedAscending;
-        }
-        return NSOrderedDescending;
-    }];
-    KTVHCLogDataSourceQueue(@"%p, Sort sources - End  \nSources : %@", self, self.sources);
-}
-
-- (void)closeAllSource
-{
-    for (id <KTVHCDataSourceProtocol> obj in self.sources)
-    {
-        [obj close];
-    }
-}
-
-- (id<KTVHCDataSourceProtocol>)firstSource
-{
-    return self.sources.firstObject;
-}
-
-- (id<KTVHCDataSourceProtocol>)nextSource:(id<KTVHCDataSourceProtocol>)currentSource
-{
-    if ([self.sources containsObject:currentSource])
-    {
-        NSUInteger index = [self.sources indexOfObject:currentSource] + 1;
-        if (index < self.sources.count)
-        {
-            KTVHCLogDataSourceQueue(@"%p, Fetch next source : %@", self, [self.sources objectAtIndex:index]);
-            return [self.sources objectAtIndex:index];
-        }
-    }
-    KTVHCLogDataSourceQueue(@"%p, Fetch netxt source failed", self);
-    return nil;
-}
-
-- (KTVHCDataNetworkSource *)firstNetworkSource
-{
-    for (id<KTVHCDataSourceProtocol> obj in self.sources)
-    {
-        if ([obj isKindOfClass:[KTVHCDataNetworkSource class]])
-        {
-            return obj;
-        }
-    }
-    return nil;
-}
-
-- (KTVHCDataNetworkSource *)nextNetworkSource:(KTVHCDataNetworkSource *)currentSource
-{
-    if ([self.sources containsObject:currentSource])
-    {
-        NSUInteger index = [self.sources indexOfObject:currentSource] + 1;
-        for (; index < self.sources.count; index++)
-        {
-            id <KTVHCDataSourceProtocol> obj = [self.sources objectAtIndex:index];
-            if ([obj isKindOfClass:[KTVHCDataNetworkSource class]])
-            {
-                KTVHCLogDataSourceQueue(@"%p, Fetch next network source : %@", self, obj);
-                return obj;
-            }
-        }
-    }
-    KTVHCLogDataSourceQueue(@"%p, Fetch netxt network source failed", self);
-    return nil;
-}
-
-@end

+ 3 - 3
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataStorage.h

@@ -23,7 +23,7 @@
 /**
  *  Return file path if the content did finished cache.
  */
-- (NSURL *)completeFileURLIfExistedWithURL:(NSURL *)URL;
+- (NSURL *)completeFileURLWithURL:(NSURL *)URL;
 
 /**
  *  Reader for certain request.
@@ -39,12 +39,12 @@
  *  Get cache item.
  */
 - (KTVHCDataCacheItem *)cacheItemWithURL:(NSURL *)URL;
-- (NSArray <KTVHCDataCacheItem *> *)allCacheItems;
+- (NSArray<KTVHCDataCacheItem *> *)allCacheItems;
 
 /**
  *  Get cache length.
  */
-@property (nonatomic, assign) long long maxCacheLength;     // Default is 500M.
+@property (nonatomic) long long maxCacheLength;     // Default is 500M.
 - (long long)totalCacheLength;
 
 /**

+ 11 - 13
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataStorage.m

@@ -7,6 +7,7 @@
 //
 
 #import "KTVHCDataStorage.h"
+#import "KTVHCData+Internal.h"
 #import "KTVHCDataUnitPool.h"
 #import "KTVHCLog.h"
 
@@ -14,7 +15,7 @@
 
 + (instancetype)storage
 {
-    static KTVHCDataStorage * obj = nil;
+    static KTVHCDataStorage *obj = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         obj = [[self alloc] init];
@@ -24,40 +25,37 @@
 
 - (instancetype)init
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         self.maxCacheLength = 500 * 1024 * 1024;
     }
     return self;
 }
 
-- (NSURL *)completeFileURLIfExistedWithURL:(NSURL *)URL
+- (NSURL *)completeFileURLWithURL:(NSURL *)URL
 {
-    KTVHCDataUnit * unit = [[KTVHCDataUnitPool pool] unitWithURL:URL];
-    NSURL * fileURL = unit.fileURL;
+    KTVHCDataUnit *unit = [[KTVHCDataUnitPool pool] unitWithURL:URL];
+    NSURL *completeURL = unit.completeURL;
     [unit workingRelease];
-    return fileURL;
+    return completeURL;
 }
 
 - (KTVHCDataReader *)readerWithRequest:(KTVHCDataRequest *)request
 {
-    if (!request || request.URL.absoluteString.length <= 0)
-    {
+    if (!request || request.URL.absoluteString.length <= 0) {
         KTVHCLogDataStorage(@"Invaild reader request, %@", request.URL);
         return nil;
     }
-    KTVHCDataReader * reader = [KTVHCDataReader readerWithRequest:request];
+    KTVHCDataReader *reader = [[KTVHCDataReader alloc] initWithRequest:request];
     return reader;
 }
 
 - (KTVHCDataLoader *)loaderWithRequest:(KTVHCDataRequest *)request
 {
-    if (!request || request.URL.absoluteString.length <= 0)
-    {
+    if (!request || request.URL.absoluteString.length <= 0) {
         KTVHCLogDataStorage(@"Invaild loader request, %@", request.URL);
         return nil;
     }
-    KTVHCDataLoader * loader = [KTVHCDataLoader loaderWithRequest:request];
+    KTVHCDataLoader *loader = [[KTVHCDataLoader alloc] initWithRequest:request];
     return loader;
 }
 

+ 16 - 21
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnit.h

@@ -11,9 +11,9 @@
 
 @class KTVHCDataUnit;
 
-@protocol KTVHCDataUnitFileDelegate <NSObject>
+@protocol KTVHCDataUnitDelegate <NSObject>
 
-- (void)unitShouldRearchive:(KTVHCDataUnit *)unit;
+- (void)ktv_unitDidChangeMetadata:(KTVHCDataUnit *)unit;
 
 @end
 
@@ -22,40 +22,35 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-+ (instancetype)unitWithURL:(NSURL *)URL;
+- (instancetype)initWithURL:(NSURL *)URL;
 
-@property (nonatomic, assign, readonly) BOOL valid;
+@property (nonatomic, copy, readonly) NSError *error;
 
-@property (nonatomic, copy, readonly) NSURL * URL;
-@property (nonatomic, copy, readonly) NSURL * fileURL;
-@property (nonatomic, copy, readonly) NSString * key;       // Unique Identifier.
-
-@property (nonatomic, assign, readonly) NSTimeInterval createTimeInterval;
-@property (nonatomic, assign, readonly) NSTimeInterval lastItemCreateInterval;
-
-@property (nonatomic, copy, readonly) NSDictionary * requestHeaders;
-@property (nonatomic, copy, readonly) NSDictionary * responseHeaders;
-
-@property (nonatomic, assign, readonly) long long totalLength;
-@property (nonatomic, assign, readonly) long long cacheLength;
-@property (nonatomic, assign, readonly) long long validLength;
+@property (nonatomic, copy, readonly) NSURL *URL;
+@property (nonatomic, copy, readonly) NSURL *completeURL;
+@property (nonatomic, copy, readonly) NSString *key;       // Unique Identifier.
+@property (nonatomic, copy, readonly) NSDictionary *responseHeaders;
+@property (nonatomic, readonly) NSTimeInterval createTimeInterval;
+@property (nonatomic, readonly) NSTimeInterval lastItemCreateInterval;
+@property (nonatomic, readonly) long long totalLength;
+@property (nonatomic, readonly) long long cacheLength;
+@property (nonatomic, readonly) long long validLength;
 
 /**
  *  Unit Item
  */
-- (NSArray <KTVHCDataUnitItem *> *)unitItems;
+- (NSArray<KTVHCDataUnitItem *> *)unitItems;
 - (void)insertUnitItem:(KTVHCDataUnitItem *)unitItem;
 
 /**
  *  Info Sync
  */
-- (void)updateRequestHeaders:(NSDictionary *)requestHeaders;
 - (void)updateResponseHeaders:(NSDictionary *)responseHeaders totalLength:(long long)totalLength;
 
 /**
  *  Working
  */
-@property (nonatomic, assign, readonly) NSInteger workingCount;
+@property (nonatomic, readonly) NSInteger workingCount;
 
 - (void)workingRetain;
 - (void)workingRelease;
@@ -63,7 +58,7 @@
 /**
  *  File Control
  */
-@property (nonatomic, weak) id <KTVHCDataUnitFileDelegate> fileDelegate;
+@property (nonatomic, weak) id <KTVHCDataUnitDelegate> delegate;
 
 - (void)deleteFiles;
 

+ 127 - 175
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnit.m

@@ -7,61 +7,49 @@
 //
 
 #import "KTVHCDataUnit.h"
-#import "KTVHCURLTools.h"
-#import "KTVHCPathTools.h"
+#import "KTVHCPathTool.h"
+#import "KTVHCURLTool.h"
+#import "KTVHCError.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCDataUnit ()
 
-@property (nonatomic, strong) NSRecursiveLock * coreLock;
-@property (nonatomic, strong) NSMutableArray <KTVHCDataUnitItem *> * unitItemsInternal;
-@property (nonatomic, strong) NSMutableArray <NSArray <KTVHCDataUnitItem *> *> * lockingUnitItems;
+@property (nonatomic, strong) NSRecursiveLock *coreLock;
+@property (nonatomic, strong) NSMutableArray<KTVHCDataUnitItem *> *unitItemsInternal;
+@property (nonatomic, strong) NSMutableArray<NSArray<KTVHCDataUnitItem *> *> *lockingUnitItems;
 
 @end
 
 @implementation KTVHCDataUnit
 
-+ (instancetype)unitWithURL:(NSURL *)URL
-{
-    return [[self alloc] initWithURL:URL];
-}
-
 - (instancetype)initWithURL:(NSURL *)URL
 {
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        _URL = URL;
-        _key = [KTVHCURLTools keyWithURL:self.URL];
-        _createTimeInterval = [NSDate date].timeIntervalSince1970;
-        _valid = YES;
-        [self prepare];
+    if (self = [super init]) {
+        self->_URL = [URL copy];
+        self->_key = [[KTVHCURLTool tool] keyWithURL:self.URL];
+        self->_createTimeInterval = [NSDate date].timeIntervalSince1970;
+        [self commonInit];
     }
     return self;
 }
 
 - (instancetype)initWithCoder:(NSCoder *)aDecoder
 {
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
+    if (self = [super init]) {
         @try {
-            _URL = [NSURL URLWithString:[aDecoder decodeObjectForKey:@"URLString"]];
-            _key = [aDecoder decodeObjectForKey:@"uniqueIdentifier"];
-            _valid = YES;
-        } @catch (NSException * exception) {
-            _valid = NO;
+            self->_URL = [NSURL URLWithString:[aDecoder decodeObjectForKey:@"URLString"]];
+            self->_key = [aDecoder decodeObjectForKey:@"uniqueIdentifier"];
+        } @catch (NSException *exception) {
+            self->_error = [KTVHCError errorForException:exception];
         }
         @try {
-            _createTimeInterval = [[aDecoder decodeObjectForKey:@"createTimeInterval"] doubleValue];
-            _requestHeaders = [aDecoder decodeObjectForKey:@"requestHeaderFields"];
-            _responseHeaders = [aDecoder decodeObjectForKey:@"responseHeaderFields"];
-            _totalLength = [[aDecoder decodeObjectForKey:@"totalContentLength"] longLongValue];
-            self.unitItemsInternal = [aDecoder decodeObjectForKey:@"unitItems"];
-            [self prepare];
-            _valid = _valid && YES;
-        } @catch (NSException * exception) {
-            _valid = NO;
+            self->_createTimeInterval = [[aDecoder decodeObjectForKey:@"createTimeInterval"] doubleValue];
+            self->_responseHeaders = [aDecoder decodeObjectForKey:@"responseHeaderFields"];
+            self->_totalLength = [[aDecoder decodeObjectForKey:@"totalContentLength"] longLongValue];
+            self->_unitItemsInternal = [[aDecoder decodeObjectForKey:@"unitItems"] mutableCopy];
+            [self commonInit];
+        } @catch (NSException *exception) {
+            self->_error = [KTVHCError errorForException:exception];
         }
     }
     return self;
@@ -73,7 +61,6 @@
     [aCoder encodeObject:self.URL.absoluteString forKey:@"URLString"];
     [aCoder encodeObject:self.key forKey:@"uniqueIdentifier"];
     [aCoder encodeObject:@(self.createTimeInterval) forKey:@"createTimeInterval"];
-    [aCoder encodeObject:self.requestHeaders forKey:@"requestHeaderFields"];
     [aCoder encodeObject:self.responseHeaders forKey:@"responseHeaderFields"];
     [aCoder encodeObject:@(self.totalLength) forKey:@"totalContentLength"];
     [aCoder encodeObject:self.unitItemsInternal forKey:@"unitItems"];
@@ -85,63 +72,53 @@
     KTVHCLogDealloc(self);
 }
 
-- (void)prepare
+- (void)commonInit
 {
+    KTVHCLogAlloc(self);
     [self lock];
-    if (!self.unitItemsInternal)
-    {
+    if (!self.unitItemsInternal) {
         self.unitItemsInternal = [NSMutableArray array];
     }
-    if (self.unitItemsInternal.count > 0)
-    {
-        NSMutableArray * removeArray = [NSMutableArray array];
-        for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-        {
-            if (obj.length <= 0)
-            {
-                [KTVHCPathTools deleteFileAtPath:obj.absolutePath];
-                [removeArray addObject:obj];
-            }
+    NSMutableArray *removal = [NSMutableArray array];
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
+        if (obj.length == 0) {
+            [KTVHCPathTool deleteFileAtPath:obj.absolutePath];
+            [removal addObject:obj];
         }
-        [self.unitItemsInternal removeObjectsInArray:removeArray];
-        [removeArray removeAllObjects];
-        [self sortUnitItems];
     }
-    KTVHCLogDataUnit(@"%p, Create Unit\nURL : %@\nkey : %@\ntimeInterval : %@\ntotalLength : %lld\ncacheLength : %lld\nvaildLength : %lld\nrequestHeaders : %@\nresponseHeaders : %@\nunitItems : %@", self, self.URL, self.key, [NSDate dateWithTimeIntervalSince1970:self.createTimeInterval], self.totalLength, self.cacheLength, self.validLength, self.requestHeaders, self.responseHeaders, self.unitItemsInternal);
+    [self.unitItemsInternal removeObjectsInArray:removal];
+    [self sortUnitItems];
+    KTVHCLogDataUnit(@"%p, Create Unit\nURL : %@\nkey : %@\ntimeInterval : %@\ntotalLength : %lld\ncacheLength : %lld\nvaildLength : %lld\nresponseHeaders : %@\nunitItems : %@", self, self.URL, self.key, [NSDate dateWithTimeIntervalSince1970:self.createTimeInterval], self.totalLength, self.cacheLength, self.validLength, self.responseHeaders, self.unitItemsInternal);
     [self unlock];
 }
 
 - (void)sortUnitItems
 {
     [self lock];
-    KTVHCLogDataSourceQueue(@"%p, Sort unitItems - Begin\n%@", self, self.unitItemsInternal);
-    [self.unitItemsInternal sortUsingComparator:^NSComparisonResult(KTVHCDataUnitItem * obj1, KTVHCDataUnitItem * obj2) {
+    KTVHCLogDataUnit(@"%p, Sort unitItems - Begin\n%@", self, self.unitItemsInternal);
+    [self.unitItemsInternal sortUsingComparator:^NSComparisonResult(KTVHCDataUnitItem *obj1, KTVHCDataUnitItem *obj2) {
         NSComparisonResult result = NSOrderedDescending;
-        if (obj1.offset < obj2.offset)
-        {
+        if (obj1.offset < obj2.offset) {
             result = NSOrderedAscending;
-        }
-        else if ((obj1.offset == obj2.offset) && (obj1.length > obj2.length))
-        {
+        } else if ((obj1.offset == obj2.offset) && (obj1.length > obj2.length)) {
             result = NSOrderedAscending;
         }
         return result;
     }];
-    KTVHCLogDataSourceQueue(@"%p, Sort unitItems - End  \n%@", self, self.unitItemsInternal);
+    KTVHCLogDataUnit(@"%p, Sort unitItems - End  \n%@", self, self.unitItemsInternal);
     [self unlock];
 }
 
-- (NSArray <KTVHCDataUnitItem *> *)unitItems
+- (NSArray<KTVHCDataUnitItem *> *)unitItems
 {
     [self lock];
-    NSMutableArray * objs = [NSMutableArray array];
-    for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-    {
+    NSMutableArray *objs = [NSMutableArray array];
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
         [objs addObject:[obj copy]];
     }
-    KTVHCLogDataSourceQueue(@"%p, Get unitItems\n%@", self, self.unitItemsInternal);
+    KTVHCLogDataUnit(@"%p, Get unitItems\n%@", self, self.unitItemsInternal);
     [self unlock];
-    return [objs copy];
+    return objs;
 }
 
 - (void)insertUnitItem:(KTVHCDataUnitItem *)unitItem
@@ -151,48 +128,58 @@
     [self sortUnitItems];
     KTVHCLogDataUnit(@"%p, Insert unitItem, %@", self, unitItem);
     [self unlock];
-    [self.fileDelegate unitShouldRearchive:self];
-}
-
-- (void)updateRequestHeaders:(NSDictionary *)requestHeaders
-{
-    [self lock];
-    _requestHeaders = requestHeaders;
-    KTVHCLogDataUnit(@"%p, Update requestHeaders\n%@", self, self.requestHeaders);
-    [self unlock];
-    [self.fileDelegate unitShouldRearchive:self];
+    [self.delegate ktv_unitDidChangeMetadata:self];
 }
 
 - (void)updateResponseHeaders:(NSDictionary *)responseHeaders totalLength:(long long)totalLength
 {
     [self lock];
-    _responseHeaders = responseHeaders;
-    _totalLength = totalLength;
+    BOOL needs = NO;
+    static NSArray *whiteList = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        whiteList = @[@"Accept-Ranges",
+                      @"Connection",
+                      @"Content-Type",
+                      @"Server"];
+    });
+    NSMutableDictionary *headers = [NSMutableDictionary dictionary];
+    for (NSString *key in whiteList) {
+        NSString *value = [responseHeaders objectForKey:key];
+        if (value) {
+            [headers setObject:value forKey:key];
+        }
+    }
+    if (self.totalLength != totalLength || ![self.responseHeaders isEqualToDictionary:headers]) {
+        self->_responseHeaders = headers;
+        self->_totalLength = totalLength;
+        needs = YES;
+    }
     KTVHCLogDataUnit(@"%p, Update responseHeaders\ntotalLength : %lld\n%@", self, self.totalLength, self.responseHeaders);
     [self unlock];
-    [self.fileDelegate unitShouldRearchive:self];
+    if (needs) {
+        [self.delegate ktv_unitDidChangeMetadata:self];
+    }
 }
 
-- (NSURL *)fileURL
+- (NSURL *)completeURL
 {
     [self lock];
-    NSURL * fileURL = nil;
-    KTVHCDataUnitItem * item = self.unitItemsInternal.firstObject;
-    if (item.offset == 0 && item.length > 0 && item.length == self.totalLength)
-    {
-        fileURL = [NSURL fileURLWithPath:item.absolutePath];
-        KTVHCLogDataUnit(@"%p, Get file path\n%@", self, fileURL);
+    NSURL *completeURL = nil;
+    KTVHCDataUnitItem *item = self.unitItemsInternal.firstObject;
+    if (item.offset == 0 && item.length > 0 && item.length == self.totalLength) {
+        completeURL = [NSURL fileURLWithPath:item.absolutePath];
+        KTVHCLogDataUnit(@"%p, Get file path\n%@", self, completeURL);
     }
     [self unlock];
-    return fileURL;
+    return completeURL;
 }
 
 - (long long)cacheLength
 {
     [self lock];
     long long length = 0;
-    for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-    {
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
         length += obj.length;
     }
     [self unlock];
@@ -204,8 +191,7 @@
     [self lock];
     long long offset = 0;
     long long length = 0;
-    for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-    {
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
         long long invalidLength = MAX(offset - obj.offset, 0);
         long long vaildLength = MAX(obj.length - invalidLength, 0);
         offset = MAX(offset, obj.offset + obj.length);
@@ -219,10 +205,8 @@
 {
     [self lock];
     NSTimeInterval timeInterval = self.createTimeInterval;
-    for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-    {
-        if (obj.createTimeInterval > timeInterval)
-        {
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
+        if (obj.createTimeInterval > timeInterval) {
             timeInterval = obj.createTimeInterval;
         }
     }
@@ -233,37 +217,31 @@
 - (void)workingRetain
 {
     [self lock];
-    _workingCount++;
+    self->_workingCount += 1;
     KTVHCLogDataUnit(@"%p, Working retain  : %ld", self, (long)self.workingCount);
     [self unlock];
 }
 
 - (void)workingRelease
 {
-    BOOL mergeSuccess = NO;
     [self lock];
-    _workingCount--;
+    self->_workingCount -= 1;
     KTVHCLogDataUnit(@"%p, Working release : %ld", self, (long)self.workingCount);
-    if (self.workingCount <= 0)
-    {
-        mergeSuccess = [self mergeFilesIfNeeded];
-    }
+    BOOL needs = [self mergeFilesIfNeeded];
     [self unlock];
-    if (mergeSuccess)
-    {
-        [self.fileDelegate unitShouldRearchive:self];
+    if (needs) {
+        [self.delegate ktv_unitDidChangeMetadata:self];
     }
 }
 
 - (void)deleteFiles
 {
-    if (!self.URL)
-    {
+    if (!self.URL) {
         return;
     }
     [self lock];
-    NSString * path = [KTVHCPathTools directoryPathWithURL:self.URL];
-    [KTVHCPathTools deleteDirectoryAtPath:path];
+    NSString *path = [KTVHCPathTool directoryPathWithURL:self.URL];
+    [KTVHCPathTool deleteDirectoryAtPath:path];
     KTVHCLogDataUnit(@"%p, Delete files", self);
     [self unlock];
 }
@@ -271,72 +249,56 @@
 - (BOOL)mergeFilesIfNeeded
 {
     [self lock];
-    if (self.workingCount > 0 || self.totalLength <= 0 || self.unitItemsInternal.count <= 0)
-    {
+    if (self.workingCount > 0 || self.totalLength == 0 || self.unitItemsInternal.count == 0) {
         [self unlock];
         return NO;
     }
-    NSString * path = [KTVHCPathTools completeFilePathWithURL:self.URL];
-    if ([self.unitItemsInternal.firstObject.absolutePath isEqualToString:path])
-    {
+    NSString *path = [KTVHCPathTool completeFilePathWithURL:self.URL];
+    if ([self.unitItemsInternal.firstObject.absolutePath isEqualToString:path]) {
         [self unlock];
         return NO;
     }
-    if (self.totalLength != self.validLength)
-    {
+    if (self.totalLength != self.validLength) {
         [self unlock];
         return NO;
     }
-    BOOL failed = NO;
+    NSError *error = nil;
     long long offset = 0;
-    [KTVHCPathTools deleteFileAtPath:path];
-    [KTVHCPathTools createFileAtPath:path];
-    NSFileHandle * writingHandle = [NSFileHandle fileHandleForWritingAtPath:path];
-    for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-    {
-        if (failed)
-        {
+    [KTVHCPathTool deleteFileAtPath:path];
+    [KTVHCPathTool createFileAtPath:path];
+    NSFileHandle *writingHandle = [NSFileHandle fileHandleForWritingAtPath:path];
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
+        if (error) {
             break;
         }
         NSAssert(offset >= obj.offset, @"invaild unit item.");
-        if (offset >= (obj.offset + obj.length))
-        {
+        if (offset >= (obj.offset + obj.length)) {
             KTVHCLogDataUnit(@"%p, Merge files continue", self);
             continue;
         }
-        NSFileHandle * readingHandle = [NSFileHandle fileHandleForReadingAtPath:obj.absolutePath];
-        @try
-        {
+        NSFileHandle *readingHandle = [NSFileHandle fileHandleForReadingAtPath:obj.absolutePath];
+        @try {
             [readingHandle seekToFileOffset:offset - obj.offset];
-        }
-        @catch (NSException * exception)
-        {
+        } @catch (NSException *exception) {
             KTVHCLogDataUnit(@"%p, Merge files seek exception\n%@", self, exception);
-            failed = YES;
+            error = [KTVHCError errorForException:exception];
         }
-        if (failed)
-        {
+        if (error) {
             break;
         }
-        while (!failed)
-        {
-            @autoreleasepool
-            {
-                NSData * data = [readingHandle readDataOfLength:1024 * 1024 * 1];
-                if (data.length <= 0)
-                {
+        while (!error) {
+            @autoreleasepool {
+                NSData *data = [readingHandle readDataOfLength:1024 * 1024 * 1];
+                if (data.length == 0) {
                     KTVHCLogDataUnit(@"%p, Merge files break", self);
                     break;
                 }
                 KTVHCLogDataUnit(@"%p, Merge write data : %lld", self, (long long)data.length);
-                @try
-                {
+                @try {
                     [writingHandle writeData:data];
-                }
-                @catch (NSException * exception)
-                {
+                } @catch (NSException *exception) {
                     KTVHCLogDataUnit(@"%p, Merge files write exception\n%@", self, exception);
-                    failed = YES;
+                    error = [KTVHCError errorForException:exception];
                 }
             }
         }
@@ -344,28 +306,23 @@
         offset = obj.offset + obj.length;
         KTVHCLogDataUnit(@"%p, Merge next : %lld", self, offset);
     }
-    @try
-    {
+    @try {
         [writingHandle synchronizeFile];
         [writingHandle closeFile];
-    }
-    @catch (NSException * exception)
-    {
-        KTVHCLogDataUnit(@"%p, Merge files close exception, %d\n%@", self, failed, exception);
-        failed = YES;
+    } @catch (NSException *exception) {
+        KTVHCLogDataUnit(@"%p, Merge files close exception, %@", self, exception);
+        error = [KTVHCError errorForException:exception];
     }
     KTVHCLogDataUnit(@"%p, Merge finished\ntotalLength : %lld\noffset : %lld", self, self.totalLength, offset);
-    if (failed || [KTVHCPathTools sizeOfItemAtPath:path] != self.totalLength)
-    {
-        [KTVHCPathTools deleteFileAtPath:path];
+    if (error || [KTVHCPathTool sizeAtPath:path] != self.totalLength) {
+        [KTVHCPathTool deleteFileAtPath:path];
         [self unlock];
         return NO;
     }
     KTVHCLogDataUnit(@"%p, Merge replace items", self);
-    KTVHCDataUnitItem * item = [[KTVHCDataUnitItem alloc] initWithPath:path offset:0];
-    for (KTVHCDataUnitItem * obj in self.unitItemsInternal)
-    {
-        [KTVHCPathTools deleteFileAtPath:obj.absolutePath];
+    KTVHCDataUnitItem *item = [[KTVHCDataUnitItem alloc] initWithPath:path];
+    for (KTVHCDataUnitItem *obj in self.unitItemsInternal) {
+        [KTVHCPathTool deleteFileAtPath:obj.absolutePath];
     }
     [self.unitItemsInternal removeAllObjects];
     [self.unitItemsInternal addObject:item];
@@ -375,33 +332,28 @@
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSRecursiveLock alloc] init];
     }
     [self.coreLock lock];
-    if (!self.lockingUnitItems)
-    {
+    if (!self.lockingUnitItems) {
         self.lockingUnitItems = [NSMutableArray array];
     }
-    NSArray <KTVHCDataUnitItem *> * objs = [NSArray arrayWithArray:self.unitItemsInternal];
+    NSArray<KTVHCDataUnitItem *> *objs = [NSArray arrayWithArray:self.unitItemsInternal];
     [self.lockingUnitItems addObject:objs];
-    for (KTVHCDataUnitItem * obj in objs)
-    {
+    for (KTVHCDataUnitItem *obj in objs) {
         [obj lock];
     }
 }
 
 - (void)unlock
 {
-    NSArray <KTVHCDataUnitItem *> * objs = self.lockingUnitItems.lastObject;
+    NSArray<KTVHCDataUnitItem *> *objs = self.lockingUnitItems.lastObject;
     [self.lockingUnitItems removeLastObject];
-    if (self.lockingUnitItems.count <= 0)
-    {
+    if (self.lockingUnitItems.count <= 0) {
         self.lockingUnitItems = nil;
     }
-    for (KTVHCDataUnitItem * obj in objs)
-    {
+    for (KTVHCDataUnitItem *obj in objs) {
         [obj unlock];
     }
     [self.coreLock unlock];

+ 8 - 10
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitItem.h

@@ -11,18 +11,16 @@
 @interface KTVHCDataUnitItem : NSObject <NSCopying, NSCoding, NSLocking>
 
 + (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithPath:(NSString *)path offset:(long long)offset;
+- (instancetype)initWithPath:(NSString *)path;
+- (instancetype)initWithPath:(NSString *)path offset:(uint64_t)offset;
 
-@property (nonatomic, assign, readonly) NSTimeInterval createTimeInterval;
+@property (nonatomic, copy, readonly) NSString *relativePath;
+@property (nonatomic, copy, readonly) NSString *absolutePath;
+@property (nonatomic, readonly) NSTimeInterval createTimeInterval;
+@property (nonatomic, readonly) long long offset;
+@property (nonatomic, readonly) long long length;
 
-@property (nonatomic, copy, readonly) NSString * relativePath;
-@property (nonatomic, copy, readonly) NSString * absolutePath;
-
-@property (nonatomic, assign, readonly) long long offset;
-@property (nonatomic, assign, readonly) long long length;
-
-- (void)setLength:(long long)length;
+- (void)updateLength:(long long)length;
 
 @end

+ 25 - 31
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitItem.m

@@ -7,12 +7,12 @@
 //
 
 #import "KTVHCDataUnitItem.h"
-#import "KTVHCPathTools.h"
+#import "KTVHCPathTool.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCDataUnitItem ()
 
-@property (nonatomic, strong) NSRecursiveLock * coreLock;
+@property (nonatomic, strong) NSRecursiveLock *coreLock;
 
 @end
 
@@ -21,7 +21,7 @@
 - (id)copyWithZone:(NSZone *)zone
 {
     [self lock];
-    KTVHCDataUnitItem * obj = [[KTVHCDataUnitItem alloc] initForCopy];
+    KTVHCDataUnitItem *obj = [[KTVHCDataUnitItem alloc] init];
     obj->_relativePath = self.relativePath;
     obj->_absolutePath = self.absolutePath;
     obj->_createTimeInterval = self.createTimeInterval;
@@ -31,37 +31,33 @@
     return obj;
 }
 
-- (instancetype)initForCopy
+- (instancetype)initWithPath:(NSString *)path
 {
-    if (self = [super init])
-    {
-        
-    }
-    return self;
+    return [self initWithPath:path offset:0];
 }
 
-- (instancetype)initWithPath:(NSString *)path offset:(long long)offset
+- (instancetype)initWithPath:(NSString *)path offset:(uint64_t)offset
 {
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        _createTimeInterval = [NSDate date].timeIntervalSince1970;
-        _relativePath = [KTVHCPathTools relativePathWithAbsoultePath:path];
-        _offset = offset;
-        [self prepare];
+    if (self = [super init]) {
+        self->_createTimeInterval = [NSDate date].timeIntervalSince1970;
+        self->_relativePath = [KTVHCPathTool converToRelativePath:path];
+        self->_absolutePath = [KTVHCPathTool converToAbsoultePath:path];
+        self->_offset = offset;
+        self->_length = [KTVHCPathTool sizeAtPath:self.absolutePath];
+        [self commonInit];
     }
     return self;
 }
 
 - (instancetype)initWithCoder:(NSCoder *)aDecoder
 {
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        _createTimeInterval = [[aDecoder decodeObjectForKey:@"createTimeInterval"] doubleValue];
-        _relativePath = [aDecoder decodeObjectForKey:@"relativePath"];
-        _offset = [[aDecoder decodeObjectForKey:@"offset"] longLongValue];
-        [self prepare];
+    if (self = [super init]) {
+        self->_createTimeInterval = [[aDecoder decodeObjectForKey:@"createTimeInterval"] doubleValue];
+        self->_relativePath = [aDecoder decodeObjectForKey:@"relativePath"];
+        self->_absolutePath = [KTVHCPathTool converToAbsoultePath:self.relativePath];
+        self->_offset = [[aDecoder decodeObjectForKey:@"offset"] longLongValue];
+        self->_length = [KTVHCPathTool sizeAtPath:self.absolutePath];
+        [self commonInit];
     }
     return self;
 }
@@ -78,25 +74,23 @@
     KTVHCLogDealloc(self);
 }
 
-- (void)prepare
+- (void)commonInit
 {
-    _absolutePath = [KTVHCPathTools absoultePathWithRelativePath:self.relativePath];
-    self.length = [KTVHCPathTools sizeOfItemAtPath:self.absolutePath];
+    KTVHCLogAlloc(self);
     KTVHCLogDataUnitItem(@"%p, Create Unit Item\nabsolutePath : %@\nrelativePath : %@\nOffset : %lld\nLength : %lld", self, self.absolutePath, self.relativePath, self.offset, self.length);
 }
 
-- (void)setLength:(long long)length
+- (void)updateLength:(long long)length
 {
     [self lock];
-    _length = length;
+    self->_length = length;
     KTVHCLogDataUnitItem(@"%p, Set length : %lld", self, length);
     [self unlock];
 }
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSRecursiveLock alloc] init];
     }
     [self.coreLock lock];

+ 1 - 1
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitPool.h

@@ -21,7 +21,7 @@
 
 - (long long)totalCacheLength;
 
-- (NSArray <KTVHCDataCacheItem *> *)allCacheItem;
+- (NSArray<KTVHCDataCacheItem *> *)allCacheItem;
 - (KTVHCDataCacheItem *)cacheItemWithURL:(NSURL *)URL;
 
 - (void)deleteUnitWithURL:(NSURL *)URL;

+ 71 - 91
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitPool.m

@@ -8,20 +8,20 @@
 
 #import "KTVHCDataUnitPool.h"
 #import "KTVHCDataUnitQueue.h"
-#import "KTVHCDataPrivate.h"
-#import "KTVHCPathTools.h"
-#import "KTVHCURLTools.h"
+#import "KTVHCData+Internal.h"
+#import "KTVHCPathTool.h"
+#import "KTVHCURLTool.h"
 #import "KTVHCLog.h"
 
 #import <UIKit/UIKit.h>
 
-@interface KTVHCDataUnitPool () <NSLocking, KTVHCDataUnitFileDelegate>
+@interface KTVHCDataUnitPool () <NSLocking, KTVHCDataUnitDelegate>
 
-@property (nonatomic, strong) NSRecursiveLock * coreLock;
-@property (nonatomic, strong) KTVHCDataUnitQueue * unitQueue;
-@property (nonatomic, assign) int64_t expectArchiveIndex;
-@property (nonatomic, assign) int64_t actualArchiveIndex;
+@property (nonatomic, strong) NSRecursiveLock *coreLock;
+@property (nonatomic, strong) KTVHCDataUnitQueue *unitQueue;
 @property (nonatomic, strong) dispatch_queue_t archiveQueue;
+@property (nonatomic) int64_t expectArchiveIndex;
+@property (nonatomic) int64_t actualArchiveIndex;
 
 @end
 
@@ -29,7 +29,7 @@
 
 + (instancetype)pool
 {
-    static KTVHCDataUnitPool * obj = nil;
+    static KTVHCDataUnitPool *obj = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         obj = [[self alloc] init];
@@ -39,12 +39,10 @@
 
 - (instancetype)init
 {
-    if (self = [super init])
-    {
-        self.unitQueue = [KTVHCDataUnitQueue queueWithPath:[KTVHCPathTools archivePath]];
-        for (KTVHCDataUnit * obj in self.unitQueue.allUnits)
-        {
-            obj.fileDelegate = self;
+    if (self = [super init]) {
+        self.unitQueue = [[KTVHCDataUnitQueue alloc] initWithPath:[KTVHCPathTool archivePath]];
+        for (KTVHCDataUnit *obj in self.unitQueue.allUnits) {
+            obj.delegate = self;
         }
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
         [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
@@ -61,17 +59,15 @@
 
 - (KTVHCDataUnit *)unitWithURL:(NSURL *)URL
 {
-    if (URL.absoluteString.length <= 0)
-    {
+    if (URL.absoluteString.length <= 0) {
         return nil;
     }
     [self lock];
-    NSString * key = [KTVHCURLTools keyWithURL:URL];
-    KTVHCDataUnit * unit = [self.unitQueue unitWithKey:key];
-    if (!unit)
-    {
-        unit = [KTVHCDataUnit unitWithURL:URL];
-        unit.fileDelegate = self;
+    NSString *key = [[KTVHCURLTool tool] keyWithURL:URL];
+    KTVHCDataUnit *unit = [self.unitQueue unitWithKey:key];
+    if (!unit) {
+        unit = [[KTVHCDataUnit alloc] initWithURL:URL];
+        unit.delegate = self;
         KTVHCLogDataUnitPool(@"%p, Insert Unit, %@", self, unit);
         [self.unitQueue putUnit:unit];
         [self setNeedsArchive];
@@ -85,9 +81,8 @@
 {
     [self lock];
     long long length = 0;
-    NSArray <KTVHCDataUnit *> * units = [self.unitQueue allUnits];
-    for (KTVHCDataUnit * obj in units)
-    {
+    NSArray<KTVHCDataUnit *> *units = [self.unitQueue allUnits];
+    for (KTVHCDataUnit *obj in units) {
         length += obj.cacheLength;
     }
     [self unlock];
@@ -96,48 +91,45 @@
 
 - (KTVHCDataCacheItem *)cacheItemWithURL:(NSURL *)URL
 {
-    if (URL.absoluteString.length <= 0)
-    {
+    if (URL.absoluteString.length <= 0) {
         return nil;
     }
     [self lock];
-    KTVHCDataCacheItem * cacheItem = nil;
-    NSString * key = [KTVHCURLTools keyWithURL:URL];
-    KTVHCDataUnit * obj = [self.unitQueue unitWithKey:key];
-    if (obj)
-    {
-        NSArray * items = obj.unitItems;
-        NSMutableArray * itemZones = [NSMutableArray array];
-        for (KTVHCDataUnitItem * unitItem in items)
-        {
-            KTVHCDataCacheItemZone * itemZone = [KTVHCDataCacheItemZone itemZoneWithOffset:unitItem.offset length:unitItem.length];
-            [itemZones addObject:itemZone];
+    KTVHCDataCacheItem *cacheItem = nil;
+    NSString *key = [[KTVHCURLTool tool] keyWithURL:URL];
+    KTVHCDataUnit *obj = [self.unitQueue unitWithKey:key];
+    if (obj) {
+        NSArray *items = obj.unitItems;
+        NSMutableArray *zones = [NSMutableArray array];
+        for (KTVHCDataUnitItem *item in items) {
+            KTVHCDataCacheItemZone *zone = [[KTVHCDataCacheItemZone alloc] initWithOffset:item.offset length:item.length];
+            [zones addObject:zone];
         }
-        if (itemZones.count <= 0)
-        {
-            itemZones = nil;
+        if (zones.count == 0) {
+            zones = nil;
         }
-        cacheItem = [KTVHCDataCacheItem itemWithURL:obj.URL totalLength:obj.totalLength cacheLength:obj.cacheLength vaildLength:obj.validLength zones:itemZones];
+        cacheItem = [[KTVHCDataCacheItem alloc] initWithURL:obj.URL
+                                                      zones:zones
+                                                totalLength:obj.totalLength
+                                                cacheLength:obj.cacheLength
+                                                vaildLength:obj.validLength];
     }
     [self unlock];
     return cacheItem;
 }
 
-- (NSArray <KTVHCDataCacheItem *> *)allCacheItem
+- (NSArray<KTVHCDataCacheItem *> *)allCacheItem
 {
     [self lock];
-    NSMutableArray * cacheItems = [NSMutableArray array];
-    NSArray <KTVHCDataUnit *> * units = [self.unitQueue allUnits];
-    for (KTVHCDataUnit * obj in units)
-    {
-        KTVHCDataCacheItem * cacheItem = [self cacheItemWithURL:obj.URL];
-        if (cacheItem)
-        {
+    NSMutableArray *cacheItems = [NSMutableArray array];
+    NSArray<KTVHCDataUnit *> *units = [self.unitQueue allUnits];
+    for (KTVHCDataUnit *obj in units) {
+        KTVHCDataCacheItem *cacheItem = [self cacheItemWithURL:obj.URL];
+        if (cacheItem) {
             [cacheItems addObject:cacheItem];
         }
     }
-    if (cacheItems.count <= 0)
-    {
+    if (cacheItems.count == 0) {
         cacheItems = nil;
     }
     [self unlock];
@@ -146,15 +138,13 @@
 
 - (void)deleteUnitWithURL:(NSURL *)URL
 {
-    if (URL.absoluteString.length <= 0)
-    {
+    if (URL.absoluteString.length <= 0) {
         return;
     }
     [self lock];
-    NSString * key = [KTVHCURLTools keyWithURL:URL];
-    KTVHCDataUnit * obj = [self.unitQueue unitWithKey:key];
-    if (obj && obj.workingCount <= 0)
-    {
+    NSString *key = [[KTVHCURLTool tool] keyWithURL:URL];
+    KTVHCDataUnit *obj = [self.unitQueue unitWithKey:key];
+    if (obj && obj.workingCount <= 0) {
         KTVHCLogDataUnit(@"%p, Delete Unit\nUnit : %@\nFunc : %s", self, obj, __func__);
         [obj deleteFiles];
         [self.unitQueue popUnit:obj];
@@ -165,15 +155,14 @@
 
 - (void)deleteUnitsWithLength:(long long)length
 {
-    if (length <= 0)
-    {
+    if (length <= 0) {
         return;
     }
     [self lock];
     BOOL needArchive = NO;
     long long currentLength = 0;
-    NSArray <KTVHCDataUnit *> * units = [self.unitQueue allUnits];
-    [units sortedArrayUsingComparator:^NSComparisonResult(KTVHCDataUnit * obj1, KTVHCDataUnit * obj2) {
+    NSArray<KTVHCDataUnit *> *units = [self.unitQueue allUnits];
+    [units sortedArrayUsingComparator:^NSComparisonResult(KTVHCDataUnit *obj1, KTVHCDataUnit *obj2) {
         NSComparisonResult result = NSOrderedDescending;
         [obj1 lock];
         [obj2 lock];
@@ -188,10 +177,8 @@
         [obj2 unlock];
         return result;
     }];
-    for (KTVHCDataUnit * obj in units)
-    {
-        if (obj.workingCount <= 0)
-        {
+    for (KTVHCDataUnit *obj in units) {
+        if (obj.workingCount <= 0) {
             [obj lock];
             currentLength += obj.cacheLength;
             KTVHCLogDataUnit(@"%p, Delete Unit\nUnit : %@\nFunc : %s", self, obj, __func__);
@@ -200,13 +187,11 @@
             [self.unitQueue popUnit:obj];
             needArchive = YES;
         }
-        if (currentLength >= length)
-        {
+        if (currentLength >= length) {
             break;
         }
     }
-    if (needArchive)
-    {
+    if (needArchive) {
         [self setNeedsArchive];
     }
     [self unlock];
@@ -216,43 +201,33 @@
 {
     [self lock];
     BOOL needArchive = NO;
-    NSArray <KTVHCDataUnit *> * units = [self.unitQueue allUnits];
-    for (KTVHCDataUnit * obj in units)
-    {
-        if (obj.workingCount <= 0)
-        {
+    NSArray<KTVHCDataUnit *> *units = [self.unitQueue allUnits];
+    for (KTVHCDataUnit *obj in units) {
+        if (obj.workingCount <= 0) {
             KTVHCLogDataUnit(@"%p, Delete Unit\nUnit : %@\nFunc : %s", self, obj, __func__);
             [obj deleteFiles];
             [self.unitQueue popUnit:obj];
             needArchive = YES;
         }
     }
-    if (needArchive)
-    {
+    if (needArchive) {
         [self setNeedsArchive];
     }
     [self unlock];
 }
 
-- (void)unitShouldRearchive:(KTVHCDataUnit *)unit
-{
-    [self setNeedsArchive];
-}
-
 - (void)setNeedsArchive
 {
     [self lock];
     self.expectArchiveIndex += 1;
     int64_t expectArchiveIndex = self.expectArchiveIndex;
     [self unlock];
-    if (!self.archiveQueue)
-    {
+    if (!self.archiveQueue) {
         self.archiveQueue = dispatch_queue_create("KTVHTTPCache-archiveQueue", DISPATCH_QUEUE_SERIAL);
     }
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), self.archiveQueue, ^{
         [self lock];
-        if (self.expectArchiveIndex == expectArchiveIndex)
-        {
+        if (self.expectArchiveIndex == expectArchiveIndex) {
             [self archiveIfNeeded];
         }
         [self unlock];
@@ -262,14 +237,20 @@
 - (void)archiveIfNeeded
 {
     [self lock];
-    if (self.actualArchiveIndex != self.expectArchiveIndex)
-    {
+    if (self.actualArchiveIndex != self.expectArchiveIndex) {
         self.actualArchiveIndex = self.expectArchiveIndex;
         [self.unitQueue archive];
     }
     [self unlock];
 }
 
+#pragma mark - KTVHCDataUnitDelegate
+
+- (void)ktv_unitDidChangeMetadata:(KTVHCDataUnit *)unit
+{
+    [self setNeedsArchive];
+}
+
 #pragma mark - UIApplicationWillTerminateNotification
 
 - (void)applicationWillTerminate:(NSNotification *)notification
@@ -291,8 +272,7 @@
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSRecursiveLock alloc] init];
     }
     [self.coreLock lock];

+ 2 - 2
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitQueue.h

@@ -14,9 +14,9 @@
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-+ (instancetype)queueWithPath:(NSString *)path;
+- (instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER;
 
-- (NSArray <KTVHCDataUnit *> *)allUnits;
+- (NSArray<KTVHCDataUnit *> *)allUnits;
 - (KTVHCDataUnit *)unitWithKey:(NSString *)key;
 
 - (void)putUnit:(KTVHCDataUnit *)unit;

+ 20 - 35
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDataStorage/KTVHCDataUnitQueue.m

@@ -11,62 +11,51 @@
 
 @interface KTVHCDataUnitQueue ()
 
-@property (nonatomic, copy) NSString * path;
-@property (nonatomic, strong) NSMutableArray <KTVHCDataUnit *> * unitArray;
+@property (nonatomic, copy) NSString *path;
+@property (nonatomic, strong) NSMutableArray<KTVHCDataUnit *> *unitArray;
 
 @end
 
 @implementation KTVHCDataUnitQueue
 
-+ (instancetype)queueWithPath:(NSString *)path
-{
-    return [[self alloc] initWithPath:path];
-}
-
 - (instancetype)initWithPath:(NSString *)path
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         self.path = path;
-        NSMutableArray * unitArray = nil;
+        NSMutableArray *unitArray = nil;
         @try {
             unitArray = [NSKeyedUnarchiver unarchiveObjectWithFile:self.path];
-        } @catch (NSException * exception) {
+        } @catch (NSException *exception) {
             KTVHCLogDataUnitQueue(@"%p, Init exception\nname : %@\breason : %@\nuserInfo : %@", self, exception.name, exception.reason, exception.userInfo);
         }
         self.unitArray = [NSMutableArray array];
-        for (KTVHCDataUnit * obj in unitArray) {
-            if (obj.valid) {
-                [self.unitArray addObject:obj];
-            } else {
+        for (KTVHCDataUnit *obj in unitArray) {
+            if (obj.error) {
                 [obj deleteFiles];
+            } else {
+                [self.unitArray addObject:obj];
             }
         }
     }
     return self;
 }
 
-- (NSArray <KTVHCDataUnit *> *)allUnits
+- (NSArray<KTVHCDataUnit *> *)allUnits
 {
-    if (self.unitArray.count <= 0)
-    {
+    if (self.unitArray.count <= 0) {
         return nil;
     }
-    NSArray <KTVHCDataUnit *> * units = [self.unitArray copy];
-    return units;
+    return [self.unitArray copy];
 }
 
 - (KTVHCDataUnit *)unitWithKey:(NSString *)key
 {
-    if (key.length <= 0)
-    {
+    if (key.length <= 0) {
         return nil;
     }
-    KTVHCDataUnit * unit = nil;
-    for (KTVHCDataUnit * obj in self.unitArray)
-    {
-        if ([obj.key isEqualToString:key])
-        {
+    KTVHCDataUnit *unit = nil;
+    for (KTVHCDataUnit *obj in self.unitArray) {
+        if ([obj.key isEqualToString:key]) {
             unit = obj;
             break;
         }
@@ -76,24 +65,20 @@
 
 - (void)putUnit:(KTVHCDataUnit *)unit
 {
-    if (!unit)
-    {
+    if (!unit) {
         return;
     }
-    if (![self.unitArray containsObject:unit])
-    {
+    if (![self.unitArray containsObject:unit]) {
         [self.unitArray addObject:unit];
     }
 }
 
 - (void)popUnit:(KTVHCDataUnit *)unit
 {
-    if (!unit)
-    {
+    if (!unit) {
         return;
     }
-    if ([self.unitArray containsObject:unit])
-    {
+    if ([self.unitArray containsObject:unit]) {
         [self.unitArray removeObject:unit];
     }
 }

+ 10 - 10
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDownload/KTVHCDownload.h

@@ -7,9 +7,9 @@
 //
 
 #import <Foundation/Foundation.h>
-#import "KTVHCDataRequest.h"
 #import "KTVHCDataResponse.h"
-#import "KTVHCCommon.h"
+#import "KTVHCDataRequest.h"
+#import "KTVHCMacro.h"
 
 KTVHTTPCACHE_EXTERN NSString * const KTVHCContentTypeVideo;
 KTVHTTPCACHE_EXTERN NSString * const KTVHCContentTypeAudio;
@@ -21,9 +21,9 @@ KTVHTTPCACHE_EXTERN NSString * const KTVHCContentTypeBinaryOctetStream;
 
 @protocol KTVHCDownloadDelegate <NSObject>
 
-- (void)download:(KTVHCDownload *)download didCompleteWithError:(NSError *)error;
-- (void)download:(KTVHCDownload *)download didReceiveResponse:(KTVHCDataResponse *)response;
-- (void)download:(KTVHCDownload *)download didReceiveData:(NSData *)data;
+- (void)ktv_download:(KTVHCDownload *)download didCompleteWithError:(NSError *)error;
+- (void)ktv_download:(KTVHCDownload *)download didReceiveResponse:(KTVHCDataResponse *)response;
+- (void)ktv_download:(KTVHCDownload *)download didReceiveData:(NSData *)data;
 
 @end
 
@@ -34,19 +34,19 @@ KTVHTTPCACHE_EXTERN NSString * const KTVHCContentTypeBinaryOctetStream;
 
 + (instancetype)download;
 
-@property (nonatomic, assign) NSTimeInterval timeoutInterval;
+@property (nonatomic) NSTimeInterval timeoutInterval;
 
 /**
  *  Header Fields
  */
-@property (nonatomic, copy) NSArray <NSString *> * whitelistHeaderKeys;
-@property (nonatomic, copy) NSDictionary <NSString *, NSString *> * additionalHeaders;
+@property (nonatomic, copy) NSArray<NSString *> *whitelistHeaderKeys;
+@property (nonatomic, copy) NSDictionary<NSString *, NSString *> *additionalHeaders;
 
 /**
  *  Content-Type
  */
-@property (nonatomic, copy) NSArray <NSString *> * acceptContentTypes;
-@property (nonatomic, copy) BOOL (^unsupportContentTypeFilter)(NSURL * URL, NSString * contentType);
+@property (nonatomic, copy) NSArray<NSString *> *acceptableContentTypes;
+@property (nonatomic, copy) BOOL (^unacceptableContentTypeDisposer)(NSURL *URL, NSString *contentType);
 
 - (NSURLSessionTask *)downloadWithRequest:(KTVHCDataRequest *)request delegate:(id<KTVHCDownloadDelegate>)delegate;
 

+ 118 - 135
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCDownload/KTVHCDownload.m

@@ -7,6 +7,7 @@
 //
 
 #import "KTVHCDownload.h"
+#import "KTVHCData+Internal.h"
 #import "KTVHCDataUnitPool.h"
 #import "KTVHCDataStorage.h"
 #import "KTVHCError.h"
@@ -22,13 +23,14 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 
 @interface KTVHCDownload () <NSURLSessionDataDelegate, NSLocking>
 
-@property (nonatomic, strong) NSLock * coreLock;
-@property (nonatomic, strong) NSURLSession * session;
-@property (nonatomic, strong) NSOperationQueue * sessionDelegateQueue;
-@property (nonatomic, strong) NSURLSessionConfiguration * sessionConfiguration;
-@property (nonatomic, strong) NSMutableDictionary <NSURLSessionTask *, NSError *> * errorDictionary;
-@property (nonatomic, strong) NSMutableDictionary <NSURLSessionTask *, KTVHCDataRequest *> * requestDictionary;
-@property (nonatomic, strong) NSMutableDictionary <NSURLSessionTask *, id<KTVHCDownloadDelegate>> * delegateDictionary;
+@property (nonatomic, strong) NSLock *coreLock;
+@property (nonatomic, strong) NSURLSession *session;
+@property (nonatomic, strong) NSOperationQueue *sessionDelegateQueue;
+@property (nonatomic, strong) NSURLSessionConfiguration *sessionConfiguration;
+@property (nonatomic, strong) NSMutableDictionary<NSURLSessionTask *, NSError *> *errorDictionary;
+@property (nonatomic, strong) NSMutableDictionary<NSURLSessionTask *, KTVHCDataRequest *> *requestDictionary;
+@property (nonatomic, strong) NSMutableDictionary<NSURLSessionTask *, id<KTVHCDownloadDelegate>> *delegateDictionary;
+@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
 
 @end
 
@@ -36,7 +38,7 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 
 + (instancetype)download
 {
-    static KTVHCDownload * obj = nil;
+    static KTVHCDownload *obj = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         obj = [[self alloc] init];
@@ -46,10 +48,10 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 
 - (instancetype)init
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
         self.timeoutInterval = 30.0f;
+        self.backgroundTask = UIBackgroundTaskInvalid;
         self.errorDictionary = [NSMutableDictionary dictionary];
         self.requestDictionary = [NSMutableDictionary dictionary];
         self.delegateDictionary = [NSMutableDictionary dictionary];
@@ -61,11 +63,11 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
         self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration
                                                      delegate:self
                                                 delegateQueue:self.sessionDelegateQueue];
-        self.acceptContentTypes = @[KTVHCContentTypeVideo,
-                                    KTVHCContentTypeAudio,
-                                    KTVHCContentTypeApplicationMPEG4,
-                                    KTVHCContentTypeApplicationOctetStream,
-                                    KTVHCContentTypeBinaryOctetStream];
+        self.acceptableContentTypes = @[KTVHCContentTypeVideo,
+                                        KTVHCContentTypeAudio,
+                                        KTVHCContentTypeApplicationMPEG4,
+                                        KTVHCContentTypeApplicationOctetStream,
+                                        KTVHCContentTypeBinaryOctetStream];
         [[NSNotificationCenter defaultCenter] addObserver:self
                                                  selector:@selector(applicationDidEnterBackground:)
                                                      name:UIApplicationDidEnterBackgroundNotification
@@ -81,43 +83,45 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 - (void)dealloc
 {
     KTVHCLogDealloc(self);
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
 
-- (NSArray <NSString *> *)availableHeaderKeys
+- (NSArray<NSString *> *)availableHeaderKeys
 {
-    static NSArray <NSString *> * availableHeaderKeys = nil;
+    static NSArray<NSString *> *obj = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
-        availableHeaderKeys = @[@"User-Agent",
-                                @"Connection",
-                                @"Accept",
-                                @"Accept-Encoding",
-                                @"Accept-Language",
-                                @"Range"];
+        obj = @[@"User-Agent",
+                @"Connection",
+                @"Accept",
+                @"Accept-Encoding",
+                @"Accept-Language",
+                @"Range"];
     });
-    return availableHeaderKeys;
+    return obj;
 }
 
 - (NSURLSessionTask *)downloadWithRequest:(KTVHCDataRequest *)request delegate:(id<KTVHCDownloadDelegate>)delegate
 {
     [self lock];
-    NSMutableURLRequest * HTTPRequest = [NSMutableURLRequest requestWithURL:request.URL];
-    [request.headers enumerateKeysAndObjectsUsingBlock:^(NSString * key, NSString * obj, BOOL * stop) {
-        if ([[self availableHeaderKeys] containsObject:key] || [self.whitelistHeaderKeys containsObject:key]) {
-            [HTTPRequest setValue:obj forHTTPHeaderField:key];
+    NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:request.URL];
+    mRequest.timeoutInterval = self.timeoutInterval;
+    mRequest.cachePolicy = NSURLRequestReloadIgnoringCacheData;
+    [request.headers enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
+        if ([self.availableHeaderKeys containsObject:key] ||
+            [self.whitelistHeaderKeys containsObject:key]) {
+            [mRequest setValue:obj forHTTPHeaderField:key];
         }
     }];
-    HTTPRequest.timeoutInterval = self.timeoutInterval;
-    HTTPRequest.cachePolicy = NSURLRequestReloadIgnoringCacheData;
-    [self.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
-        [HTTPRequest setValue:obj forHTTPHeaderField:key];
+    [self.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
+        [mRequest setValue:obj forHTTPHeaderField:key];
     }];
-    NSURLSessionDataTask * task = [self.session dataTaskWithRequest:HTTPRequest];
-    task.priority = 1.0;
+    NSURLSessionDataTask *task = [self.session dataTaskWithRequest:mRequest];
     [self.requestDictionary setObject:request forKey:task];
     [self.delegateDictionary setObject:delegate forKey:task];
-    KTVHCLogDownload(@"%p, Add Request\nrequest : %@\nURL : %@\nheaders : %@\nHTTPRequest headers : %@\nCount : %d", self, request, request.URL, request.headers, HTTPRequest.allHTTPHeaderFields, (int)self.delegateDictionary.count);
+    task.priority = 1.0;
     [task resume];
+    KTVHCLogDownload(@"%p, Add Request\nrequest : %@\nURL : %@\nheaders : %@\nHTTPRequest headers : %@\nCount : %d", self, request, request.URL, request.headers, mRequest.allHTTPHeaderFields, (int)self.delegateDictionary.count);
     [self unlock];
     return task;
 }
@@ -126,92 +130,84 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 {
     [self lock];
     KTVHCLogDownload(@"%p, Complete\nError : %@", self, error);
-    id <KTVHCDownloadDelegate> delegate = [self.delegateDictionary objectForKey:task];
-    NSError * cancelError = [self.errorDictionary objectForKey:task];
-    if (cancelError)
-    {
-        error = cancelError;
+    if ([self.errorDictionary objectForKey:task]) {
+        error = [self.errorDictionary objectForKey:task];
     }
-    [delegate download:self didCompleteWithError:error];
+    id<KTVHCDownloadDelegate> delegate = [self.delegateDictionary objectForKey:task];
+    [delegate ktv_download:self didCompleteWithError:error];
     [self.delegateDictionary removeObjectForKey:task];
     [self.requestDictionary removeObjectForKey:task];
     [self.errorDictionary removeObjectForKey:task];
-    if (self.delegateDictionary.count <= 0)
-    {
-        [self cleanBackgroundTaskAsync];
+    if (self.delegateDictionary.count <= 0) {
+        [self endBackgroundTaskDelay];
     }
     [self unlock];
 }
 
-- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task didReceiveResponse:(NSHTTPURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
 {
     [self lock];
-    NSHTTPURLResponse * HTTPResponse = (NSHTTPURLResponse *)response;
-    KTVHCDataRequest * dataRequest = [self.requestDictionary objectForKey:dataTask];
-    KTVHCDataResponse * dataResponse = [[KTVHCDataResponse alloc] initWithURL:dataRequest.URL headers:HTTPResponse.allHeaderFields];
-    KTVHCLogDownload(@"%p, Receive response\nrequest : %@\nresponse : %@\nHTTPResponse : %@", self, dataRequest, dataResponse, [(NSHTTPURLResponse *)response allHeaderFields]);
-    NSError * error = nil;
-    if (!error)
-    {
-        if (HTTPResponse.statusCode > 400)
-        {
-            error = [KTVHCError errorForResponseUnavailable:dataTask.currentRequest.URL request:dataTask.currentRequest response:dataTask.response];
+    KTVHCDataRequest *dataRequest = [self.requestDictionary objectForKey:task];
+    KTVHCDataResponse *dataResponse = [[KTVHCDataResponse alloc] initWithURL:dataRequest.URL headers:response.allHeaderFields];
+    KTVHCLogDownload(@"%p, Receive response\nrequest : %@\nresponse : %@\nHTTPResponse : %@", self, dataRequest, dataResponse, response.allHeaderFields);
+    NSError *error = nil;
+    if (!error) {
+        if (response.statusCode > 400) {
+            error = [KTVHCError errorForResponseUnavailable:task.currentRequest.URL
+                                                    request:task.currentRequest
+                                                   response:task.response];
         }
-        if (!error)
-        {
-            BOOL contentTypeVaild = NO;
-            if (dataResponse.contentType.length > 0)
-            {
-                for (NSString * obj in self.acceptContentTypes)
-                {
-                    if ([[dataResponse.contentType lowercaseString] containsString:[obj lowercaseString]])
-                    {
-                        contentTypeVaild = YES;
-                    }
-                }
-                if (!contentTypeVaild && self.unsupportContentTypeFilter)
-                {
-                    contentTypeVaild = self.unsupportContentTypeFilter(dataRequest.URL, dataResponse.contentType);
+    }
+    if (!error) {
+        BOOL vaild = NO;
+        if (dataResponse.contentType.length > 0) {
+            for (NSString *obj in self.acceptableContentTypes) {
+                if ([[dataResponse.contentType lowercaseString] containsString:[obj lowercaseString]]) {
+                    vaild = YES;
                 }
             }
-            if (!contentTypeVaild)
-            {
-                error = [KTVHCError errorForUnsupportContentType:dataTask.currentRequest.URL request:dataTask.currentRequest response:dataTask.response];
+            if (!vaild && self.unacceptableContentTypeDisposer) {
+                vaild = self.unacceptableContentTypeDisposer(dataRequest.URL, dataResponse.contentType);
             }
-            if (!error)
-            {
-                if (dataResponse.currentLength <= 0 ||
-                    (!KTVHCRangeIsFull(dataRequest.range) &&
-                     (dataResponse.currentLength != KTVHCRangeGetLength(dataRequest.range))))
-                {
-                    error = [KTVHCError errorForUnsupportContentType:dataTask.currentRequest.URL request:dataTask.currentRequest response:dataTask.response];
-                }
-                if (!error)
-                {
-                    long long length = dataResponse.currentLength + [KTVHCDataStorage storage].totalCacheLength - [KTVHCDataStorage storage].maxCacheLength;
-                    if (length > 0)
-                    {
-                        [[KTVHCDataUnitPool pool] deleteUnitsWithLength:length];
-                        length = dataResponse.currentLength + [KTVHCDataStorage storage].totalCacheLength - [KTVHCDataStorage storage].maxCacheLength;
-                        if (length > 0)
-                        {
-                            error = [KTVHCError errorForNotEnoughDiskSpace:dataResponse.totalLength request:dataResponse.currentLength totalCacheLength:[KTVHCDataStorage storage].totalCacheLength maxCacheLength:[KTVHCDataStorage storage].maxCacheLength];
-                        }
-                    }
-                }
+        }
+        if (!vaild) {
+            error = [KTVHCError errorForUnsupportContentType:task.currentRequest.URL
+                                                     request:task.currentRequest
+                                                    response:task.response];
+        }
+    }
+    if (!error) {
+        if (dataResponse.contentLength <= 0 ||
+            (!KTVHCRangeIsFull(dataRequest.range) &&
+             (dataResponse.contentLength != KTVHCRangeGetLength(dataRequest.range)))) {
+                error = [KTVHCError errorForUnsupportContentType:task.currentRequest.URL
+                                                         request:task.currentRequest
+                                                        response:task.response];
+            }
+    }
+    if (!error) {
+        long long (^getDeletionLength)(long long) = ^(long long desireLength){
+            return desireLength + [KTVHCDataStorage storage].totalCacheLength - [KTVHCDataStorage storage].maxCacheLength;
+        };
+        long long length = getDeletionLength(dataResponse.contentLength);
+        if (length > 0) {
+            [[KTVHCDataUnitPool pool] deleteUnitsWithLength:length];
+            length = getDeletionLength(dataResponse.contentLength);
+            if (length > 0) {
+                error = [KTVHCError errorForNotEnoughDiskSpace:dataResponse.totalLength
+                                                       request:dataResponse.contentLength
+                                              totalCacheLength:[KTVHCDataStorage storage].totalCacheLength
+                                                maxCacheLength:[KTVHCDataStorage storage].maxCacheLength];
             }
         }
     }
-    if (error)
-    {
+    if (error) {
         KTVHCLogDownload(@"%p, Invaild response\nError : %@", self, error);
-        [self.errorDictionary setObject:error forKey:dataTask];
+        [self.errorDictionary setObject:error forKey:task];
         completionHandler(NSURLSessionResponseCancel);
-    }
-    else
-    {
-        id <KTVHCDownloadDelegate> delegate = [self.delegateDictionary objectForKey:dataTask];
-        [delegate download:self didReceiveResponse:dataResponse];
+    } else {
+        id<KTVHCDownloadDelegate> delegate = [self.delegateDictionary objectForKey:task];
+        [delegate ktv_download:self didReceiveResponse:dataResponse];
         completionHandler(NSURLSessionResponseAllow);
     }
     [self unlock];
@@ -229,16 +225,15 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 {
     [self lock];
     KTVHCLogDownload(@"%p, Receive data - Begin\nLength : %lld\nURL : %@", self, (long long)data.length, dataTask.originalRequest.URL.absoluteString);
-    id <KTVHCDownloadDelegate> delegate = [self.delegateDictionary objectForKey:dataTask];
-    [delegate download:self didReceiveData:data];
+    id<KTVHCDownloadDelegate> delegate = [self.delegateDictionary objectForKey:dataTask];
+    [delegate ktv_download:self didReceiveData:data];
     KTVHCLogDownload(@"%p, Receive data - End\nLength : %lld\nURL : %@", self, (long long)data.length, dataTask.originalRequest.URL.absoluteString);
     [self unlock];
 }
 
 - (void)lock
 {
-    if (!self.coreLock)
-    {
+    if (!self.coreLock) {
         self.coreLock = [[NSLock alloc] init];
     }
     [self.coreLock lock];
@@ -251,53 +246,41 @@ NSString * const KTVHCContentTypeBinaryOctetStream      = @"binary/octet-stream"
 
 #pragma mark - Background Task
 
-static UIBackgroundTaskIdentifier backgroundTaskIdentifier = -1;
-
 - (void)applicationDidEnterBackground:(NSNotification *)notification
 {
-    [self cleanBackgroundTask];
     [self lock];
-    if (self.delegateDictionary.count > 0)
-    {
-        backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
-            [self cleanBackgroundTask];
-        }];
-        UIBackgroundTaskIdentifier blockIdentifier = backgroundTaskIdentifier;
-        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(300 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
-            if (blockIdentifier == backgroundTaskIdentifier)
-            {
-                [self cleanBackgroundTask];
-            }
-        });
+    if (self.delegateDictionary.count > 0) {
+        [self beginBackgroundTask];
     }
     [self unlock];
 }
 
 - (void)applicationWillEnterForeground:(NSNotification *)notification
 {
-    [self cleanBackgroundTask];
+    [self endBackgroundTask];
 }
 
-- (void)cleanBackgroundTask
+- (void)beginBackgroundTask
 {
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        backgroundTaskIdentifier = UIBackgroundTaskInvalid;
-    });
-    if (backgroundTaskIdentifier != UIBackgroundTaskInvalid)
-    {
-        [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier];
-        backgroundTaskIdentifier = UIBackgroundTaskInvalid;
+    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+        [self endBackgroundTask];
+    }];
+}
+
+- (void)endBackgroundTask
+{
+    if (self.backgroundTask != UIBackgroundTaskInvalid) {
+        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
+        self.backgroundTask = UIBackgroundTaskInvalid;
     }
 }
 
-- (void)cleanBackgroundTaskAsync
+- (void)endBackgroundTaskDelay
 {
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         [self lock];
-        if (self.delegateDictionary.count <= 0)
-        {
-            [self cleanBackgroundTask];
+        if (self.delegateDictionary.count <= 0) {
+            [self endBackgroundTask];
         }
         [self unlock];
     });

+ 0 - 2
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPConnection.h

@@ -11,6 +11,4 @@
 
 @interface KTVHCHTTPConnection : HTTPConnection
 
-+ (NSString *)pingResponseValue;
-
 @end

+ 8 - 30
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPConnection.m

@@ -7,23 +7,16 @@
 //
 
 #import "KTVHCHTTPConnection.h"
-#import "KTVHCHTTPRequest.h"
 #import "KTVHCHTTPResponse.h"
-#import "KTVHCHTTPPingResponse.h"
-#import "KTVHCHTTPURL.h"
+#import "KTVHCDataStorage.h"
+#import "KTVHCURLTool.h"
 #import "KTVHCLog.h"
 
 @implementation KTVHCHTTPConnection
 
-+ (NSString *)pingResponseValue
-{
-    return KTVHCHTTPPingResponseResponseValue;
-}
-
 - (id)initWithAsyncSocket:(GCDAsyncSocket *)newSocket configuration:(HTTPConfig *)aConfig
 {
-    if (self = [super initWithAsyncSocket:newSocket configuration:aConfig])
-    {
+    if (self = [super initWithAsyncSocket:newSocket configuration:aConfig]) {
         KTVHCLogAlloc(self);
     }
     return self;
@@ -37,26 +30,11 @@
 - (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path
 {
     KTVHCLogHTTPConnection(@"%p, Receive request\nmethod : %@\npath : %@\nURL : %@", self, method, path, request.url);
-    KTVHCHTTPURL * URL = [[KTVHCHTTPURL alloc] initWithProxyURL:request.url];
-    switch (URL.type)
-    {
-        case KTVHCHTTPURLTypeUnknown:
-            return nil;
-        case KTVHCHTTPURLTypePing:
-        {
-            KTVHCHTTPPingResponse * currentResponse = [KTVHCHTTPPingResponse responseWithConnection:self];
-            return currentResponse;
-        }
-        case KTVHCHTTPURLTypeContent:
-        {
-            KTVHCHTTPRequest * currentRequest = [[KTVHCHTTPRequest alloc] initWithURL:URL.URL headers:request.allHeaderFields];
-            currentRequest.method = request.method;
-            currentRequest.version = request.version;
-            KTVHCHTTPResponse * currentResponse = [[KTVHCHTTPResponse alloc] initWithConnection:self request:currentRequest];
-            return currentResponse;
-        }
-    }
-    return nil;
+    NSDictionary<NSString *,NSString *> *parameters = [[KTVHCURLTool tool] parseQuery:request.url.query];
+    NSURL *URL = [NSURL URLWithString:[parameters objectForKey:@"url"]];
+    KTVHCDataRequest *dataRequest = [[KTVHCDataRequest alloc] initWithURL:URL headers:request.allHeaderFields];
+    KTVHCHTTPResponse *response = [[KTVHCHTTPResponse alloc] initWithConnection:self dataRequest:dataRequest];
+    return response;
 }
 
 

+ 0 - 24
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPPingResponse.h

@@ -1,24 +0,0 @@
-//
-//  KTVHCHTTPPingResponse.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/10/23.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "KTVHCHTTPHeader.h"
-#import "KTVHCCommon.h"
-
-@class KTVHCHTTPConnection;
-
-KTVHTTPCACHE_EXTERN NSString * const KTVHCHTTPPingResponseResponseValue;
-
-@interface KTVHCHTTPPingResponse : NSObject <HTTPResponse>
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-+ (instancetype)responseWithConnection:(KTVHCHTTPConnection *)connection;
-
-@end

+ 0 - 98
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPPingResponse.m

@@ -1,98 +0,0 @@
-//
-//  KTVHCHTTPPingResponse.m
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/10/23.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import "KTVHCHTTPPingResponse.h"
-#import "KTVHCHTTPConnection.h"
-#import "KTVHCLog.h"
-
-NSString * const KTVHCHTTPPingResponseResponseValue = @"pang";
-
-@interface KTVHCHTTPPingResponse ()
-
-@property (nonatomic, weak) KTVHCHTTPConnection * connection;
-@property (nonatomic, strong) NSData * responseData;
-@property (nonatomic, assign) long long readOffset;
-
-@end
-
-@implementation KTVHCHTTPPingResponse
-
-+ (instancetype)responseWithConnection:(KTVHCHTTPConnection *)connection
-{
-    return [[self alloc] initWithConnection:connection];
-}
-
-- (instancetype)initWithConnection:(KTVHCHTTPConnection *)connection
-{
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        static NSData * data = nil;
-        static dispatch_once_t onceToken;
-        dispatch_once(&onceToken, ^{
-            data = [KTVHCHTTPPingResponseResponseValue dataUsingEncoding:NSUTF8StringEncoding];
-        });
-        self.responseData = data;
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    KTVHCLogDealloc(self);
-}
-
-- (NSData *)readDataOfLength:(NSUInteger)length
-{
-    NSData * data = nil;
-    NSUInteger readLength = (NSUInteger)MIN(length, self.responseData.length - self.readOffset);
-    if (readLength == self.responseData.length)
-    {
-        data = self.responseData;
-    }
-    else if (readLength > 0)
-    {
-        data = [self.responseData subdataWithRange:NSMakeRange((NSUInteger)self.readOffset, readLength)];
-    }
-    self.readOffset += data.length;
-    KTVHCLogHTTPResponsePing(@"%p, Read data : %lld", self, (long long)data.length);
-    return data;
-}
-
-- (BOOL)delayResponseHeaders
-{
-    return NO;
-}
-
-- (UInt64)contentLength
-{
-    return self.responseData.length;
-}
-
-- (UInt64)offset
-{
-    return self.readOffset;
-}
-
-- (void)setOffset:(UInt64)offset
-{
-    self.readOffset = offset;
-}
-
-- (BOOL)isDone
-{
-    BOOL result = self.readOffset == self.responseData.length;
-    return result;
-}
-
-- (void)connectionDidClose
-{
-    KTVHCLogHTTPResponsePing(@"%p, Connection did closed", self);
-}
-
-@end

+ 0 - 23
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPRequest.h

@@ -1,23 +0,0 @@
-//
-//  KTVHCHTTPRequest.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/10.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@interface KTVHCHTTPRequest : NSObject
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-- (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers;
-
-@property (nonatomic, copy, readonly) NSURL * URL;
-@property (nonatomic, copy, readonly) NSDictionary * headers;
-@property (nonatomic, copy) NSString * method;
-@property (nonatomic, copy) NSString * version;
-
-@end

+ 2 - 2
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPResponse.h

@@ -10,13 +10,13 @@
 #import "KTVHCHTTPHeader.h"
 
 @class KTVHCHTTPConnection;
-@class KTVHCHTTPRequest;
+@class KTVHCDataRequest;
 
 @interface KTVHCHTTPResponse : NSObject <HTTPResponse>
 
 + (instancetype)new NS_UNAVAILABLE;
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithConnection:(KTVHCHTTPConnection *)connection request:(KTVHCHTTPRequest *)request;
+- (instancetype)initWithConnection:(KTVHCHTTPConnection *)connection dataRequest:(KTVHCDataRequest *)dataRequest NS_DESIGNATED_INITIALIZER;
 
 @end

+ 28 - 31
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPResponse.m

@@ -8,34 +8,28 @@
 
 #import "KTVHCHTTPResponse.h"
 #import "KTVHCHTTPConnection.h"
-#import "KTVHCHTTPRequest.h"
 #import "KTVHCDataStorage.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCHTTPResponse () <KTVHCDataReaderDelegate>
 
-@property (nonatomic, weak) KTVHCHTTPConnection * connection;
-@property (nonatomic, strong) KTVHCHTTPRequest * request;
-@property (nonatomic, strong) KTVHCDataRequest * dataRequest;
-@property (nonatomic, strong) KTVHCDataReader * reader;
-@property (nonatomic, assign) BOOL waitingResponseHeader;
+@property (nonatomic) BOOL waitingResponse;
+@property (nonatomic, strong) KTVHCDataReader *reader;
+@property (nonatomic, weak) KTVHCHTTPConnection *connection;
 
 @end
 
 @implementation KTVHCHTTPResponse
 
-- (instancetype)initWithConnection:(KTVHCHTTPConnection *)connection request:(KTVHCHTTPRequest *)request
+- (instancetype)initWithConnection:(KTVHCHTTPConnection *)connection dataRequest:(KTVHCDataRequest *)dataRequest
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
         self.connection = connection;
-        self.request = request;
-        KTVHCDataRequest * dataRequest = [[KTVHCDataRequest alloc] initWithURL:self.request.URL headers:self.request.headers];
         self.reader = [[KTVHCDataStorage storage] readerWithRequest:dataRequest];
         self.reader.delegate = self;
         [self.reader prepare];
-        KTVHCLogHTTPResponse(@"%p, Create response\nrequest : %@", self, self.request);
+        KTVHCLogHTTPResponse(@"%p, Create response\nrequest : %@", self, dataRequest);
     }
     return self;
 }
@@ -50,10 +44,9 @@
 
 - (NSData *)readDataOfLength:(NSUInteger)length
 {
-    NSData * data = [self.reader readDataOfLength:length];
+    NSData *data = [self.reader readDataOfLength:length];
     KTVHCLogHTTPResponse(@"%p, Read data : %lld", self, (long long)data.length);
-    if (self.reader.didFinished)
-    {
+    if (self.reader.isFinished) {
         KTVHCLogHTTPResponse(@"%p, Read data did finished", self);
         [self.reader close];
         [self.connection responseDidAbort:self];
@@ -63,9 +56,9 @@
 
 - (BOOL)delayResponseHeaders
 {
-    BOOL waiting = !self.reader.didPrepared;
-    self.waitingResponseHeader = waiting;
-    KTVHCLogHTTPResponse(@"%p, Delay response : %d", self, self.waitingResponseHeader);
+    BOOL waiting = !self.reader.isPrepared;
+    self.waitingResponse = waiting;
+    KTVHCLogHTTPResponse(@"%p, Delay response : %d", self, self.waitingResponse);
     return waiting;
 }
 
@@ -77,52 +70,56 @@
 
 - (NSDictionary *)httpHeaders
 {
-    KTVHCLogHTTPResponse(@"%p, Header\n%@", self, self.reader.response.headersWithoutRangeAndLength);
-    return self.reader.response.headersWithoutRangeAndLength;
+    NSMutableDictionary *headers = [self.reader.response.headers mutableCopy];
+    [headers removeObjectForKey:@"Content-Range"];
+    [headers removeObjectForKey:@"content-range"];
+    [headers removeObjectForKey:@"Content-Length"];
+    [headers removeObjectForKey:@"content-length"];
+    KTVHCLogHTTPResponse(@"%p, Header\n%@", self, headers);
+    return headers;
 }
 
 - (UInt64)offset
 {
-    KTVHCLogHTTPResponse(@"%p, Offset : %lld", self, self.reader.readOffset);
-    return self.reader.readOffset;
+    KTVHCLogHTTPResponse(@"%p, Offset : %lld", self, self.reader.readedLength);
+    return self.reader.readedLength;
 }
 
 - (void)setOffset:(UInt64)offset
 {
-    KTVHCLogHTTPResponse(@"%p, Set offset : %lld, %lld", self, offset, self.reader.readOffset);
+    KTVHCLogHTTPResponse(@"%p, Set offset : %lld, %lld", self, offset, self.reader.readedLength);
 }
 
 - (BOOL)isDone
 {
-    KTVHCLogHTTPResponse(@"%p, Check done : %d", self, self.reader.didFinished);
-    return self.reader.didFinished;
+    KTVHCLogHTTPResponse(@"%p, Check done : %d", self, self.reader.isFinished);
+    return self.reader.isFinished;
 }
 
 - (void)connectionDidClose
 {
-    KTVHCLogHTTPResponse(@"%p, Connection did closed : %lld, %lld", self, self.reader.response.currentLength, self.reader.readOffset);
+    KTVHCLogHTTPResponse(@"%p, Connection did closed : %lld, %lld", self, self.reader.response.contentLength, self.reader.readedLength);
     [self.reader close];
 }
 
 #pragma mark - KTVHCDataReaderDelegate
 
-- (void)readerDidPrepared:(KTVHCDataReader *)reader
+- (void)ktv_readerDidPrepare:(KTVHCDataReader *)reader
 {
     KTVHCLogHTTPResponse(@"%p, Prepared", self);
-    if (self.reader.didPrepared && self.waitingResponseHeader == YES)
-    {
+    if (self.reader.isPrepared && self.waitingResponse == YES) {
         KTVHCLogHTTPResponse(@"%p, Call connection did prepared", self);
         [self.connection responseHasAvailableData:self];
     }
 }
 
-- (void)readerHasAvailableData:(KTVHCDataReader *)reader
+- (void)ktv_readerHasAvailableData:(KTVHCDataReader *)reader
 {
     KTVHCLogHTTPResponse(@"%p, Has available data", self);
     [self.connection responseHasAvailableData:self];
 }
 
-- (void)reader:(KTVHCDataReader *)reader didFailed:(NSError *)error
+- (void)ktv_reader:(KTVHCDataReader *)reader didFailWithError:(NSError *)error
 {
     KTVHCLogHTTPResponse(@"%p, Failed\nError : %@", self, error);
     [self.reader close];

+ 2 - 2
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPServer.h

@@ -15,9 +15,9 @@
 
 + (instancetype)server;
 
-@property (nonatomic, assign, readonly) BOOL running;
+@property (nonatomic, readonly, getter=isRunning) BOOL running;
 
-- (void)start:(NSError **)error;
+- (BOOL)start:(NSError **)error;
 - (void)stop;
 
 - (NSURL *)URLWithOriginalURL:(NSURL *)URL;

+ 108 - 100
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPServer.m

@@ -7,20 +7,16 @@
 //
 
 #import "KTVHCHTTPServer.h"
-#import "KTVHCHTTPHeader.h"
 #import "KTVHCHTTPConnection.h"
-#import "KTVHCHTTPURL.h"
+#import "KTVHCHTTPHeader.h"
+#import "KTVHCURLTool.h"
 #import "KTVHCLog.h"
 
 @interface KTVHCHTTPServer ()
 
-@property (nonatomic, strong) HTTPServer * coreHTTPServer;
-
-@property (nonatomic, assign) BOOL pinging;
-@property (nonatomic, assign) BOOL pingResult;
-@property (nonatomic, strong) NSCondition * pingCondition;
-@property (nonatomic, strong) NSURLSession * pingSession;
-@property (nonatomic, strong) NSURLSessionDataTask * pingTask;
+@property (nonatomic, strong) HTTPServer *server;
+@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
+@property (nonatomic) BOOL wantsRunning;
 
 @end
 
@@ -28,7 +24,7 @@
 
 + (instancetype)server
 {
-    static KTVHCHTTPServer * obj = nil;
+    static KTVHCHTTPServer *obj = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         obj = [[self alloc] init];
@@ -38,9 +34,21 @@
 
 - (instancetype)init
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         KTVHCLogAlloc(self);
+        self.backgroundTask = UIBackgroundTaskInvalid;
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(applicationDidEnterBackground)
+                                                     name:UIApplicationDidEnterBackgroundNotification
+                                                   object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(applicationWillEnterForeground)
+                                                     name:UIApplicationWillEnterForegroundNotification
+                                                   object:nil];
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(HTTPConnectionDidDie)
+                                                     name:HTTPConnectionDidDieNotification
+                                                   object:nil];
     }
     return self;
 }
@@ -48,119 +56,119 @@
 - (void)dealloc
 {
     KTVHCLogDealloc(self);
-    [self stop];
+    [self stopInternal];
 }
 
-- (BOOL)restart
+- (BOOL)isRunning
 {
-    KTVHCLogHTTPServer(@"%p, Restart connection count : %lld", self, (long long)[self.coreHTTPServer numberOfHTTPConnections]);
-    [self.coreHTTPServer stop];
-    NSError * error = nil;
-    [self.coreHTTPServer start:&error];
-    if (error) {
-        KTVHCLogHTTPServer(@"%p, Restart server failed : %@", self, error);
-    } else {
-        KTVHCLogHTTPServer(@"%p, Restart server success", self);
-    }
-    return error == nil;
+    return self.server.isRunning;
 }
 
-- (void)start:(NSError * __autoreleasing *)error
+- (BOOL)start:(NSError **)error
 {
-    self.coreHTTPServer = [[HTTPServer alloc] init];
-    [self.coreHTTPServer setConnectionClass:[KTVHCHTTPConnection class]];
-    [self.coreHTTPServer setType:@"_http._tcp."];
-    NSError * tempError = nil;
-    [self.coreHTTPServer start:&tempError];
-    if (tempError) {
-        * error = tempError;
-        KTVHCLogHTTPServer(@"%p, Start server failed : %@", self, tempError);
-    } else {
-        KTVHCLogHTTPServer(@"%p, Start server success", self);
-    }
+    self.wantsRunning = YES;
+    return [self startInternal:error];
 }
 
 - (void)stop
 {
-    if (self.running)
-    {
-        [self.coreHTTPServer stop];
-        [self.pingSession invalidateAndCancel];
-        [self.pingTask cancel];
-        self.pingTask = nil;
-        self.pingSession = nil;
-        KTVHCLogHTTPServer(@"%p, Stop server", self);
-    }
+    self.wantsRunning = NO;
+    [self stopInternal];
 }
 
 - (NSURL *)URLWithOriginalURL:(NSURL *)URL
 {
-    BOOL success = NO;
-    for (int i = 0; i < 2 && !success && self.running && [URL.scheme hasPrefix:@"http"]; i++)
-    {
-        if (i > 0)
-        {
-            [self restart];
-        }
-        success = [self ping];
-        KTVHCLogHTTPServer(@"%p, Ping\nsuccess : %d\nindex : %d", self, success, i);
+    if (!URL || URL.isFileURL || URL.absoluteString.length == 0) {
+        return URL;
     }
-    if (success)
-    {
-        KTVHCHTTPURL * HCURL = [[KTVHCHTTPURL alloc] initWithOriginalURL:URL];
-        URL = [HCURL proxyURLWithPort:self.coreHTTPServer.listeningPort];
+    if (!self.isRunning) {
+        return URL;
     }
+    NSString *original = [[KTVHCURLTool tool] URLEncode:URL.absoluteString];
+    NSString *server = [NSString stringWithFormat:@"http://localhost:%d/", self.server.listeningPort];
+    NSString *extension = URL.pathExtension ? [NSString stringWithFormat:@".%@", URL.pathExtension] : @"";
+    NSString *URLString = [NSString stringWithFormat:@"%@request%@?url=%@", server, extension, original];
+    URL = [NSURL URLWithString:URLString];
     KTVHCLogHTTPServer(@"%p, Return URL\nURL : %@", self, URL);
     return URL;
 }
 
-- (BOOL)ping
+#pragma mark - Internal
+
+- (BOOL)startInternal:(NSError **)error
 {
-    if (self.running)
-    {
-        if (!self.pingCondition)
-        {
-            self.pingCondition = [[NSCondition alloc] init];
-        }
-        [self.pingCondition lock];
-        if (self.pinging)
-        {
-            [self.pingCondition wait];
-        }
-        else
-        {
-            NSURL * pingURL = [[KTVHCHTTPURL pingURL] proxyURLWithPort:self.coreHTTPServer.listeningPort];
-            if (!self.pingSession)
-            {
-                NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
-                sessionConfiguration.timeoutIntervalForRequest = 3;
-                self.pingSession = [NSURLSession sessionWithConfiguration:sessionConfiguration];
-            }
-            self.pingTask = [self.pingSession dataTaskWithURL:pingURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
-                [self.pingCondition lock];
-                if (!error && data.length > 0) {
-                    NSString * pang = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-                    self.pingResult = [pang isEqualToString:[KTVHCHTTPConnection pingResponseValue]];
-                } else {
-                    self.pingResult = NO;
-                }
-                self.pinging = NO;
-                [self.pingCondition broadcast];
-                [self.pingCondition unlock];
-            }];
-            self.pinging = YES;
-            [self.pingTask resume];
-            [self.pingCondition wait];
-        }
-        [self.pingCondition unlock];
+    self.server = [[HTTPServer alloc] init];
+    [self.server setConnectionClass:[KTVHCHTTPConnection class]];
+    [self.server setType:@"_http._tcp."];
+    [self.server setPort:80];
+    BOOL ret = [self.server start:error];
+    if (ret) {
+        KTVHCLogHTTPServer(@"%p, Start server success", self);
+    } else {
+        KTVHCLogHTTPServer(@"%p, Start server failed", self);
+    }
+    return ret;
+}
+
+- (void)stopInternal
+{
+    [self.server stop];
+    self.server = nil;
+}
+
+#pragma mark - Background Task
+
+- (void)applicationDidEnterBackground
+{
+    if (self.server.numberOfHTTPConnections > 0) {
+        KTVHCLogHTTPServer(@"%p, enter background", self);
+        [self beginBackgroundTask];
+    } else {
+        KTVHCLogHTTPServer(@"%p, enter background and stop server", self);
+        [self stopInternal];
+    }
+}
+
+- (void)applicationWillEnterForeground
+{
+    KTVHCLogHTTPServer(@"%p, enter foreground", self);
+    if (self.backgroundTask == UIBackgroundTaskInvalid && self.wantsRunning) {
+        KTVHCLogHTTPServer(@"%p, restart server", self);
+        [self startInternal:nil];
     }
-    KTVHCLogHTTPServer(@"%p, Ping result : %d", self, self.pingResult);
-    return self.pingResult;
+    [self endBackgroundTask];
 }
 
-- (BOOL)running
+- (void)HTTPConnectionDidDie
 {
-    return self.coreHTTPServer.isRunning;
+    KTVHCLogHTTPServer(@"%p, connection did die", self);
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground &&
+            self.server.numberOfHTTPConnections == 0) {
+            KTVHCLogHTTPServer(@"%p, server idle", self);
+            [self endBackgroundTask];
+            [self stopInternal];
+        }
+    });
+}
+
+- (void)beginBackgroundTask
+{
+    KTVHCLogHTTPServer(@"%p, begin background task", self);
+    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+        KTVHCLogHTTPServer(@"%p, background task expiration", self);
+        [self endBackgroundTask];
+        [self stopInternal];
+    }];
+}
+
+- (void)endBackgroundTask
+{
+    if (self.backgroundTask != UIBackgroundTaskInvalid) {
+        KTVHCLogHTTPServer(@"%p, end background task", self);
+        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
+        self.backgroundTask = UIBackgroundTaskInvalid;
+    }
 }
 
 @end

+ 0 - 32
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPURL.h

@@ -1,32 +0,0 @@
-//
-//  KTVHCHTTPURL.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/10.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-typedef NS_ENUM(NSUInteger, KTVHCHTTPURLType)
-{
-    KTVHCHTTPURLTypeUnknown,
-    KTVHCHTTPURLTypeContent,
-    KTVHCHTTPURLTypePing,
-};
-
-@interface KTVHCHTTPURL : NSObject
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-+ (instancetype)pingURL;
-- (instancetype)initWithProxyURL:(NSURL *)URL;
-- (instancetype)initWithOriginalURL:(NSURL *)URL;
-
-@property (nonatomic, assign, readonly) KTVHCHTTPURLType type;
-@property (nonatomic, copy, readonly) NSURL * URL;
-
-- (NSURL *)proxyURLWithPort:(NSInteger)port;
-
-@end

+ 0 - 116
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCHTTPServer/KTVHCHTTPURL.m

@@ -1,116 +0,0 @@
-//
-//  KTVHCHTTPURL.m
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/10.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import "KTVHCHTTPURL.h"
-#import "KTVHCURLTools.h"
-#import "KTVHCLog.h"
-
-static NSString * const kKTVHCHTTPURLRequestURLKey      = @"originalURL";
-static NSString * const kKTVHCHTTPURLRequestTypeKey     = @"requestType";
-static NSString * const kKTVHCHTTPURLRequestTypeContent = @"content";
-static NSString * const kKTVHCHTTPURLRequestTypePing    = @"ping";
-
-@implementation KTVHCHTTPURL
-
-+ (instancetype)pingURL
-{
-    static KTVHCHTTPURL * obj = nil;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        NSURL * URL = [NSURL URLWithString:@"KTVHTTPCache"];
-        obj = [[KTVHCHTTPURL alloc] initWithOriginalURL:URL];
-        obj->_type = KTVHCHTTPURLTypePing;
-    });
-    return obj;
-}
-
-- (instancetype)initWithProxyURL:(NSURL *)URL
-{
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        NSRange requestTypeRange = [URL.absoluteString rangeOfString:[NSString stringWithFormat:@"%@=", kKTVHCHTTPURLRequestTypeKey]];
-        if (requestTypeRange.location != NSNotFound)
-        {
-            NSString * paramString = [URL.absoluteString substringFromIndex:requestTypeRange.location];
-            NSCharacterSet * delimiterSet = [NSCharacterSet characterSetWithCharactersInString:@"&"];
-            NSScanner * scanner = [[NSScanner alloc] initWithString:paramString];
-            while (![scanner isAtEnd])
-            {
-                NSString * tupleString = nil;
-                [scanner scanUpToCharactersFromSet:delimiterSet intoString:&tupleString];
-                [scanner scanCharactersFromSet:delimiterSet intoString:NULL];
-                NSArray <NSString *> * tuple = [tupleString componentsSeparatedByString:@"="];
-                if (tuple.count == 2)
-                {
-                    NSString * key = tuple.firstObject;
-                    NSString * value = tuple.lastObject;
-                    if ([key isEqualToString:kKTVHCHTTPURLRequestURLKey])
-                    {
-                        _URL = [NSURL URLWithString:[KTVHCURLTools URLDecode:value]];
-                    }
-                    else if ([key isEqualToString:kKTVHCHTTPURLRequestTypeKey])
-                    {
-                        if ([value isEqualToString:kKTVHCHTTPURLRequestTypePing])
-                        {
-                            _type = KTVHCHTTPURLTypePing;
-                        }
-                        else if ([value isEqualToString:kKTVHCHTTPURLRequestTypeContent])
-                        {
-                            _type = KTVHCHTTPURLTypeContent;
-                        }
-                    }
-                }
-            }
-        }
-        KTVHCLogHTTPURL(@"%p, Proxy URL\n%@\n%@", self, URL, self.URL);
-    }
-    return self;
-}
-
-- (instancetype)initWithOriginalURL:(NSURL *)URL
-{
-    if (self = [super init])
-    {
-        KTVHCLogAlloc(self);
-        _URL = URL;
-        _type = KTVHCHTTPURLTypeContent;
-        KTVHCLogHTTPURL(@"%p, Original URL\n%@", self, self.URL);
-    }
-    return self;
-}
-
-- (void)dealloc
-{
-    KTVHCLogDealloc(self);
-}
-
-- (NSURL *)proxyURLWithPort:(NSInteger)port
-{
-    NSString * pathExtension = @"";
-    if (self.URL.pathExtension.length > 0)
-    {
-        pathExtension = [NSString stringWithFormat:@".%@", self.URL.pathExtension];
-    }
-    NSString * requestType = kKTVHCHTTPURLRequestTypeContent;
-    if (self.type == KTVHCHTTPURLTypePing)
-    {
-        requestType = kKTVHCHTTPURLRequestTypePing;
-    }
-    NSString * originalURLString = [KTVHCURLTools URLEncode:self.URL.absoluteString];
-    NSString * URLString = [NSString stringWithFormat:@"http://localhost:%d/request%@?%@=%@&%@=%@",
-                            (int)port,
-                            pathExtension,
-                            kKTVHCHTTPURLRequestTypeKey, requestType,
-                            kKTVHCHTTPURLRequestURLKey, originalURLString];
-    NSURL * URL = [NSURL URLWithString:URLString];
-    KTVHCLogHTTPURL(@"%p, Proxy URL\n%@", self, URL);
-    return URL;
-}
-
-@end

+ 0 - 34
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCPathTools.h

@@ -1,34 +0,0 @@
-//
-//  KTVHCPathTools.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/12.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@interface KTVHCPathTools : NSObject
-
-+ (NSString *)logPath;
-+ (NSString *)archivePath;
-
-+ (NSString *)directoryPathWithURL:(NSURL *)URL;
-+ (NSString *)completeFilePathWithURL:(NSURL *)URL;
-+ (NSString *)unitItemPathWithURL:(NSURL *)URL offset:(long long)offset;
-
-+ (BOOL)isRelativePath:(NSString *)path;
-+ (BOOL)isAbsolutePath:(NSString *)path;
-
-+ (NSString *)relativePathWithAbsoultePath:(NSString *)path;
-+ (NSString *)absoultePathWithRelativePath:(NSString *)path;
-
-+ (void)createFileAtPath:(NSString *)path;
-+ (void)createDirectoryAtPath:(NSString *)path;
-
-+ (NSError *)deleteFileAtPath:(NSString *)path;
-+ (NSError *)deleteDirectoryAtPath:(NSString *)path;
-
-+ (long long)sizeOfItemAtPath:(NSString *)path;
-
-@end

+ 0 - 184
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCPathTools.m

@@ -1,184 +0,0 @@
-//
-//  KTVHCPathTools.m
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/12.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import "KTVHCPathTools.h"
-#import "KTVHCURLTools.h"
-
-@implementation KTVHCPathTools
-
-+ (NSString *)rootDirectory
-{
-    static NSString * obj = @"KTVHTTPCache";
-    [self createDirectoryAtPath:obj];
-    return obj;
-}
-
-+ (NSString *)logPath
-{
-    NSString * path = [[self rootDirectory] stringByAppendingPathComponent:@"KTVHTTPCache.log"];
-    return [self absoultePathWithRelativePath:path];
-}
-
-+ (NSString *)archivePath
-{
-    NSString * path = [[self rootDirectory] stringByAppendingPathComponent:@"KTVHTTPCache.archive"];
-    return [self absoultePathWithRelativePath:path];
-}
-
-+ (NSString *)directoryPathWithURL:(NSURL *)URL
-{
-    NSString * name = [KTVHCURLTools keyWithURL:URL];
-    NSString * path = [[self rootDirectory] stringByAppendingPathComponent:name];
-    [self createDirectoryAtPath:path];
-    return [self absoultePathWithRelativePath:path];
-}
-
-+ (NSString *)completeFilePathWithURL:(NSURL *)URL
-{
-    NSString * fileName = [KTVHCURLTools keyWithURL:URL];
-    fileName = [fileName stringByAppendingPathExtension:URL.pathExtension];
-    NSString * directoryPath = [self directoryPathWithURL:URL];
-    NSString * filePath = [directoryPath stringByAppendingPathComponent:fileName];
-    return [self absoultePathWithRelativePath:filePath];
-}
-
-+ (NSString *)unitItemPathWithURL:(NSURL *)URL offset:(long long)offset
-{
-    NSString * baseFileName = [KTVHCURLTools keyWithURL:URL];
-    NSString * directoryPath = [self directoryPathWithURL:URL];
-    int number = 0;
-    NSString * filePath = nil;
-    while (!filePath)
-    {
-        NSString * fileName = [NSString stringWithFormat:@"%@_%lld_%d", baseFileName, offset, number];
-        NSString * currentFilePath = [directoryPath stringByAppendingPathComponent:fileName];
-        if (![[NSFileManager defaultManager] fileExistsAtPath:currentFilePath])
-        {
-            [[NSFileManager defaultManager] createFileAtPath:currentFilePath contents:nil attributes:nil];
-            filePath = currentFilePath;
-        }
-        number++;
-    }
-    return [self absoultePathWithRelativePath:filePath];;
-}
-
-+ (NSString *)basePath
-{
-    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
-}
-
-+ (BOOL)isRelativePath:(NSString *)path
-{
-    return ![path hasPrefix:[self basePath]];
-}
-
-+ (BOOL)isAbsolutePath:(NSString *)path
-{
-    return [path hasPrefix:[self basePath]];
-}
-
-+ (NSString *)relativePathWithAbsoultePath:(NSString *)path
-{
-    if ([self isAbsolutePath:path])
-    {
-        path = [path stringByReplacingOccurrencesOfString:[self basePath] withString:@""];
-    }
-    return path;
-}
-
-+ (NSString *)absoultePathWithRelativePath:(NSString *)path
-{
-    if ([self isRelativePath:path])
-    {
-        path = [[self basePath] stringByAppendingPathComponent:path];;
-    }
-    return path;
-}
-
-+ (void)createFileAtPath:(NSString *)path
-{
-    if (path.length <= 0)
-    {
-        return;
-    }
-    path = [self absoultePathWithRelativePath:path];
-    BOOL isDirectory = NO;
-    BOOL isExists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
-    if (!isExists || isDirectory)
-    {
-        [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
-    }
-}
-
-+ (void)createDirectoryAtPath:(NSString *)path
-{
-    if (path.length <= 0)
-    {
-        return;
-    }
-    path = [self absoultePathWithRelativePath:path];
-    BOOL isDirectory = NO;
-    BOOL isExists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
-    if (!isExists || !isDirectory)
-    {
-        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
-    }
-}
-
-+ (NSError *)deleteFileAtPath:(NSString *)path
-{
-    if (path.length <= 0)
-    {
-        return nil;
-    }
-    path = [self absoultePathWithRelativePath:path];
-    NSError * error = nil;
-    BOOL isDirectory = NO;
-    BOOL result = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
-    if (result && !isDirectory)
-    {
-        result = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
-    }
-    return error;
-}
-
-+ (NSError *)deleteDirectoryAtPath:(NSString *)path
-{
-    if (path.length <= 0)
-    {
-        return nil;
-    }
-    path = [self absoultePathWithRelativePath:path];
-    NSError * error = nil;
-    BOOL isDirectory = NO;
-    BOOL result = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory];
-    if (result && isDirectory)
-    {
-        result = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
-    }
-    return error;
-}
-
-+ (long long)sizeOfItemAtPath:(NSString *)path
-{
-    if (path.length <= 0)
-    {
-        return 0;
-    }
-    path = [self absoultePathWithRelativePath:path];
-    NSError * error;
-    NSDictionary <NSFileAttributeKey, id> * attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error];
-    if (!error || attributes.count > 0)
-    {
-        NSNumber * size = [attributes objectForKey:NSFileSize];
-        return size.longLongValue;
-    }
-    return 0;
-}
-
-@end

+ 0 - 27
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCURLTools.h

@@ -1,27 +0,0 @@
-//
-//  KTVHCURLTools.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/10.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-typedef NSURL * (^KTVHCURLFilter)(NSURL * URL);
-
-@interface KTVHCURLTools : NSObject
-
-+ (instancetype)new NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-
-+ (instancetype)URLTools;
-
-@property (nonatomic, copy) KTVHCURLFilter URLFilter;
-
-+ (NSString *)keyWithURL:(NSURL *)URL;
-
-+ (NSString *)URLEncode:(NSString *)URLString;
-+ (NSString *)URLDecode:(NSString *)URLString;
-
-@end

+ 0 - 145
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHCTools/KTVHCURLTools.m

@@ -1,145 +0,0 @@
-//
-//  KTVHCURLTools.m
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/10.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import "KTVHCURLTools.h"
-#import <CommonCrypto/CommonCrypto.h>
-
-@implementation KTVHCURLTools
-
-+ (instancetype)URLTools
-{
-    static KTVHCURLTools * obj = nil;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        obj = [[self alloc] init];
-    });
-    return obj;
-}
-
-- (NSURL *)URLThroughURLFilter:(NSURL *)URL
-{
-    if (self.URLFilter && URL.absoluteString.length > 0)
-    {
-        NSURL * retURL = self.URLFilter(URL);
-        if (retURL.absoluteString.length > 0)
-        {
-            return retURL;
-        }
-    }
-    return URL;
-}
-
-+ (NSString *)keyWithURL:(NSURL *)URL
-{
-    URL = [[KTVHCURLTools URLTools] URLThroughURLFilter:URL];
-    return [self md5:URL.absoluteString];
-}
-
-+ (NSString *)md5:(NSString *)URLString
-{
-    const char * value = [URLString UTF8String];
-    unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
-    CC_MD5(value, (CC_LONG)strlen(value), outputBuffer);
-    NSMutableString * outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
-    for (NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++)
-    {
-        [outputString appendFormat:@"%02x", outputBuffer[count]];
-    }
-    return outputString;
-}
-
-+ (NSString *)base64Encode:(NSString *)URLString
-{
-    NSData * data = [URLString dataUsingEncoding:NSUTF8StringEncoding];
-    return [data base64EncodedStringWithOptions:0];
-}
-
-+ (NSString *)base64Decode:(NSString *)URLString
-{
-    NSData * data = [[NSData alloc] initWithBase64EncodedString:URLString options:0];
-    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-}
-
-+ (NSString *)URLEncode:(NSString *)URLString
-{
-    URLString = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-    NSUInteger length = [URLString length];
-    const char * c = [URLString UTF8String];
-    NSString * resultString = @"";
-    for(int i = 0; i < length; i++)
-    {
-        switch (*c)
-        {
-            case '/':
-                resultString = [resultString stringByAppendingString:@"%2F"];
-                break;
-            case '\'':
-                resultString = [resultString stringByAppendingString:@"%27"];
-                break;
-            case ';':
-                resultString = [resultString stringByAppendingString:@"%3B"];
-                break;
-            case '?':
-                resultString = [resultString stringByAppendingString:@"%3F"];
-                break;
-            case ':':
-                resultString = [resultString stringByAppendingString:@"%3A"];
-                break;
-            case '@':
-                resultString = [resultString stringByAppendingString:@"%40"];
-                break;
-            case '&':
-                resultString = [resultString stringByAppendingString:@"%26"];
-                break;
-            case '=':
-                resultString = [resultString stringByAppendingString:@"%3D"];
-                break;
-            case '+':
-                resultString = [resultString stringByAppendingString:@"%2B"];
-                break;
-            case '$':
-                resultString = [resultString stringByAppendingString:@"%24"];
-                break;
-            case ',':
-                resultString = [resultString stringByAppendingString:@"%2C"];
-                break;
-            case '[':
-                resultString = [resultString stringByAppendingString:@"%5B"];
-                break;
-            case ']':
-                resultString = [resultString stringByAppendingString:@"%5D"];
-                break;
-            case '#':
-                resultString = [resultString stringByAppendingString:@"%23"];
-                break;
-            case '!':
-                resultString = [resultString stringByAppendingString:@"%21"];
-                break;
-            case '(':
-                resultString = [resultString stringByAppendingString:@"%28"];
-                break;
-            case ')':
-                resultString = [resultString stringByAppendingString:@"%29"];
-                break;
-            case '*':
-                resultString = [resultString stringByAppendingString:@"%2A"];
-                break;
-            default:
-                resultString = [resultString stringByAppendingFormat:@"%c", *c];
-        }
-        c++;
-    }
-    return resultString;
-}
-
-+ (NSString *)URLDecode:(NSString *)URLString
-{
-    return [URLString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-}
-
-@end

+ 0 - 139
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHTTPCacheImp.h

@@ -1,139 +0,0 @@
-//
-//  KTVHTTPCacheImp.h
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/13.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@class KTVHCDataReader;
-@class KTVHCDataLoader;
-@class KTVHCDataRequest;
-@class KTVHCDataCacheItem;
-
-@interface KTVHTTPCache : NSObject
-
-#pragma mark - HTTP Server
-
-/**
- *  Start & Stop HTTP Server.
- */
-+ (void)proxyStart:(NSError **)error;
-+ (void)proxyStop;
-
-+ (BOOL)proxyIsRunning;
-
-/**
- *  Return the URL string for local server.
- */
-+ (NSURL *)proxyURLWithOriginalURL:(NSURL *)URL;
-+ (NSString *)proxyURLStringWithOriginalURLString:(NSString *)URLString;
-
-#pragma mark - Data Storage
-
-/**
- *  If the content of the URL is finish cached, return the file path for the content. Otherwise return nil.
- */
-+ (NSURL *)cacheCompleteFileURLIfExistedWithURL:(NSURL *)URL;
-+ (NSString *)cacheCompleteFilePathIfExistedWithURLString:(NSString *)URLString;
-
-/**
- *  Data Reader.
- */
-+ (KTVHCDataReader *)cacheReaderWithRequest:(KTVHCDataRequest *)request;
-
-/**
- *  Data Loader.
- */
-+ (KTVHCDataLoader *)cacheLoaderWithRequest:(KTVHCDataRequest *)request;
-
-/**
- *  Cache State.
- */
-+ (void)cacheSetMaxCacheLength:(long long)maxCacheLength;
-+ (long long)cacheMaxCacheLength;
-+ (long long)cacheTotalCacheLength;
-
-/**
- *  Cache Item.
- */
-+ (KTVHCDataCacheItem *)cacheCacheItemWithURL:(NSURL *)URL;
-+ (KTVHCDataCacheItem *)cacheCacheItemWithURLString:(NSString *)URLString;
-+ (NSArray <KTVHCDataCacheItem *> *)cacheAllCacheItems;
-
-/**
- *  Delete Cache.
- */
-+ (void)cacheDeleteCacheWithURL:(NSURL *)URL;
-+ (void)cacheDeleteCacheWithURLString:(NSString *)URLString;
-+ (void)cacheDeleteAllCaches;
-
-#pragma mark - Token
-
-/**
- *  URL Filter.
- *
- *  High frequency call. Make it simple.
- */
-+ (void)tokenSetURLFilter:(NSURL * (^)(NSURL * URL))URLFilter;
-
-#pragma mark - Download
-
-+ (void)downloadSetTimeoutInterval:(NSTimeInterval)timeoutInterval;
-+ (NSTimeInterval)downloadTimeoutInterval;
-
-/**
- *  Whitelist Header Fields.
- */
-+ (void)downloadSetWhitelistHeaderKeys:(NSArray <NSString *> *)whitelistHeaderKeys;
-+ (NSArray <NSString *> *)downloadWhitelistHeaderKeys;
-
-/**
- *  Additional Header Fields.
- */
-+ (void)downloadSetAdditionalHeaders:(NSDictionary <NSString *, NSString *> *)additionalHeaders;
-+ (NSDictionary <NSString *, NSString *> *)downloadAdditionalHeaders;
-
-/**
- *  Default values: 'video/x', 'audio/x', 'application/mp4', 'application/octet-stream', 'binary/octet-stream'
- */
-+ (void)downloadSetAcceptContentTypes:(NSArray <NSString *> *)acceptContentTypes;
-+ (NSArray <NSString *> *)downloadAcceptContentTypes;
-
-/**
- *  If the receive response's Content-Type not included in acceptContentTypes, this method will be called.
- *  The return value of block to decide whether to continue to load resources. Otherwise the HTTP task will be rejected.
- */
-+ (void)downloadSetUnsupportContentTypeFilter:(BOOL(^)(NSURL * URL, NSString * contentType))contentTypeFilter;
-
-#pragma mark - Log
-
-/**
- *  Console & Record.
- */
-+ (void)logAddLog:(NSString *)log;
-
-/**
- *  DEBUG & RELEASE : Default is NO.
- */
-+ (void)logSetConsoleLogEnable:(BOOL)consoleLogEnable;
-+ (BOOL)logConsoleLogEnable;
-
-/**
- *  DEBUG & RELEASE : Default is NO.
- */
-+ (void)logSetRecordLogEnable:(BOOL)recordLogEnable;
-+ (BOOL)logRecordLogEnable;
-
-+ (NSString *)logRecordLogFilePath;      // nullable
-+ (void)logDeleteRecordLog;
-
-/**
- *  Error
- */
-+ (NSArray <NSError *> *)logAllErrors;
-+ (NSError *)logLastError;
-
-@end

+ 0 - 224
Carthage/Checkouts/KTVHTTPCache/KTVHTTPCache/Classes/KTVHTTPCacheImp.m

@@ -1,224 +0,0 @@
-//
-//  KTVHTTPCacheImp.m
-//  KTVHTTPCache
-//
-//  Created by Single on 2017/8/13.
-//  Copyright © 2017年 Single. All rights reserved.
-//
-
-#import "KTVHTTPCacheImp.h"
-#import "KTVHCHTTPServer.h"
-#import "KTVHCDataStorage.h"
-#import "KTVHCDownload.h"
-#import "KTVHCURLTools.h"
-#import "KTVHCLog.h"
-
-@implementation KTVHTTPCache
-
-#pragma mark - HTTP Server
-
-+ (void)proxyStart:(NSError * __autoreleasing *)error
-{
-    [[KTVHCHTTPServer server] start:error];
-}
-
-+ (void)proxyStop
-{
-    [[KTVHCHTTPServer server] stop];
-}
-
-+ (BOOL)proxyIsRunning
-{
-    return [KTVHCHTTPServer server].running;
-}
-
-+ (NSURL *)proxyURLWithOriginalURL:(NSURL *)URL
-{
-    URL = [[KTVHCHTTPServer server] URLWithOriginalURL:URL];
-    return URL;
-}
-
-+ (NSString *)proxyURLStringWithOriginalURLString:(NSString *)URLString
-{
-    NSURL * URL = [NSURL URLWithString:URLString];
-    URL = [[KTVHCHTTPServer server] URLWithOriginalURL:URL];
-    return URL.absoluteString;
-}
-
-#pragma mark - Data Storage
-
-+ (NSURL *)cacheCompleteFileURLIfExistedWithURL:(NSURL *)URL
-{
-    URL = [[KTVHCDataStorage storage] completeFileURLIfExistedWithURL:URL];
-    return URL;
-}
-
-+ (NSString *)cacheCompleteFilePathIfExistedWithURLString:(NSString *)URLString
-{
-    NSURL * URL = [NSURL URLWithString:URLString];
-    URL = [[KTVHCDataStorage storage] completeFileURLIfExistedWithURL:URL];
-    return URL.path;
-}
-
-+ (KTVHCDataReader *)cacheReaderWithRequest:(KTVHCDataRequest *)request
-{
-    return [[KTVHCDataStorage storage] readerWithRequest:request];
-}
-
-+ (KTVHCDataLoader *)cacheLoaderWithRequest:(KTVHCDataRequest *)request
-{
-    return [[KTVHCDataStorage storage] loaderWithRequest:request];
-}
-
-+ (void)cacheSetMaxCacheLength:(long long)maxCacheLength
-{
-    [KTVHCDataStorage storage].maxCacheLength = maxCacheLength;
-}
-
-+ (long long)cacheMaxCacheLength
-{
-    return [KTVHCDataStorage storage].maxCacheLength;
-}
-
-+ (long long)cacheTotalCacheLength
-{
-    return [KTVHCDataStorage storage].totalCacheLength;
-}
-
-+ (KTVHCDataCacheItem *)cacheCacheItemWithURL:(NSURL *)URL
-{
-    return [[KTVHCDataStorage storage] cacheItemWithURL:URL];
-}
-
-+ (KTVHCDataCacheItem *)cacheCacheItemWithURLString:(NSString *)URLString
-{
-    NSURL * URL = [NSURL URLWithString:URLString];
-    return [[KTVHCDataStorage storage] cacheItemWithURL:URL];
-}
-
-+ (NSArray<KTVHCDataCacheItem *> *)cacheAllCacheItems
-{
-    return [[KTVHCDataStorage storage] allCacheItems];
-}
-
-+ (void)cacheDeleteCacheWithURL:(NSURL *)URL
-{
-    [[KTVHCDataStorage storage] deleteCacheWithURL:URL];
-}
-
-+ (void)cacheDeleteCacheWithURLString:(NSString *)URLString
-{
-    NSURL * URL = [NSURL URLWithString:URLString];
-    [[KTVHCDataStorage storage] deleteCacheWithURL:URL];
-}
-
-+ (void)cacheDeleteAllCaches
-{
-    [[KTVHCDataStorage storage] deleteAllCaches];
-}
-
-#pragma mark - Token
-
-+ (void)tokenSetURLFilter:(NSURL * (^)(NSURL * URL))URLFilter
-{
-    [KTVHCURLTools URLTools].URLFilter = URLFilter;
-}
-
-#pragma mark - Download
-
-+ (void)downloadSetTimeoutInterval:(NSTimeInterval)timeoutInterval
-{
-    [KTVHCDownload download].timeoutInterval = timeoutInterval;
-}
-
-+ (NSTimeInterval)downloadTimeoutInterval
-{
-    return [KTVHCDownload download].timeoutInterval;
-}
-
-+ (void)downloadSetWhitelistHeaderKeys:(NSArray <NSString *> *)whitelistHeaderKeys
-{
-    [KTVHCDownload download].whitelistHeaderKeys = whitelistHeaderKeys;
-}
-
-+ (NSArray <NSString *> *)downloadWhitelistHeaderKeys
-{
-    return [KTVHCDownload download].whitelistHeaderKeys;
-}
-
-+ (void)downloadSetAdditionalHeaders:(NSDictionary <NSString *, NSString *> *)additionalHeaders
-{
-    [KTVHCDownload download].additionalHeaders = additionalHeaders;
-}
-
-+ (NSDictionary <NSString *, NSString *> *)downloadAdditionalHeaders
-{
-    return [KTVHCDownload download].additionalHeaders;
-}
-
-+ (void)downloadSetAcceptContentTypes:(NSArray <NSString *> *)acceptContentTypes
-{
-    [KTVHCDownload download].acceptContentTypes = acceptContentTypes;
-}
-
-+ (NSArray <NSString *> *)downloadAcceptContentTypes
-{
-    return [KTVHCDownload download].acceptContentTypes;
-}
-
-+ (void)downloadSetUnsupportContentTypeFilter:(BOOL(^)(NSURL * URL, NSString * contentType))contentTypeFilter
-{
-    [KTVHCDownload download].unsupportContentTypeFilter = contentTypeFilter;
-}
-
-#pragma mark - Log
-
-+ (void)logAddLog:(NSString *)log
-{
-    if (log.length > 0)
-    {
-        KTVHCLogCommon(@"%@", log);
-    }
-}
-
-+ (void)logSetConsoleLogEnable:(BOOL)consoleLogEnable
-{
-    [KTVHCLog log].consoleLogEnable = consoleLogEnable;
-}
-
-+ (BOOL)logConsoleLogEnable
-{
-    return [KTVHCLog log].consoleLogEnable;
-}
-
-+ (BOOL)logRecordLogEnable
-{
-    return [KTVHCLog log].recordLogEnable;
-}
-
-+ (NSString *)logRecordLogFilePath
-{
-    return [KTVHCLog log].recordLogFilePath;
-}
-
-+ (void)logSetRecordLogEnable:(BOOL)recordLogEnable
-{
-    [KTVHCLog log].recordLogEnable = recordLogEnable;
-}
-
-+ (void)logDeleteRecordLog
-{
-    [[KTVHCLog log] deleteRecordLog];
-}
-
-+ (NSArray<NSError *> *)logAllErrors
-{
-    return [[KTVHCLog log] allErrors];
-}
-
-+ (NSError *)logLastError
-{
-    return [[KTVHCLog log] lastError];
-}
-
-@end

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است