Revision: 7223
http://skim-app.svn.sourceforge.net/skim-app/?rev=7223&view=rev
Author: hofman
Date: 2011-05-11 11:25:22 +0000 (Wed, 11 May 2011)
Log Message:
-----------
get file ID strings from the PDFDocument
Modified Paths:
--------------
trunk/PDFDocument_SKExtensions.h
trunk/PDFDocument_SKExtensions.m
trunk/SKMainDocument.h
trunk/SKMainDocument.m
Modified: trunk/PDFDocument_SKExtensions.h
===================================================================
--- trunk/PDFDocument_SKExtensions.h 2011-05-11 09:17:45 UTC (rev 7222)
+++ trunk/PDFDocument_SKExtensions.h 2011-05-11 11:25:22 UTC (rev 7223)
@@ -43,4 +43,5 @@
@interface PDFDocument (SKExtensions)
- (PDFSelection *)selectionByExtendingSelection:(PDFSelection *)selection
toPage:(PDFPage *)page atPoint:(NSPoint)point;
- (NSArray *)pageLabels;
+- (NSArray *)fileIDStrings;
@end
Modified: trunk/PDFDocument_SKExtensions.m
===================================================================
--- trunk/PDFDocument_SKExtensions.m 2011-05-11 09:17:45 UTC (rev 7222)
+++ trunk/PDFDocument_SKExtensions.m 2011-05-11 11:25:22 UTC (rev 7223)
@@ -148,4 +148,36 @@
return pageLabels;
}
+- (NSArray *)fileIDStrings {
+ CGPDFDocumentRef doc = (CGPDFDocumentRef)[self documentRef];
+ CGPDFArrayRef idArray = CGPDFDocumentGetID(doc);
+
+ if (idArray == NULL)
+ return nil;
+
+ NSMutableArray *fileIDStrings = [NSMutableArray array];
+ size_t i, iMax = CGPDFArrayGetCount(idArray);
+
+ for (i = 0; i < iMax; i++) {
+ CGPDFStringRef idString;
+ if (CGPDFArrayGetString(idArray, i, &idString)) {
+ size_t j = 0, k = 0, length = CGPDFStringGetLength(idString);
+ const unsigned char *inputBuffer = CGPDFStringGetBytePtr(idString);
+ unsigned char outputBuffer[length * 2]; // length should be 16 so
no need to malloc
+ static unsigned char hexEncodeTable[17] = "0123456789abcdef";
+
+ for (j = 0; j < length; j++) {
+ outputBuffer[k++] = hexEncodeTable[(inputBuffer[j] & 0xF0) >>
4];
+ outputBuffer[k++] = hexEncodeTable[(inputBuffer[j] & 0x0F)];
+ }
+
+ NSString *fileID = [[NSString alloc] initWithBytes:outputBuffer
length:k encoding:NSASCIIStringEncoding];
+ [fileIDStrings addObject:fileID];
+ [fileID release];
+ }
+ }
+
+ return fileIDStrings;
+}
+
@end
Modified: trunk/SKMainDocument.h
===================================================================
--- trunk/SKMainDocument.h 2011-05-11 09:17:45 UTC (rev 7222)
+++ trunk/SKMainDocument.h 2011-05-11 11:25:22 UTC (rev 7223)
@@ -84,8 +84,6 @@
@property (nonatomic, readonly) SKPDFView *pdfView;
-@property (nonatomic, readonly) NSArray *fileIDStrings;
-
- (void)savePasswordInKeychain:(NSString *)password;
- (void)applySetup:(NSDictionary *)setup;
Modified: trunk/SKMainDocument.m
===================================================================
--- trunk/SKMainDocument.m 2011-05-11 09:17:45 UTC (rev 7222)
+++ trunk/SKMainDocument.m 2011-05-11 11:25:22 UTC (rev 7223)
@@ -83,6 +83,7 @@
#import "NSURL_SKExtensions.h"
#import "SKFileUpdateChecker.h"
#import "NSError_SKExtensions.h"
+#import "PDFDocument_SKExtensions.h"
#define BUNDLE_DATA_FILENAME @"data"
#define PRESENTATION_OPTIONS_KEY
@"net_sourceforge_skim-app_presentation_options"
@@ -148,7 +149,7 @@
@implementation SKMainDocument
@synthesize mainWindowController;
-@dynamic pdfDocument, pdfView, fileIDStrings, synchronizer, snapshots, tags,
rating, currentPage, activeNote, richText, selectionSpecifier,
selectionQDRect,selectionPage, pdfViewSettings;
+@dynamic pdfDocument, pdfView, synchronizer, snapshots, tags, rating,
currentPage, activeNote, richText, selectionSpecifier,
selectionQDRect,selectionPage, pdfViewSettings;
+ (BOOL)isPDFDocument { return YES; }
@@ -526,7 +527,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 fileIDStrings]]))
+ if ((data = [self notesFDFDataForFile:[name
stringByAppendingPathExtension:@"pdf"] fileIDStrings:[[self pdfDocument]
fileIDStrings]]))
[fileWrapper addRegularFileWithContents:data
preferredFilename:[name stringByAppendingPathExtension:@"fdf"]];
}
return [fileWrapper autorelease];
@@ -581,7 +582,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
fileIDStrings]];
+ NSData *data = [self notesFDFDataForFile:filename fileIDStrings:[[self
pdfDocument] fileIDStrings]];
if (data)
didWrite = [data writeToURL:absoluteURL options:0 error:&error];
else
@@ -1513,52 +1514,6 @@
return r;
}
-- (NSArray *)fileIDStrings {
- 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;
-}
-
- (NSPrintInfo *)printInfo {
NSPrintInfo *printInfo = [super printInfo];
if ([[self pdfDocument] pageCount]) {
@@ -1664,7 +1619,7 @@
}
- (void)doSavePasswordInKeychain:(NSString *)password {
- NSString *fileID = [[self fileIDStrings] lastObject] ?: [pdfData
md5String];
+ NSString *fileID = [[[self pdfDocument] fileIDStrings] lastObject] ?:
[pdfData md5String];
if (fileID) {
// first see if the password exists in the keychain
SecKeychainItemRef itemRef = NULL;
@@ -1707,7 +1662,7 @@
if ([document isLocked] == NO) {
didUnlock = YES;
} else if (NSAlertAlternateReturn != [[NSUserDefaults
standardUserDefaults] integerForKey:SKSavePasswordOptionKey]) {
- NSString *fileID = [[self fileIDStrings] lastObject] ?: [pdfData
md5String];
+ NSString *fileID = [[document fileIDStrings] 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.
------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit