Reviewed by Chris.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Aug 2004 17:45:12 +0000 (17:45 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Aug 2004 17:45:12 +0000 (17:45 +0000)
        - fixed <rdar://problem/3760924> Carbon path passed in NPP_StreamAsFile must be in local character set, not UTF-8

        * Plugins.subproj/WebBaseNetscapePluginStream.m:
        (CarbonPathFromPOSIXPath): Added. New function that uses the path pieces from an FSSpec.
        This has many advantages; the big one that fixes the bug is that it gives the mangled names
        that work even for files that have names that can't otherwise be encoded in Carbon-style
        path names. I didn't write this from scratch: I started with the method in Foundation
        and just changed it to use FSSpec.
        (-[WebBaseNetscapePluginStream destroyStream]): Remove code that used NSString and just call
        CarbonPathFromPOSIXPath instead.

        * Plugins.subproj/npapi.h: The Revision tag wanted to touch this file.
        I think we are going to have some trouble with this; I'd like to take that out.

        * English.lproj/StringsNotToBeLocalized.txt: Updated.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7256 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/English.lproj/StringsNotToBeLocalized.txt
WebKit/Plugins.subproj/WebBaseNetscapePluginStream.m

index a6d82cd9419b9d3b3dc1a51c74a957c4c0a5255d..6465c845b2dfcaa2030b5a0dfd78a45b72941253 100644 (file)
@@ -1,3 +1,23 @@
+2004-08-13  Darin Adler  <darin@apple.com>
+
+        Reviewed by Chris.
+
+        - fixed <rdar://problem/3760924> Carbon path passed in NPP_StreamAsFile must be in local character set, not UTF-8
+
+        * Plugins.subproj/WebBaseNetscapePluginStream.m:
+        (CarbonPathFromPOSIXPath): Added. New function that uses the path pieces from an FSSpec.
+        This has many advantages; the big one that fixes the bug is that it gives the mangled names
+        that work even for files that have names that can't otherwise be encoded in Carbon-style
+        path names. I didn't write this from scratch: I started with the method in Foundation
+        and just changed it to use FSSpec.
+        (-[WebBaseNetscapePluginStream destroyStream]): Remove code that used NSString and just call
+        CarbonPathFromPOSIXPath instead.
+
+        * Plugins.subproj/npapi.h: The Revision tag wanted to touch this file.
+        I think we are going to have some trouble with this; I'd like to take that out.
+
+        * English.lproj/StringsNotToBeLocalized.txt: Updated.
+
 2004-08-12  Trey Matteson  <trey@apple.com>
 
         3761329 - query result links all dead in ingrammicro.com (sometimes)
index ebc6ec4b2c6aa8aacae9c6dbdb497c68da415aa6..47637fce641cf0cd8a3af7aeccc5769ac9fee9be 100644 (file)
@@ -41,6 +41,7 @@
 "4194304"
 "7"
 "9"
+":"
 "://"
 ":/?#"
 ";"
 "POST"
 "Papyrus"
 "Set-Cookie"
+"SpellingDot"
 "Times"
 "UTF-8"
 "Unable to cache glyph widths for %@ %f"
 "text/x-qif"
 "text/x-vcard"
 "text/xml"
+"text/xsl"
 "tiff"
 "unable to get glyphsfor %@ %f error = (%d)"
 "unexpected result from ATSUGetGlyphBounds():  actualNumBounds(%d) != 1"
index 21f5a7d4e53aa4f6fb788125d73105ab7cd09182..a38c19ab9dd19999c9a298669657784995858ead 100644 (file)
@@ -16,6 +16,8 @@
 #import <Foundation/NSFileManager_NSURLExtras.h>
 #import <Foundation/NSURL_NSURLExtras.h>
 
+static const char *CarbonPathFromPOSIXPath(const char *posixPath);
+
 @implementation WebBaseNetscapePluginStream
 
 - (void)dealloc
     
     if (reason == NPRES_DONE && (transferMode == NP_ASFILE || transferMode == NP_ASFILEONLY)) {
         ASSERT(path != NULL);
-        NSString *carbonPath = [[NSFileManager defaultManager] _web_carbonPathForPath:[NSString stringWithUTF8String:path]];
-        NPP_StreamAsFile(instance, &stream, [carbonPath fileSystemRepresentation]);
-        LOG(Plugins, "NPP_StreamAsFile URL=%@ path=%@", URL, carbonPath);
+        const char *carbonPath = CarbonPathFromPOSIXPath(path);
+        ASSERT(carbonPath != NULL);
+        NPP_StreamAsFile(instance, &stream, carbonPath);
+        LOG(Plugins, "NPP_StreamAsFile URL=%@ path=%s", URL, carbonPath);
     }
     
     NPError npErr;
 }
 
 @end
+
+static const char *CarbonPathFromPOSIXPath(const char *posixPath)
+{
+    // Returns NULL if path is to file that does not exist.
+    // Doesn't add a trailing colon for directories; this is a problem for paths to a volume,
+    // so this function would need to be revised if we ever wanted to call it with that.
+
+    OSStatus error;
+    FSCatalogInfo info;
+
+    // Make an FSRef.
+    FSRef ref;
+    error = FSPathMakeRef((const UInt8 *)posixPath, &ref, NULL);
+    if (error != noErr) {
+        return NULL;
+    }
+
+    // Get volume refNum.
+    error = FSGetCatalogInfo(&ref, kFSCatInfoVolume, &info, NULL, NULL, NULL);
+    if (error != noErr) {
+        return NULL;
+    }
+
+    // Get root directory FSRef.
+    FSRef rootRef;
+    error = FSGetVolumeInfo(info.volume, 0, NULL, kFSVolInfoNone, NULL, NULL, &rootRef);
+    if (error != noErr) {
+        return NULL;
+    }
+
+    // Get the pieces of the path.
+    NSMutableData *carbonPath = [NSMutableData dataWithBytes:"" length:1];
+    BOOL needColon = NO;
+    for (;;) {
+        FSSpec spec;
+        FSRef parentRef;
+        error = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, &spec, &parentRef);
+        if (error != noErr) {
+            return NULL;
+        }
+        if (needColon) {
+            [carbonPath replaceBytesInRange:NSMakeRange(0, 0) withBytes:":" length:1];
+        }
+        [carbonPath replaceBytesInRange:NSMakeRange(0, 0) withBytes:&spec.name[1] length:spec.name[0]];
+        needColon = YES;
+        if (FSCompareFSRefs(&ref, &rootRef) == noErr) {
+            break;
+        }
+        ref = parentRef;
+    }
+
+    return (const char *)[carbonPath bytes];
+}