Revision: 4031
          http://skim-app.svn.sourceforge.net/skim-app/?rev=4031&view=rev
Author:   hofman
Date:     2008-06-19 04:42:50 -0700 (Thu, 19 Jun 2008)

Log Message:
-----------
Add a second shared EA manager that never splits attributes. Ensure that the 
shared managers are unique.

Modified Paths:
--------------
    trunk/SkimNotes/SKNExtendedAttributeManager.h
    trunk/SkimNotes/SKNExtendedAttributeManager.m

Modified: trunk/SkimNotes/SKNExtendedAttributeManager.h
===================================================================
--- trunk/SkimNotes/SKNExtendedAttributeManager.h       2008-06-19 11:25:46 UTC 
(rev 4030)
+++ trunk/SkimNotes/SKNExtendedAttributeManager.h       2008-06-19 11:42:50 UTC 
(rev 4031)
@@ -60,12 +60,20 @@
 + (id)sharedManager;
 
 /*!
+    @method     sharedNoSplitManager
+    @abstract   Returns a shared instance with nil prefix.  This instance 
never splits attributes, and can also not reassemble splitted attributes.
+    @discussion (comprehensive description)
+    @result     (description)
+*/
++ (id)sharedNoSplitManager;
+
+/*!
     @method     initWithPrefix:
     @abstract   Initializes a new extended attribute manager with keys and 
attribute name prefixes used for segments determined by a prefix.
     @discussion The prefix is used in splitting large attributes.  EA managers 
with different prefixes are mutually incompatible,
                 i.e. attributes written with one manager cannot be safely read 
by a manager with a different prefix.
                 It is safest to just use the shared instance.  The prefix 
should only contain characters that are valid in attribute names.
-    @param      prefix Defaults to "net_sourceforge_skim-app" for the shared 
instance.
+    @param      prefix Defaults to "net_sourceforge_skim-app" for the shared 
instance.  If nil, the manager never splits attributes.
     @result     (description)
 */
 - (id)initWithPrefix:(NSString *)prefix;

Modified: trunk/SkimNotes/SKNExtendedAttributeManager.m
===================================================================
--- trunk/SkimNotes/SKNExtendedAttributeManager.m       2008-06-19 11:25:46 UTC 
(rev 4030)
+++ trunk/SkimNotes/SKNExtendedAttributeManager.m       2008-06-19 11:42:50 UTC 
(rev 4031)
@@ -54,6 +54,7 @@
 @implementation SKNExtendedAttributeManager
 
 static id sharedManager = nil;
+static id sharedNoSplitManager = nil;
 
 + (id)sharedManager;
 {
@@ -62,21 +63,40 @@
     return sharedManager;
 }
 
++ (id)sharedNoSplitManager;
+{
+    if (sharedNoSplitManager == nil)
+        sharedNoSplitManager = [[[self class] alloc] initWithPrefix:nil];
+    return sharedNoSplitManager;
+}
+
 - (id)init;
 {
-    return [self initWithPrefix:nil];
+    self = [self initWithPrefix:PREFIX];
+    if (sharedManager) {
+        [self release];
+        self = [sharedManager retain];
+    } else {
+        sharedManager = self = [self initWithPrefix:PREFIX];
+    }
+    return self;
 }
 
 - (id)initWithPrefix:(NSString *)prefix;
 {
     if (self = [super init]) {
-        if (prefix == nil)
-            prefix = PREFIX;
-        namePrefix = [[prefix stringByAppendingString:@"_"] retain];
-        uniqueKey = [[prefix stringByAppendingString:@"_key"] retain];
-        wrapperKey = [[prefix stringByAppendingString:@"_has_wrapper"] retain];
-        fragmentsKey = [[prefix 
stringByAppendingString:@"_number_of_fragments"] retain];
-        
+        if (prefix) {
+            namePrefix = [[prefix stringByAppendingString:@"_"] retain];
+            uniqueKey = [[prefix stringByAppendingString:@"_key"] retain];
+            wrapperKey = [[prefix stringByAppendingString:@"_has_wrapper"] 
retain];
+            fragmentsKey = [[prefix 
stringByAppendingString:@"_number_of_fragments"] retain];
+        } else if (sharedNoSplitManager) {
+            [self release];
+            self = [sharedNoSplitManager retain];
+        } else {
+            namePrefix = uniqueKey = wrapperKey = fragmentsKey = nil;
+            sharedNoSplitManager = self;
+        }
     }
     return self;
 }
@@ -216,7 +236,7 @@
 
     id plist = nil;
     
-    if ([attribute length] >= [plistHeaderData length] && [plistHeaderData 
isEqual:[attribute subdataWithRange:NSMakeRange(0, [plistHeaderData length])]])
+    if (namePrefix && [attribute length] >= [plistHeaderData length] && 
[plistHeaderData isEqual:[attribute subdataWithRange:NSMakeRange(0, 
[plistHeaderData length])]])
         plist = [NSPropertyListSerialization propertyListFromData:attribute 
mutabilityOption:NSPropertyListImmutable format:&format 
errorDescription:&errorString];
     
     // even if it's a plist, it may not be a dictionary or have the key we're 
looking for
@@ -286,7 +306,7 @@
     
     BOOL success;
 
-    if ((options & kSKNXattrNoSplitData) == 0 && [value length] > 
MAX_XATTR_LENGTH) {
+    if ((options & kSKNXattrNoSplitData) == 0 && namePrefix && [value length] 
> MAX_XATTR_LENGTH) {
                     
         // compress to save space, and so we don't identify this as a plist 
when reading it (in case it really is plist data)
         value = [self bzip2:value];
@@ -391,7 +411,7 @@
 
             id plist = nil;
             
-            if ([attribute length] >= [plistHeaderData length] && 
[plistHeaderData isEqual:[attribute subdataWithRange:NSMakeRange(0, 
[plistHeaderData length])]])
+            if (namePrefix && [attribute length] >= [plistHeaderData length] 
&& [plistHeaderData isEqual:[attribute subdataWithRange:NSMakeRange(0, 
[plistHeaderData length])]])
                 plist = [NSPropertyListSerialization 
propertyListFromData:attribute mutabilityOption:NSPropertyListImmutable 
format:&format errorDescription:&errorString];
             
             // even if it's a plist, it may not be a dictionary or have the 
key we're looking for


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

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to