summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/ios/Classes/MuDocumentController.h4
-rw-r--r--platform/ios/Classes/MuDocumentController.m111
-rw-r--r--platform/ios/Classes/MuLibraryController.h1
-rw-r--r--platform/ios/Classes/MuLibraryController.m22
4 files changed, 127 insertions, 11 deletions
diff --git a/platform/ios/Classes/MuDocumentController.h b/platform/ios/Classes/MuDocumentController.h
index 719fcd5e..d8fd7000 100644
--- a/platform/ios/Classes/MuDocumentController.h
+++ b/platform/ios/Classes/MuDocumentController.h
@@ -34,6 +34,7 @@ enum
fz_document *doc;
MuDocRef *docRef;
NSString *key;
+ char *filePath;
BOOL reflowMode;
MuOutlineController *outline;
UIScrollView *canvas;
@@ -47,6 +48,7 @@ enum
UIBarButtonItem *tickButton;
UIBarButtonItem *deleteButton;
UIBarButtonItem *reflowButton;
+ UIBarButtonItem *backButton;
UIBarButtonItem *sliderWrapper;
int barmode;
int searchPage;
@@ -58,7 +60,7 @@ enum
int scroll_animating; // stop view updates during scrolling animations
float scale; // scale applied to views (only used in reflow mode)
}
-- (id) initWithFilename: (NSString*)nsfilename document: (MuDocRef *)aDoc;
+- (id) initWithFilename: (NSString*)nsfilename path:(char *)cstr document:(MuDocRef *)aDoc;
- (void) createPageView: (int)number;
- (void) gotoPage: (int)number animated: (BOOL)animated;
- (void) onShowOutline: (id)sender;
diff --git a/platform/ios/Classes/MuDocumentController.m b/platform/ios/Classes/MuDocumentController.m
index 49448df1..d08b5950 100644
--- a/platform/ios/Classes/MuDocumentController.m
+++ b/platform/ios/Classes/MuDocumentController.m
@@ -44,9 +44,88 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
}
}
+static char *tmp_path(char *path)
+{
+ int f;
+ char *buf = malloc(strlen(path) + 6 + 1);
+ if (!buf)
+ return NULL;
+
+ strcpy(buf, path);
+ strcat(buf, "XXXXXX");
+
+ f = mkstemp(buf);
+
+ if (f >= 0)
+ {
+ close(f);
+ return buf;
+ }
+ else
+ {
+ free(buf);
+ return NULL;
+ }
+}
+
+static void saveDoc(char *current_path, fz_document *doc)
+{
+ char *tmp;
+ fz_write_options opts;
+ opts.do_incremental = 1;
+ opts.do_ascii = 0;
+ opts.do_expand = 0;
+ opts.do_garbage = 0;
+ opts.do_linear = 0;
+
+ tmp = tmp_path(current_path);
+ if (tmp)
+ {
+ int written = 0;
+
+ fz_var(written);
+ fz_try(ctx)
+ {
+ FILE *fin = fopen(current_path, "rb");
+ FILE *fout = fopen(tmp, "wb");
+ char buf[256];
+ int n, err = 1;
+
+ if (fin && fout)
+ {
+ while ((n = fread(buf, 1, sizeof(buf), fin)) > 0)
+ fwrite(buf, 1, n, fout);
+ err = (ferror(fin) || ferror(fout));
+ }
+
+ if (fin)
+ fclose(fin);
+ if (fout)
+ fclose(fout);
+
+ if (!err)
+ {
+ fz_write_document(doc, tmp, &opts);
+ written = 1;
+ }
+ }
+ fz_catch(ctx)
+ {
+ written = 0;
+ }
+
+ if (written)
+ {
+ rename(tmp, current_path);
+ }
+
+ free(tmp);
+ }
+}
+
@implementation MuDocumentController
-- (id) initWithFilename: (NSString*)filename document: (MuDocRef *)aDoc
+- (id) initWithFilename: (NSString*)filename path:(char *)cstr document: (MuDocRef *)aDoc
{
self = [super init];
if (!self)
@@ -59,6 +138,7 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
key = [filename retain];
docRef = [aDoc retain];
doc = docRef->doc;
+ filePath = strdup(cstr);
dispatch_sync(queue, ^{});
@@ -92,6 +172,7 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
[array addObject:reflowButton];
[array addObject:linkButton];
[[self navigationItem] setRightBarButtonItems: array ];
+ [[self navigationItem] setLeftBarButtonItem:backButton];
}
- (void) loadView
@@ -168,6 +249,7 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
tickButton = [self resourceBasedButton:@"ic_check" withAction:@selector(onTick:)];
deleteButton = [self resourceBasedButton:@"ic_trash" withAction:@selector(onDelete:)];
searchBar = [[UISearchBar alloc] initWithFrame: CGRectMake(0,0,50,32)];
+ backButton = [self resourceBasedButton:@"ic_arrow_left" withAction:@selector(onBack:)];
[searchBar setPlaceholder: @"Search"];
[searchBar setDelegate: self];
@@ -203,6 +285,7 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
[tickButton release]; tickButton = nil;
[deleteButton release]; deleteButton = nil;
[canvas release]; canvas = nil;
+ free(filePath); filePath = NULL;
[outline release];
[key release];
@@ -479,7 +562,6 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
case BARMODE_ANNOTATION:
[[self navigationItem] setTitleView: nil];
[self addMainMenuButtons];
- [[self navigationItem] setLeftBarButtonItem: nil];
barmode = BARMODE_MAIN;
break;
@@ -498,6 +580,31 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
}
}
+- (void) onBack: (id)sender
+{
+ pdf_document *idoc = pdf_specifics(doc);
+ if (idoc && pdf_has_unsaved_changes(idoc))
+ {
+ UIAlertView *saveAlert = [[UIAlertView alloc]
+ initWithTitle:@"Save changes?" message:nil delegate:self
+ cancelButtonTitle:@"Discard" otherButtonTitles:@"Save", nil];
+ [saveAlert show];
+ }
+ else
+ {
+ [[self navigationController] popViewControllerAnimated:YES];
+ }
+}
+
+- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
+{
+ if (buttonIndex == 1)
+ saveDoc(filePath, doc);
+
+ [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
+ [[self navigationController] popViewControllerAnimated:YES];
+}
+
- (void) resetSearch
{
searchPage = -1;
diff --git a/platform/ios/Classes/MuLibraryController.h b/platform/ios/Classes/MuLibraryController.h
index 0f823d5d..d95f1652 100644
--- a/platform/ios/Classes/MuLibraryController.h
+++ b/platform/ios/Classes/MuLibraryController.h
@@ -21,6 +21,7 @@
NSTimer *timer;
MuDocRef *doc;
NSString *_filename;
+ char *_filePath;
}
- (void) openDocument: (NSString*)filename;
- (void) askForPassword: (NSString*)prompt;
diff --git a/platform/ios/Classes/MuLibraryController.m b/platform/ios/Classes/MuLibraryController.m
index 7f21b303..f5e93351 100644
--- a/platform/ios/Classes/MuLibraryController.m
+++ b/platform/ios/Classes/MuLibraryController.m
@@ -153,19 +153,23 @@ static void showAlert(NSString *msg, NSString *filename)
- (void) openDocument: (NSString*)nsfilename
{
- char filename[PATH_MAX];
+ NSString *nspath = [[NSArray arrayWithObjects:NSHomeDirectory(), @"Documents", nsfilename, nil]
+ componentsJoinedByString:@"/"];
+ _filePath = malloc(strlen([nspath UTF8String])+1);
+ if (_filePath == NULL) {
+ showAlert(@"Out of memory in openDocument", nsfilename);
+ return;
+ }
- dispatch_sync(queue, ^{});
+ strcpy(_filePath, [nspath UTF8String]);
- strcpy(filename, [NSHomeDirectory() UTF8String]);
- strcat(filename, "/Documents/");
- strcat(filename, [nsfilename UTF8String]);
+ dispatch_sync(queue, ^{});
- printf("open document '%s'\n", filename);
+ printf("open document '%s'\n", _filePath);
_filename = [nsfilename retain];
[doc release];
- doc = [[MuDocRef alloc] initWithFilename:filename];
+ doc = [[MuDocRef alloc] initWithFilename:_filePath];
if (!doc) {
showAlert(@"Cannot open document", nsfilename);
return;
@@ -206,18 +210,20 @@ static void showAlert(NSString *msg, NSString *filename)
- (void) onPasswordOkay
{
- MuDocumentController *document = [[MuDocumentController alloc] initWithFilename: _filename document: doc];
+ MuDocumentController *document = [[MuDocumentController alloc] initWithFilename: _filename path:_filePath document: doc];
if (document) {
[self setTitle: @"Library"];
[[self navigationController] pushViewController: document animated: YES];
[document release];
}
[_filename release];
+ free(_filePath);
}
- (void) onPasswordCancel
{
[_filename release];
+ free(_filePath);
printf("close document (password cancel)\n");
}