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 b073e14  THRIFT-4672 IAsyncResult style methods not being supported by 
certain transports leads to issues in mixed ISync/IAsync use cases Client: C# 
Patch: Jens Geyer
b073e14 is described below

commit b073e1438d9236203c70efb5b3ba55a61f4c4d14
Author: Jens Geyer <je...@apache.org>
AuthorDate: Fri Nov 23 01:34:46 2018 +0100

    THRIFT-4672 IAsyncResult style methods not being supported by certain 
transports leads to issues in mixed ISync/IAsync use cases
    Client: C#
    Patch: Jens Geyer
    
    This closes #1633
---
 .../cpp/src/thrift/generate/t_csharp_generator.cc  | 74 ++++++++++++++--------
 1 file changed, 46 insertions(+), 28 deletions(-)

diff --git a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc 
b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
index bd6331d..37d6f9d 100644
--- a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
@@ -1690,6 +1690,7 @@ void 
t_csharp_generator::generate_service_client(t_service* tservice) {
 
     if (!async_) {
       indent(f_service_) << "#if SILVERLIGHT" << endl;
+      indent(f_service_) << endl;
     }
     // Begin_
     indent(f_service_) << "public " << function_signature_async_begin(*f_iter, 
"Begin_") << endl;
@@ -1766,51 +1767,52 @@ void 
t_csharp_generator::generate_service_client(t_service* tservice) {
       indent(f_service_) << "#endif" << endl << endl;
     }
 
-    // "Normal" Synchronous invoke
     generate_csharp_doc(f_service_, *f_iter);
     indent(f_service_) << "public " << function_signature(*f_iter) << endl;
     scope_up(f_service_);
 
+    // silverlight invoke
     if (!async_) {
-      indent(f_service_) << "#if !SILVERLIGHT" << endl;
-      indent(f_service_) << "send_" << funname << "(";
+      indent(f_service_) << "#if SILVERLIGHT" << endl;
 
-      first = true;
+      indent(f_service_) << "var asyncResult = Begin_" << funname << "(null, 
null";
       for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-        if (first) {
-          first = false;
-        } else {
-          f_service_ << ", ";
-        }
-        f_service_ << normalize_name((*fld_iter)->get_name());
+        f_service_ << ", " << normalize_name((*fld_iter)->get_name());
       }
       f_service_ << ");" << endl;
-
+      
       if (!(*f_iter)->is_oneway()) {
         f_service_ << indent();
         if (!(*f_iter)->get_returntype()->is_void()) {
           f_service_ << "return ";
         }
-        f_service_ << "recv_" << funname << "();" << endl;
+        f_service_ << "End_" << funname << "(asyncResult);" << endl;
       }
       f_service_ << endl;
 
       indent(f_service_) << "#else" << endl;
     }
 
-    // Silverlight synchronous invoke
-    indent(f_service_) << "var asyncResult = Begin_" << funname << "(null, 
null";
+    // synchronous invoke
+    indent(f_service_) << "send_" << funname << "(";
+  
+    first = true;
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << ", " << normalize_name((*fld_iter)->get_name());
+      if (first) {
+        first = false;
+      } else {
+        f_service_ << ", ";
+      }
+      f_service_ << normalize_name((*fld_iter)->get_name());
     }
     f_service_ << ");" << endl;
-
+  
     if (!(*f_iter)->is_oneway()) {
       f_service_ << indent();
       if (!(*f_iter)->get_returntype()->is_void()) {
         f_service_ << "return ";
       }
-      f_service_ << "End_" << funname << "(asyncResult);" << endl;
+      f_service_ << "recv_" << funname << "();" << endl;
     }
     f_service_ << endl;
 
@@ -1829,12 +1831,33 @@ void 
t_csharp_generator::generate_service_client(t_service* tservice) {
     if (!async_) {
       indent(f_service_) << "#if SILVERLIGHT" << endl;
     }
+
     indent(f_service_) << "public " << 
function_signature_async_begin(&send_function) << endl;
+    scope_up(f_service_);
+
+    f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << 
funname << "\", "
+               << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : 
"TMessageType.Call")
+               << ", seqid_));" << endl << indent() << argsname << " args = 
new " << argsname
+               << "();" << endl;
+
+    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
+      f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
+                 << normalize_name((*fld_iter)->get_name()) << ";" << endl;
+    }
+
+    f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
+               << "oprot_.WriteMessageEnd();" << endl;
+    indent(f_service_) << "return oprot_.Transport.BeginFlush(callback, 
state);" << endl;
+      
+    scope_down(f_service_);
+    f_service_ << endl;
+
     if (!async_) {
       indent(f_service_) << "#else" << endl;
-      indent(f_service_) << "public " << function_signature(&send_function) << 
endl;
-      indent(f_service_) << "#endif" << endl;
+      f_service_ << endl;
     }
+
+    indent(f_service_) << "public " << function_signature(&send_function) << 
endl;
     scope_up(f_service_);
 
     f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << 
funname << "\", "
@@ -1849,20 +1872,15 @@ void 
t_csharp_generator::generate_service_client(t_service* tservice) {
 
     f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
                << "oprot_.WriteMessageEnd();" << endl;
-    ;
+
+    indent(f_service_) << "oprot_.Transport.Flush();" << endl;
+    cleanup_member_name_mapping(arg_struct);
+    scope_down(f_service_);
 
     if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-    }
-    indent(f_service_) << "return oprot_.Transport.BeginFlush(callback, 
state);" << endl;
-    if (!async_) {
-      indent(f_service_) << "#else" << endl;
-      indent(f_service_) << "oprot_.Transport.Flush();" << endl;
       indent(f_service_) << "#endif" << endl;
     }
 
-    cleanup_member_name_mapping(arg_struct);
-    scope_down(f_service_);
     f_service_ << endl;
 
     if (!(*f_iter)->is_oneway()) {

Reply via email to