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