<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre, #msg p { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[28583] trunk/WebKit/win</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/28583">28583</a></dd>
<dt>Author</dt> <dd>aroben@apple.com</dd>
<dt>Date</dt> <dd>2007-12-10 09:16:12 -0800 (Mon, 10 Dec 2007)</dd>
</dl>

<h3>Log Message</h3>
<pre>         Fix &lt;rdar://5624866&gt; CFStringRef UI_STRING should use a cache and follow the CF &quot;Get&quot; model (current uses leak)

         Added a new class, LocalizedString, that wraps a CFStringRef and a
         WebCore::String. We store one LocalizedString for each key string.

         Reviewed by Steve.

         * WebLocalizableStrings.cpp: Changed our two HashMaps to map from
         WebCore::String to LocalizedString*.
         (LocalizedString::LocalizedString):
         (LocalizedString::operator CFStringRef):
         (LocalizedString::operator LPCTSTR): Code moved here from
         localizedLPCTSTR.
         (findCachedString): Changed to return a LocalizedString*.
         (cacheString): Changed to take a LocalizedString*.
         (localizedString): Changed to return a const LocalizedString&amp;. We
         first try to find a cached LocalizedString. If there isn't one, we
         create a new one and cache it.
         (WebLocalizedLPCTSTRUTF8): Changed to call localizedString.
         (WebLocalizedLPCTSTR): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebKitwinChangeLog">trunk/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkWebKitwinWebLocalizableStringscpp">trunk/WebKit/win/WebLocalizableStrings.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebKit/win/ChangeLog (28582 => 28583)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKit/win/ChangeLog        2007-12-10 17:15:33 UTC (rev 28582)
+++ trunk/WebKit/win/ChangeLog        2007-12-10 17:16:12 UTC (rev 28583)
</span><span class="lines">@@ -59,6 +59,29 @@
</span><span class="cx"> 
</span><span class="cx"> 2007-12-07  Adam Roben  &lt;aroben@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Fix &lt;rdar://5624866&gt; CFStringRef UI_STRING should use a cache and follow the CF &quot;Get&quot; model (current uses leak)
+
+        Added a new class, LocalizedString, that wraps a CFStringRef and a
+        WebCore::String. We store one LocalizedString for each key string.
+
+        Reviewed by Steve.
+
+        * WebLocalizableStrings.cpp: Changed our two HashMaps to map from
+        WebCore::String to LocalizedString*.
+        (LocalizedString::LocalizedString):
+        (LocalizedString::operator CFStringRef):
+        (LocalizedString::operator LPCTSTR): Code moved here from
+        localizedLPCTSTR.
+        (findCachedString): Changed to return a LocalizedString*.
+        (cacheString): Changed to take a LocalizedString*.
+        (localizedString): Changed to return a const LocalizedString&amp;. We
+        first try to find a cached LocalizedString. If there isn't one, we
+        create a new one and cache it.
+        (WebLocalizedLPCTSTRUTF8): Changed to call localizedString.
+        (WebLocalizedLPCTSTR): Ditto.
+
+2007-12-07  Adam Roben  &lt;aroben@apple.com&gt;
+
</ins><span class="cx">         Make WebLocalizableStrings work a little more like the Mac version
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Steve.
</span></span></pre></div>
<a id="trunkWebKitwinWebLocalizableStringscpp"></a>
<div class="modfile"><h4>Modified: trunk/WebKit/win/WebLocalizableStrings.cpp (28582 => 28583)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKit/win/WebLocalizableStrings.cpp        2007-12-10 17:15:33 UTC (rev 28582)
+++ trunk/WebKit/win/WebLocalizableStrings.cpp        2007-12-10 17:16:12 UTC (rev 28583)
</span><span class="lines">@@ -39,13 +39,45 @@
</span><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> #include &lt;CoreFoundation/CoreFoundation.h&gt;
</span><span class="cx"> 
</span><ins>+class LocalizedString;
+
</ins><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="cx"> WebLocalizableStringsBundle WebKitLocalizableStringsBundle = { &quot;com.apple.WebKit&quot;, 0 };
</span><span class="cx"> 
</span><del>-static HashMap&lt;String, String&gt; mainBundleLocStrings;
-static HashMap&lt;String, String&gt; frameworkLocStrings;
</del><ins>+static HashMap&lt;String, LocalizedString*&gt; mainBundleLocStrings;
+static HashMap&lt;String, LocalizedString*&gt; frameworkLocStrings;
</ins><span class="cx"> 
</span><ins>+class LocalizedString : Noncopyable {
+public:
+    LocalizedString(CFStringRef string)
+        : m_cfString(string)
+    {
+        ASSERT_ARG(string, string);
+    }
+
+    operator LPCTSTR() const;
+    operator CFStringRef() const { return m_cfString; }
+
+private:
+    CFStringRef m_cfString;
+    mutable String m_string;
+};
+
+LocalizedString::operator LPCTSTR() const
+{
+    if (!m_string.isEmpty())
+        return m_string.charactersWithNullTermination();
+
+    m_string = m_cfString;
+
+    for (unsigned int i = 1; i &lt; m_string.length(); i++)
+        if (m_string[i] == '@' &amp;&amp; (m_string[i - 1] == '%' || (i &gt; 2 &amp;&amp; m_string[i - 1] == '$' &amp;&amp; m_string[i - 2] &gt;= '1' &amp;&amp; m_string[i - 2] &lt;= '9' &amp;&amp; m_string[i - 3] == '%')))
+            m_string.replace(i, 1, &quot;s&quot;);
+
+    return m_string.charactersWithNullTermination();
+}
+
</ins><span class="cx"> static CFBundleRef createWebKitBundle()
</span><span class="cx"> {
</span><span class="cx">     static CFBundleRef bundle;
</span><span class="lines">@@ -122,25 +154,18 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool findCachedStringInMap(const HashMap&lt;String, String&gt;&amp; map, const String&amp; key, String&amp; outString)
</del><ins>+static LocalizedString* findCachedString(WebLocalizableStringsBundle* stringsBundle, const String&amp; key)
</ins><span class="cx"> {
</span><del>-    HashMap&lt;String, String&gt;::const_iterator it = map.find(key);
-    if (it == map.end())
-        return false;
</del><ins>+    if (!stringsBundle)
+        return mainBundleLocStrings.get(key);
</ins><span class="cx"> 
</span><del>-    outString = it-&gt;second;
-    return true;
-}
</del><ins>+    if (stringsBundle-&gt;bundle == WebKitLocalizableStringsBundle.bundle)
+        return frameworkLocStrings.get(key);
</ins><span class="cx"> 
</span><del>-static bool findCachedString(WebLocalizableStringsBundle* stringsBundle, const String&amp; key, String&amp; outString)
-{
-    if (!stringsBundle &amp;&amp; findCachedStringInMap(mainBundleLocStrings, key, outString))
-        return true;
-
-    return stringsBundle &amp;&amp; stringsBundle-&gt;bundle == WebKitLocalizableStringsBundle.bundle &amp;&amp; findCachedStringInMap(frameworkLocStrings, key, outString);
</del><ins>+    return 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void cacheString(WebLocalizableStringsBundle* stringsBundle, const String&amp; key, const String&amp; value)
</del><ins>+static void cacheString(WebLocalizableStringsBundle* stringsBundle, const String&amp; key, LocalizedString* value)
</ins><span class="cx"> {
</span><span class="cx">     if (!stringsBundle) {
</span><span class="cx">         mainBundleLocStrings.set(key, value);
</span><span class="lines">@@ -150,38 +175,18 @@
</span><span class="cx">     frameworkLocStrings.set(key, value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static CFStringRef localizedString(WebLocalizableStringsBundle* stringsBundle, const String&amp; key)
</del><ins>+static const LocalizedString&amp; localizedString(WebLocalizableStringsBundle* stringsBundle, const String&amp; key)
</ins><span class="cx"> {
</span><del>-    String found;
-    if (findCachedString(stringsBundle, key, found))
-        return found.createCFString();
</del><ins>+    LocalizedString* string = findCachedString(stringsBundle, key);
+    if (string)
+        return *string;
</ins><span class="cx"> 
</span><del>-    RetainPtr&lt;CFStringRef&gt; cfStr(AdoptCF, copyLocalizedStringFromBundle(stringsBundle, key));
</del><ins>+    string = new LocalizedString(copyLocalizedStringFromBundle(stringsBundle, key));
+    cacheString(stringsBundle, key, string);
</ins><span class="cx"> 
</span><del>-    cacheString(stringsBundle, key, cfStr.get());
-
-    return cfStr.releaseRef();
</del><ins>+    return *string;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static LPCTSTR localizedLPCTSTR(WebLocalizableStringsBundle* stringsBundle, const String&amp; key)
-{
-    String found;
-    if (findCachedString(stringsBundle, key, found))
-        return found.charactersWithNullTermination();
-
-    RetainPtr&lt;CFStringRef&gt; cfStr(AdoptCF, copyLocalizedStringFromBundle(stringsBundle, key));
-
-    String str(cfStr.get());
-    for (unsigned int i=1; i&lt;str.length(); i++)
-        if (str[i] == '@' &amp;&amp; (str[i - 1] == '%' || (i &gt; 2 &amp;&amp; str[i - 1] == '$' &amp;&amp; str[i - 2] &gt;= '1' &amp;&amp; str[i - 2] &lt;= '9' &amp;&amp; str[i - 3] == '%')))
-            str.replace(i, 1, &quot;s&quot;);
-    LPCTSTR lpszStr = str.charactersWithNullTermination();
-
-    cacheString(stringsBundle, key, str);
-
-    return lpszStr;
-}
-
</del><span class="cx"> CFStringRef WebLocalizedStringUTF8(WebLocalizableStringsBundle* stringsBundle, LPCSTR key)
</span><span class="cx"> {
</span><span class="cx">     if (!key)
</span><span class="lines">@@ -195,7 +200,7 @@
</span><span class="cx">     if (!key)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    return localizedLPCTSTR(stringsBundle, String::fromUTF8(key));
</del><ins>+    return localizedString(stringsBundle, String::fromUTF8(key));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // These functions are deprecated.
</span><span class="lines">@@ -213,7 +218,7 @@
</span><span class="cx">     if (!key)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    return localizedLPCTSTR(stringsBundle, String(key));
</del><ins>+    return localizedString(stringsBundle, String(key));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SetWebLocalizedStringMainBundle(CFBundleRef)
</span></span></pre>
</div>
</div>

</body>
</html>