additional alerts when import zim file (#162)

* getMetaDataWithFileURL

* Alerts
This commit is contained in:
ChrisLi 2019-08-05 20:23:14 -04:00 committed by GitHub
parent 6ccba2d19b
commit c2da61c617
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 88 additions and 34 deletions

View File

@ -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

View File

@ -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<kiwix::Reader> 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<kiwix::Reader> reader = std::make_shared<kiwix::Reader>([url fileSystemRepresentation]);
[url stopAccessingSecurityScopedResource];
return [ZimMultiReader getMetaDataWithReader:reader];
} catch (std::exception e) {
[url stopAccessingSecurityScopedResource];
return nil;
}
}
+ (NSDictionary *)getMetaDataWithReader:(std::shared_ptr<kiwix::Reader>)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

View File

@ -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]
}
}

View File

@ -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
}
}

View File

@ -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 {}

View File

@ -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