Use dispcache for Multilanguage COM interface
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 29 Aug 2018 08:30:02 +0000 (10:30 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 29 Aug 2018 09:09:37 +0000 (11:09 +0200)
* src/dialogs.h (DISPID_MULTILANG): New.
* src/mlang-charset.cpp (ansi_charset_to_utf8): Use dispcache.

--
Using CoCreateInstance for every string to convert seemed excessive
so we better cache it.

GnuPG-Bug-Id: T4114

src/dialogs.h
src/mlang-charset.cpp

index 217b0d0..4510fb5 100644 (file)
@@ -75,4 +75,7 @@
 #define IDI_LEVEL_3_ENC                 (IDI_LEVEL_3 + ENCRYPT_ICON_OFFSET)
 #define IDI_LEVEL_4_ENC                 (IDI_LEVEL_4 + ENCRYPT_ICON_OFFSET)
 
+/* Other ids */
+#define DISPID_MLANG_CHARSET            0x7000
+
 #endif /*DIALOGS_H*/
index e9b327a..0529856 100644 (file)
@@ -29,6 +29,9 @@ DEFINE_GUID (IID_IMultiLanguage, 0x275c23e1,0x3747,0x11d0,0x9f,
 #include <mlang.h>
 #undef INITGUID
 
+#include "dialogs.h"
+#include "dispcache.h"
+
 #include "mlang-charset.h"
 
 char *ansi_charset_to_utf8 (const char *charset, const char *input,
@@ -51,9 +54,21 @@ char *ansi_charset_to_utf8 (const char *charset, const char *input,
       return xstrdup (input);
     }
 
-  CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
-                   IID_IMultiLanguage, (void**)&multilang);
-  memdbg_addRef (multilang);
+  auto cache = DispCache::instance ();
+  LPDISPATCH cachedLang = cache->getDisp (DISPID_MLANG_CHARSET);
+
+  if (!cachedLang)
+    {
+      CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
+                       IID_IMultiLanguage, (void**)&multilang);
+      memdbg_addRef (multilang);
+      cache->addDisp (DISPID_MLANG_CHARSET, (LPDISPATCH) multilang);
+    }
+  else
+    {
+      multilang = (LPMULTILANGUAGE) cachedLang;
+    }
+
 
   if (!multilang)
     {
@@ -108,7 +123,6 @@ char *ansi_charset_to_utf8 (const char *charset, const char *input,
 
   err = multilang->ConvertStringToUnicode(&mode, enc, const_cast<char*>(input),
                                           &uinlen, buf, &wlen);
-  gpgol_release (multilang);
   if (FAILED (err))
     {
       log_error ("%s:%s: Failed conversion 2.",