Revision: 2863
          http://skim-app.svn.sourceforge.net/skim-app/?rev=2863&view=rev
Author:   hofman
Date:     2007-09-09 12:05:14 -0700 (Sun, 09 Sep 2007)

Log Message:
-----------
Add a convenience method to find the PDF file in a PDF bundle.

Allow passing the PDF file name for the FDF string.

Save an FDF file in the PDF bundle.

Modified Paths:
--------------
    trunk/SKDocument.h
    trunk/SKDocument.m

Modified: trunk/SKDocument.h
===================================================================
--- trunk/SKDocument.h  2007-09-09 18:11:45 UTC (rev 2862)
+++ trunk/SKDocument.h  2007-09-09 19:05:14 UTC (rev 2863)
@@ -103,6 +103,7 @@
 - (NSString *)notesString;
 - (NSData *)notesRTFData;
 - (NSString *)notesFDFString;
+- (NSString *)notesFDFStringForFile:(NSString *)filename;
 
 - (NSDictionary *)currentDocumentSetup;
 

Modified: trunk/SKDocument.m
===================================================================
--- trunk/SKDocument.m  2007-09-09 18:11:45 UTC (rev 2862)
+++ trunk/SKDocument.m  2007-09-09 19:05:14 UTC (rev 2863)
@@ -70,8 +70,15 @@
 
 NSString *SKDocumentWillSaveNotification = @"SKDocumentWillSaveNotification";
 
[EMAIL PROTECTED] SKDocument (Private)
 
[EMAIL PROTECTED] NSFileManager (SKDocumentExtensions)
+- (NSString *)subfileWithExtension:(NSString *)extensions 
inPDFBundleAtPath:(NSString *)path;
[EMAIL PROTECTED]
+
+#pragma mark -
+
[EMAIL PROTECTED] SKDocument (SKPrivate)
+
 - (void)setPDFData:(NSData *)data;
 - (void)setPDFDoc:(PDFDocument *)doc;
 - (void)setNoteDicts:(NSArray *)array;
@@ -86,6 +93,7 @@
 
 @end
 
+#pragma mark -
 
 @implementation SKDocument
 
@@ -247,7 +255,7 @@
             
             if (success = [self writeToURL:tmpURL ofType:typeName 
error:outError]) {
                 
-                NSSet *ourExtensions = [NSSet setWithObjects:@"pdf", @"skim", 
@"txt", @"text", @"rtf", @"plist", nil];
+                NSSet *ourExtensions = [NSSet setWithObjects:@"pdf", @"skim", 
@"fdf", @"txt", @"text", @"rtf", @"plist", nil];
                 NSSet *ourImportantExtensions = [NSSet setWithObjects:@"pdf", 
@"skim", nil];
                 NSEnumerator *fileEnum;
                 NSString *file;
@@ -324,16 +332,18 @@
         didWrite = [pdfData writeToURL:absoluteURL options:NSAtomicWrite 
error:outError] &&
                    [self saveNotesToExtendedAttributesAtURL:absoluteURL 
error:outError];
     } else if ([typeName isEqualToString:SKPDFBundleDocumentType]) {
-        NSData *notesData = [[self notes] count] ? [NSKeyedArchiver 
archivedDataWithRootObject:[[self notes] valueForKey:@"dictionaryValue"]] : nil;
-        NSData *notesTextData = [[self notesString] 
dataUsingEncoding:NSUTF8StringEncoding];
-        NSData *notesRTFData = [self notesRTFData];
+        NSString *name = [[[absoluteURL path] lastPathComponent] 
stringByDeletingPathExtension];
+        if ([name caseInsensitiveCompare:BUNDLE_DATA_FILENAME] == 
NSOrderedSame)
+            name = [name stringByAppendingString:@"1"];
+        BOOL hasNotes = [[self notes] count] > 0;
+        NSData *notesData = hasNotes ? [NSKeyedArchiver 
archivedDataWithRootObject:[[self notes] valueForKey:@"dictionaryValue"]] : nil;
+        NSData *notesTextData = hasNotes ? [[self notesString] 
dataUsingEncoding:NSUTF8StringEncoding] : nil;
+        NSData *notesRTFData = hasNotes ? [self notesRTFData] : nil;
+        NSData *notesFDFData = hasNotes ? [[self notesFDFStringForFile:[name 
stringByAppendingPathExtension:@"pdf"]] 
dataUsingEncoding:NSISOLatin1StringEncoding] : nil;
         NSData *textData = [[[self pdfDocument] string] 
dataUsingEncoding:NSUTF8StringEncoding];
         NSDictionary *info = [[SKInfoWindowController sharedInstance] 
infoForDocument:self];
         NSData *infoData = [NSPropertyListSerialization 
dataFromPropertyList:info format:NSPropertyListXMLFormat_v1_0 
errorDescription:NULL];
         NSFileWrapper *fileWrapper = [[NSFileWrapper alloc] 
initDirectoryWithFileWrappers:[NSDictionary dictionary]];
-        NSString *name = [[[absoluteURL path] lastPathComponent] 
stringByDeletingPathExtension];
-        if ([name caseInsensitiveCompare:BUNDLE_DATA_FILENAME] == 
NSOrderedSame)
-            name = [name stringByAppendingString:@"1"];
         [fileWrapper addRegularFileWithContents:pdfData 
preferredFilename:[name stringByAppendingPathExtension:@"pdf"]];
         if (notesData)
             [fileWrapper addRegularFileWithContents:notesData 
preferredFilename:[name stringByAppendingPathExtension:@"skim"]];
@@ -341,6 +351,8 @@
             [fileWrapper addRegularFileWithContents:notesTextData 
preferredFilename:[name stringByAppendingPathExtension:@"txt"]];
         if (notesRTFData)
             [fileWrapper addRegularFileWithContents:notesRTFData 
preferredFilename:[name stringByAppendingPathExtension:@"rtf"]];
+        if (notesFDFData)
+            [fileWrapper addRegularFileWithContents:notesRTFData 
preferredFilename:[name stringByAppendingPathExtension:@"fdf"]];
         if (textData)
             [fileWrapper addRegularFileWithContents:textData 
preferredFilename:[BUNDLE_DATA_FILENAME stringByAppendingPathExtension:@"txt"]];
         if (infoData)
@@ -374,6 +386,12 @@
         else if (outError != NULL)
             *outError = [NSError errorWithDomain:SKDocumentErrorDomain code:1 
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Unable 
to write notes as text", @"Error description"), NSLocalizedDescriptionKey, 
nil]];
     } else if ([typeName isEqualToString:SKNotesFDFDocumentType]) {
+        NSString *filePath = [[self fileURL] path];
+        NSString *filename = [filePath lastPathComponent];
+        if (filename && [[self fileType] 
isEqualToString:SKPDFBundleDocumentType]) {
+            NSString *pdfFile = [[NSFileManager defaultManager] 
subfileWithExtension:@"pdf" inPDFBundleAtPath:filePath];
+            filename = pdfFile ? [filename 
stringByAppendingPathComponent:pdfFile] : nil;
+        }
         NSString *string = [self notesFDFString];
         if (string)
             didWrite = [string writeToURL:absoluteURL atomically:YES 
encoding:NSISOLatin1StringEncoding error:outError];
@@ -417,6 +435,8 @@
         [dict setObject:[NSNumber numberWithUnsignedLong:'PDFD'] 
forKey:NSFileHFSTypeCode];
     else if ([[[absoluteURL path] pathExtension] isEqualToString:@"skim"] || 
[typeName isEqualToString:SKNotesDocumentType])
         [dict setObject:[NSNumber numberWithUnsignedLong:'SKNT'] 
forKey:NSFileHFSTypeCode];
+    else if ([[[absoluteURL path] pathExtension] isEqualToString:@"fdf"] || 
[typeName isEqualToString:SKNotesFDFDocumentType])
+        [dict setObject:[NSNumber numberWithUnsignedLong:'FDF '] 
forKey:NSFileHFSTypeCode];
     else if ([[[absoluteURL path] pathExtension] isEqualToString:@"rtf"] || 
[typeName isEqualToString:SKNotesRTFDocumentType])
         [dict setObject:[NSNumber numberWithUnsignedLong:'RTF '] 
forKey:NSFileHFSTypeCode];
     else if ([[[absoluteURL path] pathExtension] isEqualToString:@"txt"] || 
[typeName isEqualToString:SKNotesTextDocumentType])
@@ -527,51 +547,20 @@
             }
         }
     } else if ([docType isEqualToString:SKPDFBundleDocumentType]) {
-        NSFileWrapper *fileWrapper = [[NSFileWrapper alloc] 
initWithPath:[absoluteURL path]];
-        NSFileWrapper *pdfFW = nil;
-        NSFileWrapper *skimFW = nil;
-        NSDictionary *fileWrappers = [fileWrapper fileWrappers];
-        NSArray *noteArray = nil;
-        NSString *name = [[[absoluteURL path] lastPathComponent] 
stringByDeletingPathExtension];
-        if ([name caseInsensitiveCompare:BUNDLE_DATA_FILENAME] == 
NSOrderedSame)
-            name = [name stringByAppendingString:@"1"];
-        
-        pdfFW = [fileWrappers objectForKey:[name 
stringByAppendingPathExtension:@"pdf"]];
-        if ([pdfFW isRegularFile] == NO)
-            pdfFW = nil;
-        skimFW = [fileWrappers objectForKey:[name 
stringByAppendingPathExtension:@"skim"]];
-        if ([skimFW isRegularFile] == NO)
-            skimFW = nil;
-        if (pdfFW == nil || skimFW == nil) {
-            NSArray *fws = [fileWrappers allValues];
-            NSArray *extensions = [fws 
valueForKeyPath:@"filename.pathExtension.lowercaseString"];
-            unsigned int index;
-            if (pdfFW == nil) {
-                index = [extensions indexOfObject:@"pdf"];
-                if (index != NSNotFound) {
-                    pdfFW = [fws objectAtIndex:index];
-                    if ([pdfFW isRegularFile] == NO)
-                        pdfFW = nil;
+        NSString *path = [absoluteURL path];
+        NSString *pdfFile = [[NSFileManager defaultManager] 
subfileWithExtension:@"pdf" inPDFBundleAtPath:path];
+        if (pdfFile) {
+            NSURL *pdfURL = [NSURL fileURLWithPath:[path 
stringByAppendingPathComponent:pdfFile]];
+            if ((data = [[NSData alloc] initWithContentsOfURL:pdfURL 
options:NSUncachedRead error:&error]) &&
+                (pdfDoc = [[PDFDocument alloc] initWithURL:pdfURL])) {
+                NSString *skimFile = [[NSFileManager defaultManager] 
subfileWithExtension:@"skim" inPDFBundleAtPath:path];
+                if (skimFile) {
+                    NSArray *array = [NSKeyedUnarchiver 
unarchiveObjectWithFile:[path stringByAppendingPathComponent:skimFile]];
+                    if (array)
+                        [self setNoteDicts:array];
                 }
             }
-            if (skimFW == nil) {
-                index = [extensions indexOfObject:@"skim"];
-                if (index != NSNotFound) {
-                    skimFW = [fws objectAtIndex:index];
-                    if ([skimFW isRegularFile] == NO)
-                        skimFW = nil;
-                }
-            }
         }
-        if (pdfFW) {
-            data = [[pdfFW regularFileContents] retain];
-            pdfDoc = [[PDFDocument alloc] initWithURL:[NSURL 
fileURLWithPath:[[absoluteURL path] stringByAppendingPathComponent:[pdfFW 
filename]]]];
-        }
-        if (skimFW) {
-            if (noteArray = [NSKeyedUnarchiver unarchiveObjectWithData:[skimFW 
regularFileContents]])
-                [self setNoteDicts:noteArray];
-        }
-        [fileWrapper release];
     } else if ([docType isEqualToString:SKPostScriptDocumentType]) {
         if (data = [NSData dataWithContentsOfURL:absoluteURL 
options:NSUncachedRead error:&error]) {
             SKPSProgressController *progressController = 
[[SKPSProgressController alloc] init];
@@ -1036,16 +1025,9 @@
                 if (theUTI && UTTypeConformsTo((CFStringRef)theUTI, 
CFSTR("application/x-dvi"))) {
                     return;
                 } if (theUTI && UTTypeConformsTo((CFStringRef)theUTI, 
CFSTR("net.sourceforge.skim-app.pdfd"))) {
-                    NSString *pdfFile = [fileName 
stringByAppendingPathComponent:@"data.pdf"];
-                    if ([[NSFileManager defaultManager] 
fileExistsAtPath:pdfFile]) {
-                        fileName = pdfFile;
-                    } else {
-                        NSArray *subfiles = [[NSFileManager defaultManager] 
subpathsAtPath:fileName];
-                        unsigned int index = [[subfiles 
valueForKeyPath:@"pathExtension.lowercaseString"] indexOfObject:@"pdf"];
-                        if (index == NSNotFound)
-                            return;
-                        fileName = [fileName 
stringByAppendingPathComponent:[subfiles objectAtIndex:index]];
-                    }
+                    NSString *pdfFile = [[NSFileManager defaultManager] 
subfileWithExtension:@"pdf" inPDFBundleAtPath:fileName];
+                    if (pdfFile == nil) return;
+                    fileName = [fileName 
stringByAppendingPathComponent:pdfFile];
                 }
             }
             
@@ -1355,19 +1337,22 @@
 }
 
 - (NSString *)notesFDFString {
-    NSString *filename = [[[self fileURL] path] lastPathComponent];
+    NSString *filePath = [[self fileURL] path];
+    NSString *filename = [filePath lastPathComponent];
+    if (filename && [[self fileType] isEqualToString:SKPDFBundleDocumentType]) 
{
+        NSString *pdfFile = [[NSFileManager defaultManager] 
subfileWithExtension:@"pdf" inPDFBundleAtPath:filePath];
+        filename = pdfFile ? [filename stringByAppendingPathComponent:pdfFile] 
: nil;
+    }
+    return [self notesFDFStringForFile:filename];
+}
+
+- (NSString *)notesFDFStringForFile:(NSString *)filename {
     NSString *fileIDString = [self fileIDString];
     int i, count = [[self notes] count];
     NSMutableString *string = [NSMutableString 
stringWithFormat:@"%%FDF-1.2\n%%%C%C%C%C\n1 0 obj<</FDF<<", 0xe2, 0xe3, 0xcf, 
0xd3];
     [string appendString:@"/Annots["];
     for (i = 0; i < count; i++)
         [string appendFormat:@"%i 0 R ", i + 2];
-    if (filename && [[self fileType] isEqualToString:SKPDFBundleDocumentType]) 
{
-        NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:[[self 
fileURL] path]];
-        unsigned index = [[files 
valueForKeyPath:@"pathExtension.lowercaseString"] indexOfObject:@"pdf"];
-        if (index != NSNotFound)
-            filename = [filename stringByAppendingPathComponent:[files 
objectAtIndex:index]];
-    }
     [string appendFormat:@"]/F(%@)", filename ? [filename 
stringByEscapingParenthesis] : @""];
     if (fileIDString)
         [string appendFormat:@"/[EMAIL PROTECTED]", fileIDString];
@@ -1747,3 +1732,23 @@
 }
 
 @end
+
+
[EMAIL PROTECTED] NSFileManager (SKDocumentExtensions)
+
+- (NSString *)subfileWithExtension:(NSString *)extension 
inPDFBundleAtPath:(NSString *)path {
+    NSArray *subfiles = [self subpathsAtPath:path];
+    NSString *fileName = [[[path stringByDeletingLastPathComponent] 
stringByDeletingPathExtension] stringByAppendingPathExtension:extension];
+    NSString *pdfFile = nil;
+    
+    if ([subfiles containsObject:fileName]) {
+        pdfFile = fileName;
+    } else {
+        unsigned int index = [[subfiles 
valueForKeyPath:@"pathExtension.lowercaseString"] indexOfObject:extension];
+        if (index == NSNotFound)
+            pdfFile = [subfiles objectAtIndex:index];
+    }
+    return pdfFile;
+}
+
[EMAIL PROTECTED]


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to