2017-05-23 22:24:42 +02:00
|
|
|
|
//
|
|
|
|
|
// LocalFeed.swift
|
2017-05-27 19:43:27 +02:00
|
|
|
|
// Evergreen
|
2017-05-23 22:24:42 +02:00
|
|
|
|
//
|
|
|
|
|
// Created by Brent Simmons on 4/23/16.
|
|
|
|
|
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
import RSWeb
|
2017-07-08 22:18:59 +02:00
|
|
|
|
import Data
|
2017-05-23 22:24:42 +02:00
|
|
|
|
import RSCore
|
|
|
|
|
|
|
|
|
|
public final class LocalFeed: Feed, PlistProvider, Hashable {
|
|
|
|
|
|
|
|
|
|
public let account: Account
|
|
|
|
|
public let url: String
|
|
|
|
|
public let feedID: String
|
|
|
|
|
public var homePageURL: String?
|
|
|
|
|
var username: String?
|
|
|
|
|
public var name: String?
|
|
|
|
|
public var editedName: String?
|
|
|
|
|
public var contentHash: String?
|
|
|
|
|
public var hashValue: Int
|
|
|
|
|
|
|
|
|
|
private var localAccount: LocalAccount {
|
|
|
|
|
get {
|
|
|
|
|
return account as! LocalAccount
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var conditionalGetInfo: HTTPConditionalGetInfo?
|
|
|
|
|
|
|
|
|
|
public var unreadCount = 0 {
|
|
|
|
|
didSet {
|
|
|
|
|
postUnreadCountDidChangeNotification()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var nameForDisplay: String {
|
|
|
|
|
get {
|
|
|
|
|
if let name = editedName {
|
|
|
|
|
return name
|
|
|
|
|
}
|
|
|
|
|
if let name = name {
|
|
|
|
|
return name
|
|
|
|
|
}
|
|
|
|
|
return NSLocalizedString("Untitled", comment: "Feed with no name")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public var plist: AnyObject? {
|
|
|
|
|
get {
|
|
|
|
|
return createDiskDictionary()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public init(account: Account, url: String, feedID: String) {
|
|
|
|
|
|
|
|
|
|
self.account = account
|
|
|
|
|
self.url = url
|
|
|
|
|
self.feedID = feedID
|
|
|
|
|
self.hashValue = feedID.hashValue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MARK: UnreadCountProvider
|
|
|
|
|
|
|
|
|
|
public func updateUnreadCount() {
|
|
|
|
|
|
|
|
|
|
(account as! LocalAccount).updateUnreadCountForFeed(self)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func addToUnreadCount(amount: Int) {
|
|
|
|
|
|
|
|
|
|
unreadCount = max(unreadCount + amount, 0)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public func ==(lhs: LocalFeed, rhs: LocalFeed) -> Bool {
|
|
|
|
|
|
|
|
|
|
if lhs === rhs {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return lhs.hashValue == rhs.hashValue && lhs.account === rhs.account && lhs.url == rhs.url && lhs.feedID == rhs.feedID && lhs.homePageURL == rhs.homePageURL && lhs.name == rhs.name && lhs.editedName == rhs.editedName
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// MARK: Disk dictionary
|
|
|
|
|
|
|
|
|
|
let feedIDKey = "feedID"
|
|
|
|
|
let feedURLKey = "url"
|
|
|
|
|
private let feedHomePageKey = "home"
|
|
|
|
|
private let feedNameKey = "name"
|
|
|
|
|
private let feedEditedNameKey = "editedName"
|
|
|
|
|
private let feedUsernameKey = "username"
|
|
|
|
|
private let feedArticleIDsKey = "articleIDs"
|
|
|
|
|
private let feedConditionalGetInfoKey = "conditionalGetInfo"
|
|
|
|
|
private let feedContentHashKey = "contentHash"
|
|
|
|
|
|
|
|
|
|
public extension LocalFeed {
|
|
|
|
|
|
|
|
|
|
public convenience init?(account: Account, diskDictionary: NSDictionary) {
|
|
|
|
|
|
|
|
|
|
guard let feedURL = diskDictionary[feedURLKey] as? String else {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let feedID: String // If not present, it’s same as the feed URL.
|
|
|
|
|
if let tempFeedID = diskDictionary[feedIDKey] as? String {
|
|
|
|
|
feedID = tempFeedID
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
feedID = feedURL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.init(account: account, url: feedURL, feedID: feedID)
|
|
|
|
|
|
|
|
|
|
if let homePageURL = diskDictionary[feedHomePageKey] as? String {
|
|
|
|
|
self.homePageURL = homePageURL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let name = diskDictionary[feedNameKey] as? String {
|
|
|
|
|
self.name = name
|
|
|
|
|
}
|
|
|
|
|
if let editedName = diskDictionary[feedEditedNameKey] as? String {
|
|
|
|
|
self.editedName = editedName
|
|
|
|
|
}
|
|
|
|
|
if let username = diskDictionary[feedUsernameKey] as? String {
|
|
|
|
|
self.username = username
|
|
|
|
|
}
|
|
|
|
|
if let unreadCount = diskDictionary[unreadCountKey] as? Int {
|
|
|
|
|
self.unreadCount = unreadCount
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-24 22:29:40 +02:00
|
|
|
|
if let conditionalGetInfoPlist = diskDictionary[feedConditionalGetInfoKey] as? [String: String] {
|
2017-05-23 22:24:42 +02:00
|
|
|
|
if conditionalGetInfoPlist.count > 0 {
|
|
|
|
|
self.conditionalGetInfo = HTTPConditionalGetInfo(plist: conditionalGetInfoPlist)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if let contentHash = diskDictionary[feedContentHashKey] as? String {
|
|
|
|
|
self.contentHash = contentHash
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fileprivate func createDiskDictionary() -> NSDictionary {
|
|
|
|
|
|
|
|
|
|
let d = NSMutableDictionary()
|
|
|
|
|
|
|
|
|
|
d.setObjectWithStringKey(url as NSString, feedURLKey)
|
|
|
|
|
if feedID != url {
|
|
|
|
|
d.setObjectWithStringKey(feedID as NSString, feedIDKey)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if unreadCount > 0 {
|
|
|
|
|
d.setObjectWithStringKey(NSNumber(value: unreadCount), unreadCountKey)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d.setOptionalStringValue(homePageURL, feedHomePageKey)
|
|
|
|
|
d.setOptionalStringValue(name, feedNameKey)
|
|
|
|
|
d.setOptionalStringValue(editedName, feedEditedNameKey)
|
|
|
|
|
d.setOptionalStringValue(username, feedUsernameKey)
|
|
|
|
|
d.setOptionalStringValue(contentHash, feedContentHashKey)
|
|
|
|
|
|
2017-05-24 22:29:40 +02:00
|
|
|
|
if let conditionalGetInfoPlist = conditionalGetInfo?.plist {
|
2017-05-23 22:24:42 +02:00
|
|
|
|
d.setObjectWithStringKey(conditionalGetInfoPlist, feedConditionalGetInfoKey)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return d
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|