Revision: 12599
          http://bibdesk.svn.sourceforge.net/bibdesk/?rev=12599&view=rev
Author:   amaxwell
Date:     2008-01-20 13:29:13 -0800 (Sun, 20 Jan 2008)

Log Message:
-----------
Compute sha1 digest by reading from the file incrementally instead of loading 
it all into memory.  Results are the same as Omni's, but should have less 
memory overhead.

Modified Paths:
--------------
    trunk/bibdesk/BDSKFileSearchIndex.m
    trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
    trunk/bibdesk/NSData_BDSKExtensions.h
    trunk/bibdesk/NSData_BDSKExtensions.m

Modified: trunk/bibdesk/BDSKFileSearchIndex.m
===================================================================
--- trunk/bibdesk/BDSKFileSearchIndex.m 2008-01-20 19:10:32 UTC (rev 12598)
+++ trunk/bibdesk/BDSKFileSearchIndex.m 2008-01-20 21:29:13 UTC (rev 12599)
@@ -44,6 +44,7 @@
 #import "BDSKMultiValueDictionary.h"
 #import "NSObject_BDSKExtensions.h"
 #import "NSFileManager_BDSKExtensions.h"
+#import "NSData_BDSKExtensions.h"
 
 @interface BDSKFileSearchIndex (Private)
 
@@ -226,11 +227,8 @@
 @implementation BDSKFileSearchIndex (Private)
 
 static inline NSData *sha1SignatureForURL(NSURL *aURL) {
-    // using the mapped data options will cause a crash in the sha1Signature 
method
-    NSData *data = [[NSData alloc] initWithContentsOfURL:aURL];
-    NSData *sha1Signature = [data sha1Signature];
-    [data release];
-    return sha1Signature ? sha1Signature : [NSData data];
+    NSData *sha1Signature = [NSData copySha1SignatureForFile:[aURL path]];
+    return sha1Signature ? [sha1Signature autorelease] : [NSData data];
 }
 
 + (NSString *)indexCacheFolder

Modified: trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj
===================================================================
--- trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj     2008-01-20 19:10:32 UTC 
(rev 12598)
+++ trunk/bibdesk/Bibdesk.xcodeproj/project.pbxproj     2008-01-20 21:29:13 UTC 
(rev 12599)
@@ -485,6 +485,8 @@
                F97C9DBE0C44866F0002EE01 /* WSGeneratedObj.m in Sources */ = 
{isa = PBXBuildFile; fileRef = F97C9DBB0C44866F0002EE01 /* WSGeneratedObj.m */; 
};
                F97C9DBF0C4486700002EE01 /* BDSKISIWebServices.m in Sources */ 
= {isa = PBXBuildFile; fileRef = F97C9DBD0C44866F0002EE01 /* 
BDSKISIWebServices.m */; };
                F97FA7930AF56FA100C32BBA /* BDSKImageFadeAnimation.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = F97FA7910AF56FA100C32BBA /* 
BDSKImageFadeAnimation.m */; };
+               F98AACDE0D43DB5A00D3CD64 /* libssl.dylib in Frameworks */ = 
{isa = PBXBuildFile; fileRef = F98AACDD0D43DB5A00D3CD64 /* libssl.dylib */; };
+               F98AACF50D43E13C00D3CD64 /* libcrypto.dylib in Frameworks */ = 
{isa = PBXBuildFile; fileRef = F98AACF40D43E13C00D3CD64 /* libcrypto.dylib */; 
};
                F98DB3180A23C7730040D347 /* BDSKTemplate.m in Sources */ = {isa 
= PBXBuildFile; fileRef = F98DB3160A23C7730040D347 /* BDSKTemplate.m */; };
                F990C58C0D42D58D00B5425E /* BDSKDocumentSearch.m in Sources */ 
= {isa = PBXBuildFile; fileRef = F990C58A0D42D58D00B5425E /* 
BDSKDocumentSearch.m */; };
                F9936CC60BC746C300A32DC4 /* BDSKItemSearchIndexes.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = F9936CC40BC746C300A32DC4 /* 
BDSKItemSearchIndexes.m */; };
@@ -1563,6 +1565,8 @@
                F97FA7910AF56FA100C32BBA /* BDSKImageFadeAnimation.m */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; 
path = BDSKImageFadeAnimation.m; sourceTree = "<group>"; };
                F98AA67F0971E3F400184BD8 /* BDSKTextViewCompletionController.h 
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.h; path = BDSKTextViewCompletionController.h; sourceTree = 
"<group>"; };
                F98AA6800971E3F400184BD8 /* BDSKTextViewCompletionController.m 
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.objc; path = BDSKTextViewCompletionController.m; sourceTree = 
"<group>"; };
+               F98AACDD0D43DB5A00D3CD64 /* libssl.dylib */ = {isa = 
PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = 
libssl.dylib; path = /usr/lib/libssl.dylib; sourceTree = "<absolute>"; };
+               F98AACF40D43E13C00D3CD64 /* libcrypto.dylib */ = {isa = 
PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = 
libcrypto.dylib; path = /usr/lib/libcrypto.dylib; sourceTree = "<absolute>"; };
                F98C6FC80CDD30A2002FCAD8 /* QuickLook-BibDesk.xcodeproj */ = 
{isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = 
"QuickLook-BibDesk.xcodeproj"; path = 
"QuickLook-BibDesk/QuickLook-BibDesk.xcodeproj"; sourceTree = "<group>"; };
                F98DB3150A23C7730040D347 /* BDSKTemplate.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
BDSKTemplate.h; sourceTree = "<group>"; };
                F98DB3160A23C7730040D347 /* BDSKTemplate.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= BDSKTemplate.m; sourceTree = "<group>"; };
@@ -1743,6 +1747,7 @@
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               F98AACDE0D43DB5A00D3CD64 /* libssl.dylib in 
Frameworks */,
                                F911D6BC0CFE8E690009C77B /* FileView.framework 
in Frameworks */,
                                F9B801840B41E89500A5A615 /* yaz.framework in 
Frameworks */,
                                F9937E6C0AD82700001D1DFB /* 
QuartzCore.framework in Frameworks */,
@@ -1760,6 +1765,7 @@
                                F9DF3BC209B7605E00342ADE /* 
SystemConfiguration.framework in Frameworks */,
                                F92ECBA009DEF86600A244D0 /* Security.framework 
in Frameworks */,
                                F95ED6950B07BA4E00000BBF /* 
ExceptionHandling.framework in Frameworks */,
+                               F98AACF50D43E13C00D3CD64 /* libcrypto.dylib in 
Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
@@ -1973,6 +1979,8 @@
                29B97323FDCFA39411CA2CEA /* Frameworks */ = {
                        isa = PBXGroup;
                        children = (
+                               F98AACF40D43E13C00D3CD64 /* libcrypto.dylib */,
+                               F98AACDD0D43DB5A00D3CD64 /* libssl.dylib */,
                                F9B801830B41E89500A5A615 /* yaz.framework */,
                                F95ED6910B07BA4E00000BBF /* 
ExceptionHandling.framework */,
                                F92ECB6B09DEF86500A244D0 /* Security.framework 
*/,

Modified: trunk/bibdesk/NSData_BDSKExtensions.h
===================================================================
--- trunk/bibdesk/NSData_BDSKExtensions.h       2008-01-20 19:10:32 UTC (rev 
12598)
+++ trunk/bibdesk/NSData_BDSKExtensions.h       2008-01-20 21:29:13 UTC (rev 
12599)
@@ -40,6 +40,12 @@
 
 extern NSString *BDSKEncodingConversionException;
 
[EMAIL PROTECTED] NSData (BDSKExtensions)
+
++ (NSData *)copySha1SignatureForFile:(NSString *)absolutePath;
+
[EMAIL PROTECTED]
+
 @interface NSMutableData (BDSKExtensions)
 
 /*!

Modified: trunk/bibdesk/NSData_BDSKExtensions.m
===================================================================
--- trunk/bibdesk/NSData_BDSKExtensions.m       2008-01-20 19:10:32 UTC (rev 
12598)
+++ trunk/bibdesk/NSData_BDSKExtensions.m       2008-01-20 21:29:13 UTC (rev 
12599)
@@ -38,9 +38,54 @@
 
 #import "NSData_BDSKExtensions.h"
 #import "NSError_BDSKExtensions.h"
+#import <openssl/evp.h>
 
+
 NSString *BDSKEncodingConversionException = @"BDSKEncodingConversionException";
 
[EMAIL PROTECTED] NSData (BDSKExtensions)
+
+// avoids reading the entire file into memory at once
++ (NSData *)copySha1SignatureForFile:(NSString *)absolutePath;
+{
+    // early out in case we can't open the file
+    int fd = open([absolutePath fileSystemRepresentation], O_RDONLY);
+    if (fd == -1)
+        return nil;
+    
+    EVP_MD_CTX mdctx;
+    const EVP_MD *md = EVP_sha1();
+    int status;
+    EVP_MD_CTX_init(&mdctx);
+    
+    // NB: status == 1 for success
+    status = EVP_DigestInit_ex(&mdctx, md, NULL);
+    
+    // page size
+    char buffer[4096];
+
+    size_t bytesRead;
+    while ((bytesRead = read(fd, buffer, sizeof(buffer))) > 0)
+        status = EVP_DigestUpdate(&mdctx, buffer, bytesRead);
+    
+    close(fd);
+    
+    unsigned char md_value[EVP_MAX_MD_SIZE];
+    unsigned int md_len;
+    status = EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
+    status = EVP_MD_CTX_cleanup(&mdctx);
+
+    NSData *digest = [[NSData alloc] initWithBytes:md_value length:md_len];
+#if 0
+    NSData *omniDigest = [[NSData dataWithContentsOfFile:absolutePath] 
sha1Signature];
+    NSAssert([omniDigest isEqual:digest], @"sha1 signature not equal to 
OmniFoundation's");
+#endif
+    return digest;
+}
+
[EMAIL PROTECTED]
+
+
 @implementation NSMutableData (BDSKExtensions)
 
 - (void)appendUTF8DataFromString:(NSString *)string;


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 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to