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

Reply via email to