Revision: 7404
          http://skim-app.svn.sourceforge.net/skim-app/?rev=7404&view=rev
Author:   hofman
Date:     2011-07-30 10:15:45 +0000 (Sat, 30 Jul 2011)

Log Message:
-----------
use old way to get PDF file ID strings as fallback when private methods don't 
work

Modified Paths:
--------------
    trunk/PDFDocument_SKExtensions.h
    trunk/PDFDocument_SKExtensions.m
    trunk/SKMainDocument.m

Modified: trunk/PDFDocument_SKExtensions.h
===================================================================
--- trunk/PDFDocument_SKExtensions.h    2011-07-27 12:14:32 UTC (rev 7403)
+++ trunk/PDFDocument_SKExtensions.h    2011-07-30 10:15:45 UTC (rev 7404)
@@ -43,5 +43,5 @@
 @interface PDFDocument (SKExtensions)
 - (PDFSelection *)selectionByExtendingSelection:(PDFSelection *)selection 
toPage:(PDFPage *)page atPoint:(NSPoint)point;
 - (NSArray *)pageLabels;
-- (NSArray *)fileIDStrings;
+- (NSArray *)fileIDStrings:(NSData *)pdfData;
 @end

Modified: trunk/PDFDocument_SKExtensions.m
===================================================================
--- trunk/PDFDocument_SKExtensions.m    2011-07-27 12:14:32 UTC (rev 7403)
+++ trunk/PDFDocument_SKExtensions.m    2011-07-30 10:15:45 UTC (rev 7404)
@@ -40,6 +40,7 @@
 #import "PDFSelection_SKExtensions.h"
 #import "NSNumber_SKExtensions.h"
 #import "PDFPage_SKExtensions.h"
+#import "NSData_SKExtensions.h"
 
 
 @interface PDFDocument (SKApplePrivateDeclarations)
@@ -148,15 +149,80 @@
     return pageLabels;
 }
 
-- (NSArray *)fileIDStrings {
-    if ([self respondsToSelector:@selector(documentRef)] == NO)
+inline NSRange SKRangeBetweenRanges(NSRange startRange, NSRange endRange) {
+    NSRange r;
+    r.location = NSMaxRange(startRange);
+    r.length = endRange.location - r.location;
+    return r;
+}
+
+inline NSRange SKMakeRangeFromEnd(NSUInteger end, NSUInteger length) {
+    NSRange r;
+    if (end > length) {
+        r.location = end - length;
+        r.length = length;
+    } else {
+        r.location = 0;
+        r.length = end;
+    }
+    return r;
+}
+
+static NSArray *fileIDStringsFromData(NSData *pdfData) {
+    if (pdfData == nil)
         return nil;
     
+    NSData *firstIDData = nil;
+    NSData *secondIDData = nil;
+    NSRange EOFRange = [pdfData rangeOfData:[NSData dataWithBytes:"%%EOF" 
length:5] options:NSDataSearchBackwards range:SKMakeRangeFromEnd([pdfData 
length], 1024UL)];
+    
+    if (EOFRange.location != NSNotFound) {
+        NSRange trailerRange = [pdfData rangeOfData:[NSData 
dataWithBytes:"trailer" length:7] options:NSDataSearchBackwards 
range:SKMakeRangeFromEnd(EOFRange.location, 2048UL)];
+        if (trailerRange.location != NSNotFound) {
+            NSRange IDRange = [pdfData rangeOfData:[NSData dataWithBytes:"/ID" 
length:3] options:0 range:SKRangeBetweenRanges(trailerRange, EOFRange)];
+            if (IDRange.location != NSNotFound) {
+                NSRange startArrayRange = [pdfData rangeOfData:[NSData 
dataWithBytes:"[" length:1] options:0 range:SKRangeBetweenRanges(IDRange, 
EOFRange)];
+                if (startArrayRange.location != NSNotFound) {
+                    NSRange endArrayRange = [pdfData rangeOfData:[NSData 
dataWithBytes:"]" length:1] options:0 
range:SKRangeBetweenRanges(startArrayRange, EOFRange)];
+                    if (endArrayRange.location != NSNotFound) {
+                        NSData *startStringPattern = [NSData dataWithBytes:"<" 
length:1];
+                        NSData *endStringPattern = [NSData dataWithBytes:">" 
length:1];
+                        NSRange startStringRange = [pdfData 
rangeOfData:startStringPattern options:0 
range:SKRangeBetweenRanges(startArrayRange, endArrayRange)];
+                        if (startStringRange.location != NSNotFound) {
+                            NSRange endStringRange = [pdfData 
rangeOfData:endStringPattern options:0 
range:SKRangeBetweenRanges(startStringRange, endArrayRange)];
+                            if (endStringRange.location != NSNotFound) {
+                                if ((firstIDData = [pdfData 
subdataWithRange:SKRangeBetweenRanges(startStringRange, endStringRange)])) {
+                                    startStringRange = [pdfData 
rangeOfData:startStringPattern options:0 
range:SKRangeBetweenRanges(endStringRange, endArrayRange)];
+                                    if (startStringRange.location != 
NSNotFound) {
+                                        endStringRange = [pdfData 
rangeOfData:endStringPattern options:0 
range:SKRangeBetweenRanges(startStringRange, endArrayRange)];
+                                        if (endStringRange.location != 
NSNotFound) {
+                                            secondIDData = [pdfData 
subdataWithRange:SKRangeBetweenRanges(startStringRange, endStringRange)];
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    if (secondIDData)
+        return [NSArray arrayWithObjects:
+                    [[[NSString alloc] initWithData:firstIDData 
encoding:NSISOLatin1StringEncoding] autorelease],
+                    [[[NSString alloc] initWithData:secondIDData 
encoding:NSISOLatin1StringEncoding] autorelease], nil];
+    return nil;
+}
+
+- (NSArray *)fileIDStrings:(NSData *)pdfData {
+    if ([self respondsToSelector:@selector(documentRef)] == NO)
+        return fileIDStringsFromData(pdfData);
+    
     CGPDFDocumentRef doc = (CGPDFDocumentRef)[self documentRef];
     CGPDFArrayRef idArray = CGPDFDocumentGetID(doc);
     
     if (idArray == NULL)
-        return nil;
+        return fileIDStringsFromData(pdfData);
     
     NSMutableArray *fileIDStrings = [NSMutableArray array];
     size_t i, iMax = CGPDFArrayGetCount(idArray);

Modified: trunk/SKMainDocument.m
===================================================================
--- trunk/SKMainDocument.m      2011-07-27 12:14:32 UTC (rev 7403)
+++ trunk/SKMainDocument.m      2011-07-30 10:15:45 UTC (rev 7404)
@@ -548,7 +548,7 @@
             [fileWrapper addRegularFileWithContents:data 
preferredFilename:[name stringByAppendingPathExtension:@"txt"]];
         if ((data = [self notesRTFData]))
             [fileWrapper addRegularFileWithContents:data 
preferredFilename:[name stringByAppendingPathExtension:@"rtf"]];
-        if ((data = [self notesFDFDataForFile:[name 
stringByAppendingPathExtension:@"pdf"] fileIDStrings:[[self pdfDocument] 
fileIDStrings]]))
+        if ((data = [self notesFDFDataForFile:[name 
stringByAppendingPathExtension:@"pdf"] fileIDStrings:[[self pdfDocument] 
fileIDStrings:pdfData]]))
             [fileWrapper addRegularFileWithContents:data 
preferredFilename:[name stringByAppendingPathExtension:@"fdf"]];
     }
     return [fileWrapper autorelease];
@@ -602,7 +602,7 @@
         NSString *filename = [filePath lastPathComponent];
         if (filename && [[self fileType] 
isEqualToString:SKPDFBundleDocumentType])
             filename = [[NSFileManager defaultManager] 
bundledFileWithExtension:@"pdf" inPDFBundleAtPath:filePath error:NULL];
-        NSData *data = [self notesFDFDataForFile:filename fileIDStrings:[[self 
pdfDocument] fileIDStrings]];
+        NSData *data = [self notesFDFDataForFile:filename fileIDStrings:[[self 
pdfDocument] fileIDStrings:pdfData]];
         if (data)
             didWrite = [data writeToURL:absoluteURL options:0 error:&error];
         else 
@@ -1502,25 +1502,6 @@
     return [[self mainWindowController] pdfView];
 }
 
-inline NSRange SKRangeBetweenRanges(NSRange startRange, NSRange endRange) {
-    NSRange r;
-    r.location = NSMaxRange(startRange);
-    r.length = endRange.location - r.location;
-    return r;
-}
-
-inline NSRange SKMakeRangeFromEnd(NSUInteger end, NSUInteger length) {
-    NSRange r;
-    if (end > length) {
-        r.location = end - length;
-        r.length = length;
-    } else {
-        r.location = 0;
-        r.length = end;
-    }
-    return r;
-}
-
 - (NSPrintInfo *)printInfo {
     NSPrintInfo *printInfo = [super printInfo];
     if ([[self pdfDocument] pageCount]) {
@@ -1626,7 +1607,7 @@
 }
 
 - (void)doSavePasswordInKeychain:(NSString *)password {
-    NSString *fileID = [[[self pdfDocument] fileIDStrings] lastObject] ?: 
[pdfData md5String];
+    NSString *fileID = [[[self pdfDocument] fileIDStrings:pdfData] lastObject] 
?: [pdfData md5String];
     if (fileID) {
         // first see if the password exists in the keychain
         SecKeychainItemRef itemRef = NULL;
@@ -1669,7 +1650,7 @@
     if ([document isLocked] == NO) {
         didUnlock = YES;
     } else if (NSAlertAlternateReturn != [[NSUserDefaults 
standardUserDefaults] integerForKey:SKSavePasswordOptionKey]) {
-        NSString *fileID = [[document fileIDStrings] lastObject] ?: [pdfData 
md5String];
+        NSString *fileID = [[document fileIDStrings:pdfData] lastObject] ?: 
[pdfData md5String];
         if (fileID) {
             NSString *password = nil;
             SecKeychainItemRef itemRef = NULL;


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

------------------------------------------------------------------------------
Got Input?   Slashdot Needs You.
Take our quick survey online.  Come on, we don't ask for help often.
Plus, you'll get a chance to win $100 to spend on ThinkGeek.
http://p.sf.net/sfu/slashdot-survey
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to