From c2da61c6175aa09418ddaa39d7e97a3a9d13d5c3 Mon Sep 17 00:00:00 2001 From: ChrisLi Date: Mon, 5 Aug 2019 20:23:14 -0400 Subject: [PATCH] additional alerts when import zim file (#162) * getMetaDataWithFileURL * Alerts --- Shared/ZimMultiReader/ZimMultiReader.h | 4 ++ Shared/ZimMultiReader/ZimMultiReader.mm | 69 +++++++++++-------- Shared/ZimMultiReader/ZimMultiReader.swift | 4 ++ iOS/AppDelegate.swift | 11 +-- iOS/Controller/FileImportController.swift | 28 +++++++- .../Library/LibraryMasterController.swift | 6 +- 6 files changed, 88 insertions(+), 34 deletions(-) diff --git a/Shared/ZimMultiReader/ZimMultiReader.h b/Shared/ZimMultiReader/ZimMultiReader.h index 6d101912..2440013c 100644 --- a/Shared/ZimMultiReader/ZimMultiReader.h +++ b/Shared/ZimMultiReader/ZimMultiReader.h @@ -34,4 +34,8 @@ - (void)stopIndexSearch; - (NSArray *_Nonnull)getTitleSearchResults:(NSString *_Nonnull)searchText zimFileID:(NSString *_Nullable)zimFileID count:(unsigned int)count NS_REFINED_FOR_SWIFT; +NS_ASSUME_NONNULL_BEGIN ++ (NSDictionary *_Nullable)getMetaDataWithFileURL:(NSURL *)url NS_REFINED_FOR_SWIFT; +NS_ASSUME_NONNULL_END + @end diff --git a/Shared/ZimMultiReader/ZimMultiReader.mm b/Shared/ZimMultiReader/ZimMultiReader.mm index d93fa395..ef72a48d 100644 --- a/Shared/ZimMultiReader/ZimMultiReader.mm +++ b/Shared/ZimMultiReader/ZimMultiReader.mm @@ -154,37 +154,13 @@ NSMutableDictionary *fileURLs = [[NSMutableDictionary alloc] init]; // [ID: File } } -- (NSDictionary *_Nullable)getMetaData:(NSString *_Nonnull)zimFileID { +- (NSDictionary *)getMetaData:(NSString *_Nonnull)zimFileID { auto found = readers.find([zimFileID cStringUsingEncoding:NSUTF8StringEncoding]); if (found == readers.end()) { return nil; } else { std::shared_ptr reader = found->second; - - NSMutableDictionary *meta = [[NSMutableDictionary alloc] init]; - - meta[@"id"] = [NSString stringWithCString:reader->getId().c_str() encoding:NSUTF8StringEncoding]; - meta[@"name"] = [NSString stringWithCString:reader->getName().c_str() encoding:NSUTF8StringEncoding]; - - meta[@"title"] = [NSString stringWithCString:reader->getTitle().c_str() encoding:NSUTF8StringEncoding]; - meta[@"description"] = [NSString stringWithCString:reader->getDescription().c_str() encoding:NSUTF8StringEncoding]; - meta[@"language"] = [NSString stringWithCString:reader->getLanguage().c_str() encoding:NSUTF8StringEncoding]; - - meta[@"tags"] = [NSString stringWithCString:reader->getTags().c_str() encoding:NSUTF8StringEncoding]; - meta[@"date"] = [NSString stringWithCString:reader->getDate().c_str() encoding:NSUTF8StringEncoding]; - meta[@"creator"] = [NSString stringWithCString:reader->getCreator().c_str() encoding:NSUTF8StringEncoding]; - meta[@"publisher"] = [NSString stringWithCString:reader->getPublisher().c_str() encoding:NSUTF8StringEncoding]; - meta[@"fileSize"] = [[NSNumber alloc] initWithLongLong:(long long)reader->getFileSize() * 1024]; - meta[@"articleCount"] = [[NSNumber alloc] initWithLongLong:reader->getArticleCount()]; - meta[@"mediaCount"] = [[NSNumber alloc] initWithLongLong:reader->getMediaCount()]; - meta[@"globalCount"] = [[NSNumber alloc] initWithLongLong:reader->getGlobalCount()]; - - string faviconEncoded; - string mimeType; - if (reader->getFavicon(faviconEncoded, mimeType)) { - meta[@"icon"] = [NSData dataWithBytes:faviconEncoded.c_str() length:faviconEncoded.length()]; - } - return meta; + return [ZimMultiReader getMetaDataWithReader:reader]; } } @@ -271,7 +247,46 @@ NSMutableDictionary *fileURLs = [[NSMutableDictionary alloc] init]; // [ID: File } } -# pragma mark - Geo Search +# pragma mark - class methods ++ (NSDictionary *)getMetaDataWithFileURL:(NSURL *)url { + [url startAccessingSecurityScopedResource]; + try { + std::shared_ptr reader = std::make_shared([url fileSystemRepresentation]); + [url stopAccessingSecurityScopedResource]; + return [ZimMultiReader getMetaDataWithReader:reader]; + } catch (std::exception e) { + [url stopAccessingSecurityScopedResource]; + return nil; + } +} + ++ (NSDictionary *)getMetaDataWithReader:(std::shared_ptr)reader { + NSMutableDictionary *meta = [[NSMutableDictionary alloc] init]; + + meta[@"id"] = [NSString stringWithCString:reader->getId().c_str() encoding:NSUTF8StringEncoding]; + meta[@"name"] = [NSString stringWithCString:reader->getName().c_str() encoding:NSUTF8StringEncoding]; + + meta[@"title"] = [NSString stringWithCString:reader->getTitle().c_str() encoding:NSUTF8StringEncoding]; + meta[@"description"] = [NSString stringWithCString:reader->getDescription().c_str() encoding:NSUTF8StringEncoding]; + meta[@"language"] = [NSString stringWithCString:reader->getLanguage().c_str() encoding:NSUTF8StringEncoding]; + + meta[@"tags"] = [NSString stringWithCString:reader->getTags().c_str() encoding:NSUTF8StringEncoding]; + meta[@"date"] = [NSString stringWithCString:reader->getDate().c_str() encoding:NSUTF8StringEncoding]; + meta[@"creator"] = [NSString stringWithCString:reader->getCreator().c_str() encoding:NSUTF8StringEncoding]; + meta[@"publisher"] = [NSString stringWithCString:reader->getPublisher().c_str() encoding:NSUTF8StringEncoding]; + meta[@"fileSize"] = [[NSNumber alloc] initWithLongLong:(long long)reader->getFileSize() * 1024]; + meta[@"articleCount"] = [[NSNumber alloc] initWithLongLong:reader->getArticleCount()]; + meta[@"mediaCount"] = [[NSNumber alloc] initWithLongLong:reader->getMediaCount()]; + meta[@"globalCount"] = [[NSNumber alloc] initWithLongLong:reader->getGlobalCount()]; + + string faviconEncoded; + string mimeType; + if (reader->getFavicon(faviconEncoded, mimeType)) { + meta[@"icon"] = [NSData dataWithBytes:faviconEncoded.c_str() length:faviconEncoded.length()]; + } + + return meta; +} @end diff --git a/Shared/ZimMultiReader/ZimMultiReader.swift b/Shared/ZimMultiReader/ZimMultiReader.swift index b0b5515c..c9207134 100644 --- a/Shared/ZimMultiReader/ZimMultiReader.swift +++ b/Shared/ZimMultiReader/ZimMultiReader.swift @@ -62,4 +62,8 @@ extension ZimMultiReader { return SearchResult(zimFileID: id, path: path, title: title) } } + + static func getMetaData(url: URL) -> [String: Any]? { + return __getMetaData(withFileURL: url) as? [String: Any] + } } diff --git a/iOS/AppDelegate.swift b/iOS/AppDelegate.swift index 4abcff20..0c73fb00 100644 --- a/iOS/AppDelegate.swift +++ b/iOS/AppDelegate.swift @@ -68,12 +68,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, DirectoryMonitorDelegate mainController.load(url: url) return true } else if url.scheme == "file" { - let canOpenInPlace = options[.openInPlace] as? Bool ?? false - let fileImportController = FileImportController(fileURL: url, canOpenInPlace: canOpenInPlace) - mainController.present(fileImportController, animated: true) + if let _ = ZimMultiReader.getMetaData(url: url) { + let canOpenInPlace = options[.openInPlace] as? Bool ?? false + let fileImportController = FileImportController(fileURL: url, canOpenInPlace: canOpenInPlace) + mainController.present(fileImportController, animated: true) + } else { + mainController.present(FileImportAlertController(fileName: url.lastPathComponent), animated: true) + } return true } else { - print(url) return false } } diff --git a/iOS/Controller/FileImportController.swift b/iOS/Controller/FileImportController.swift index 071f86e7..9c024447 100644 --- a/iOS/Controller/FileImportController.swift +++ b/iOS/Controller/FileImportController.swift @@ -100,7 +100,6 @@ fileprivate class ContentController: UIViewController, UITableViewDelegate, UITa func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { defer { tableView.deselectRow(at: indexPath, animated: true) - dismiss(animated: true) } guard indexPath.section == items.count - 1, let action = items[indexPath.section][indexPath.row] as? Action else {return} @@ -116,13 +115,38 @@ fileprivate class ContentController: UIViewController, UITableViewDelegate, UITa case .openInPlace: LibraryOperationQueue.shared.addOperation(LibraryScanOperation(url: url)) } + dismiss(animated: true) } catch { - print(error) + present(FileImportAlertController(error: error), animated: true) } } } +class FileImportAlertController: UIAlertController { + convenience init(message: String) { + self.init(title: NSLocalizedString("File Import Error", comment: "File Import Error"), + message: message, + preferredStyle: .alert) + let ok = NSLocalizedString("OK", comment: "File Import Error") + addAction(UIAlertAction(title: ok, style: .default, handler: { action in + self.dismiss(animated: true) + })) + } + + convenience init(fileName: String) { + let message = NSLocalizedString( + "The file \"\(fileName)\" seems to be corrupt and Kiwix was unable to open it.", + comment: "File Import Error") + self.init(message: message) + } + + convenience init(error: Error) { + self.init(message: error.localizedDescription) + } +} + + fileprivate protocol Item: CustomStringConvertible {} diff --git a/iOS/Controller/Library/LibraryMasterController.swift b/iOS/Controller/Library/LibraryMasterController.swift index 5752b5d7..c79f2ad3 100644 --- a/iOS/Controller/Library/LibraryMasterController.swift +++ b/iOS/Controller/Library/LibraryMasterController.swift @@ -218,7 +218,11 @@ class LibraryMasterController: UIViewController, UIDocumentPickerDelegate, UITab // MARK: - UIDocumentPickerDelegate func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { - present(FileImportController(fileURL: url), animated: true) + if let _ = ZimMultiReader.getMetaData(url: url) { + present(FileImportController(fileURL: url), animated: true) + } else { + present(FileImportAlertController(fileName: url.lastPathComponent), animated: true) + } } // MARK: - UITableViewDataSource & Delegates