You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2020/03/28 12:57:23 UTC

[thrift] branch master updated: THRIFT-5154 Generate interface IDs (IID) for Windows platforms Client: Delphi Patch: Jens Geyer

This is an automated email from the ASF dual-hosted git repository.

jensg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 11fc716  THRIFT-5154 Generate interface IDs (IID) for Windows platforms Client: Delphi Patch: Jens Geyer
11fc716 is described below

commit 11fc716a20474a7b668654f96db43d97a09bc318
Author: Jens Geyer <je...@apache.org>
AuthorDate: Fri Mar 27 00:05:48 2020 +0100

    THRIFT-5154 Generate interface IDs (IID) for Windows platforms
    Client: Delphi
    Patch: Jens Geyer
    
    This closes #2072
---
 .../cpp/src/thrift/generate/t_delphi_generator.cc  | 28 ++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc
index cffe305..e5bd81a 100644
--- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc
@@ -37,6 +37,13 @@
 #include "thrift/platform.h"
 #include "thrift/generate/t_oop_generator.h"
 
+#ifdef _WIN32
+#include <locale>
+#include <codecvt>
+#include <combaseapi.h>
+#include <guiddef.h>
+#endif
+
 using std::map;
 using std::ofstream;
 using std::ostream;
@@ -243,6 +250,7 @@ public:
   void generate_function_helpers(t_function* tfunction);
   void generate_service_interface(t_service* tservice);
   void generate_service_interface(t_service* tservice, bool for_async);
+  void generate_guid(std::ostream& out);
   void generate_service_helpers(t_service* tservice);
   void generate_service_client(t_service* tservice);
   void generate_service_server(t_service* tservice);
@@ -1712,6 +1720,8 @@ void t_delphi_generator::generate_delphi_struct_definition(ostream& out,
     indent(out) << struct_intf_name << " = interface(IBase)" << endl;
     indent_up();
 
+    generate_guid(out);
+
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       generate_delphi_property_reader_definition(out, *m_iter, is_exception);
       generate_delphi_property_writer_definition(out, *m_iter, is_exception);
@@ -1934,6 +1944,7 @@ void t_delphi_generator::generate_service_interface(t_service* tservice, bool fo
   }
 
   indent_up();
+  generate_guid(s_service);
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1946,6 +1957,23 @@ void t_delphi_generator::generate_service_interface(t_service* tservice, bool fo
   indent_down();
 }
 
+void t_delphi_generator::generate_guid(std::ostream& out) {
+#ifdef _WIN32	// TODO: add support for non-windows platforms if needed
+  GUID guid;
+  if (SUCCEEDED(CoCreateGuid(&guid))) {
+	OLECHAR guid_chars[40];
+    if (StringFromGUID2(guid, &guid_chars[0], sizeof(guid_chars) / sizeof(guid_chars[0])) > 0) {
+      std::wstring guid_wstr(guid_chars);
+      std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
+      std::string guid_str = convert.to_bytes(guid_wstr);
+      indent(out) << "['" << guid_str << "']" << endl;
+    }
+  }
+#else
+  (void)out;  // prevent unused warning on other platforms
+#endif
+}
+
 void t_delphi_generator::generate_service_helpers(t_service* tservice) {
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;