Author: buildbot
Date: Mon Jun  1 20:08:06 2015
New Revision: 953474

Log:
Staging update by buildbot for thrift

Added:
    websites/staging/thrift/trunk/content/tutorial/c_glib.html
Modified:
    websites/staging/thrift/trunk/content/   (props changed)
    websites/staging/thrift/trunk/content/sitemap.html
    websites/staging/thrift/trunk/content/tutorial/index.html

Propchange: websites/staging/thrift/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Mon Jun  1 20:08:06 2015
@@ -1 +1 @@
-1681248
+1682986

Modified: websites/staging/thrift/trunk/content/sitemap.html
==============================================================================
--- websites/staging/thrift/trunk/content/sitemap.html (original)
+++ websites/staging/thrift/trunk/content/sitemap.html Mon Jun  1 20:08:06 2015
@@ -135,6 +135,9 @@
 <li><a href="/test/keys"></a></li>
 <li><a href="/tutorial/">Index of tutorial/</a><ul>
 <li><a href="/tutorial/as3">Actionscript 3.0</a></li>
+</ul>
+</li>
+<li><a href="/tutorial/c_glib"></a></li>
 <li><a href="/tutorial/cpp">C++</a></li>
 <li><a href="/tutorial/csharp">CSharp</a></li>
 <li><a href="/tutorial/d">D</a></li>
@@ -152,8 +155,6 @@
 <li><a href="/tutorial/py">Python</a></li>
 <li><a href="/tutorial/rb">Ruby</a></li>
 </ul>
-</li>
-</ul>
        </div>
        <div class="container">
        <hr>

Added: websites/staging/thrift/trunk/content/tutorial/c_glib.html
==============================================================================
--- websites/staging/thrift/trunk/content/tutorial/c_glib.html (added)
+++ websites/staging/thrift/trunk/content/tutorial/c_glib.html Mon Jun  1 
20:08:06 2015
@@ -0,0 +1,821 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" 
rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+         <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+       
+    <title>Apache Thrift - </title>
+  </head>
+  <body>
+       <div class="navbar">
+       <div class="navbar-inner">
+               <div class="container">
+                       <a class="brand" href="/">Apache Thrift &trade;</a>
+                       <div class="nav-collapse">
+                               <ul class="nav pull-right">
+                                       <li>
+                                               <a href="/download">Download</a>
+                                       </li>
+                                       <li>
+                                               <a 
href="/docs">Documentation</a>
+                                       </li>
+                                       <li>
+                                               <a 
href="/developers">Developers</a>
+                                       </li>
+                                       <li>
+                                               <a href="/lib">Libraries</a>
+                                       </li>
+                                       <li>
+                                               <a href="/tutorial">Tutorial</a>
+                                       </li>
+                                       <li>
+                                               <a href="/test">Test Suite</a>
+                                       </li>
+                                       <li>
+                                               <a href="/about">About</a>
+                                       </li>
+                                       <li class="dropdown">
+                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">
+                                                       Apache <b 
class="caret"></b>
+                                               </a>
+                                               <ul class="dropdown-menu">
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/"; target="_blank">Apache Home</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/licenses/"; target="_blank">Apache License v2.0</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/foundation/sponsorship.html"; 
target="_blank">Donate</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/foundation/thanks.html"; target="_blank">Thanks</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/security/"; target="_blank">Security</a>
+                                                       </li>
+                                               </ul>
+                                       </li>
+                               </ul>
+                       </div>
+               </div>
+       </div>
+</div>
+
+       <div class="container">
+          <h2 id="tutorial">Tutorial</h2>
+<hr />
+<h3 id="introduction">Introduction</h3>
+<p>All Apache Thrift tutorials require that you have:</p>
+<ol>
+<li>Built and installed the Apache Thrift Compiler and Libraries, see <a 
href="/docs/BuildingFromSource">Building from source</a> for more details.</li>
+<li>
+<p>Generated the <a 
href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob_plain;f=tutorial/tutorial.thrift";>tutorial.thrift</a>
 and <a 
href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob_plain;f=tutorial/shared.thrift";>shared.thrift</a>
 files as <a href="/tutorial/">discussed here</a>.</p>
+<div class="codehilite"><pre><span class="n">thrift</span> <span 
class="o">-</span><span class="n">r</span> <span class="o">--</span><span 
class="n">gen</span>  <span class="n">tutorial</span><span 
class="p">.</span><span class="n">thrift</span>
+</pre></div>
+
+
+</li>
+<li>
+<p>Followed all prerequisites listed below.</p>
+</li>
+</ol>
+<h3 id="prerequisites">Prerequisites</h3>
+<h3 id="client">Client</h3>
+<div class="codehilite"><pre><span class="cp">#include &lt;stdio.h&gt;</span>
+<span class="cp">#include &lt;glib-object.h&gt;</span>
+
+<span class="cp">#include 
&lt;thrift/c_glib/protocol/thrift_binary_protocol.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/transport/thrift_buffered_transport.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/transport/thrift_socket.h&gt;</span>
+
+<span class="cp">#include &quot;gen-c_glib/calculator.h&quot;</span>
+
+<span class="kt">int</span> <span class="nf">main</span> <span 
class="p">(</span><span class="kt">void</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">ThriftSocket</span> <span class="o">*</span><span 
class="n">socket</span><span class="p">;</span>
+  <span class="n">ThriftTransport</span> <span class="o">*</span><span 
class="n">transport</span><span class="p">;</span>
+  <span class="n">ThriftProtocol</span> <span class="o">*</span><span 
class="n">protocol</span><span class="p">;</span>
+  <span class="n">CalculatorIf</span> <span class="o">*</span><span 
class="n">client</span><span class="p">;</span>
+
+  <span class="n">GError</span> <span class="o">*</span><span 
class="n">error</span> <span class="o">=</span> <span 
class="nb">NULL</span><span class="p">;</span>
+  <span class="n">InvalidOperation</span> <span class="o">*</span><span 
class="n">invalid_operation</span> <span class="o">=</span> <span 
class="nb">NULL</span><span class="p">;</span>
+
+  <span class="n">Work</span> <span class="o">*</span><span 
class="n">work</span><span class="p">;</span>
+
+  <span class="n">gint32</span> <span class="n">sum</span><span 
class="p">;</span>
+  <span class="n">gint32</span> <span class="n">diff</span><span 
class="p">;</span>
+
+  <span class="kt">int</span> <span class="n">exit_status</span> <span 
class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+<span class="cp">#if (!GLIB_CHECK_VERSION (2, 36, 0))</span>
+  <span class="n">g_type_init</span> <span class="p">();</span>
+<span class="cp">#endif</span>
+
+  <span class="n">socket</span>    <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_SOCKET</span><span class="p">,</span>
+                            <span class="s">&quot;hostname&quot;</span><span 
class="p">,</span>  <span class="s">&quot;localhost&quot;</span><span 
class="p">,</span>
+                            <span class="s">&quot;port&quot;</span><span 
class="p">,</span>      <span class="mi">9090</span><span class="p">,</span>
+                            <span class="nb">NULL</span><span 
class="p">);</span>
+  <span class="n">transport</span> <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_BUFFERED_TRANSPORT</span><span class="p">,</span>
+                            <span class="s">&quot;transport&quot;</span><span 
class="p">,</span> <span class="n">socket</span><span class="p">,</span>
+                            <span class="nb">NULL</span><span 
class="p">);</span>
+  <span class="n">protocol</span>  <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_BINARY_PROTOCOL</span><span class="p">,</span>
+                            <span class="s">&quot;transport&quot;</span><span 
class="p">,</span> <span class="n">transport</span><span class="p">,</span>
+                            <span class="nb">NULL</span><span 
class="p">);</span>
+
+  <span class="n">thrift_transport_open</span> <span class="p">(</span><span 
class="n">transport</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+
+
+  <span class="cm">/* In the C (GLib) implementation of Thrift, service 
methods on the</span>
+<span class="cm">     server are accessed via a generated client class that 
implements</span>
+<span class="cm">     the service interface. In this tutorial, we access a 
Calculator</span>
+<span class="cm">     service through an instance of CalculatorClient, which 
implements</span>
+<span class="cm">     CalculatorIf. */</span>
+  <span class="n">client</span> <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">TYPE_CALCULATOR_CLIENT</span><span class="p">,</span>
+                         <span 
class="s">&quot;input_protocol&quot;</span><span class="p">,</span>  <span 
class="n">protocol</span><span class="p">,</span>
+                         <span 
class="s">&quot;output_protocol&quot;</span><span class="p">,</span> <span 
class="n">protocol</span><span class="p">,</span>
+                         <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Each of the client methods requires at least two 
parameters: A</span>
+<span class="cm">     pointer to the client-interface implementation (the 
client</span>
+<span class="cm">     object), and a handle to a GError structure to 
receive</span>
+<span class="cm">     information about any error that occurs.</span>
+
+<span class="cm">     On success, client methods return TRUE. A return value 
of FALSE</span>
+<span class="cm">     indicates an error occurred and the error parameter has 
been</span>
+<span class="cm">     set. */</span>
+  <span class="k">if</span> <span class="p">(</span><span 
class="o">!</span><span class="n">error</span> <span 
class="o">&amp;&amp;</span> <span class="n">calculator_if_ping</span> <span 
class="p">(</span><span class="n">client</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">error</span><span class="p">))</span> 
<span class="p">{</span>
+    <span class="n">puts</span> <span class="p">(</span><span 
class="s">&quot;ping()&quot;</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="cm">/* Service methods that return a value do so by passing the 
result</span>
+<span class="cm">     back via an output parameter (here, &quot;sum&quot;). 
*/</span>
+  <span class="k">if</span> <span class="p">(</span><span 
class="o">!</span><span class="n">error</span> <span 
class="o">&amp;&amp;</span> <span class="n">calculator_if_add</span> <span 
class="p">(</span><span class="n">client</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">sum</span><span class="p">,</span> <span 
class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span 
class="p">,</span> <span class="o">&amp;</span><span 
class="n">error</span><span class="p">))</span> <span class="p">{</span>
+    <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;1+1=%d</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span class="n">sum</span><span 
class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="cm">/* Thrift structs are implemented as GObjects, with each of 
the</span>
+<span class="cm">     struct&#39;s members exposed as an object property. 
*/</span>
+  <span class="n">work</span> <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">TYPE_WORK</span><span class="p">,</span> <span 
class="nb">NULL</span><span class="p">);</span>
+
+  <span class="k">if</span> <span class="p">(</span><span 
class="o">!</span><span class="n">error</span><span class="p">)</span> <span 
class="p">{</span>
+    <span class="n">g_object_set</span> <span class="p">(</span><span 
class="n">work</span><span class="p">,</span>
+                  <span class="s">&quot;num1&quot;</span><span 
class="p">,</span> <span class="mi">1</span><span class="p">,</span>
+                  <span class="s">&quot;num2&quot;</span><span 
class="p">,</span> <span class="mi">0</span><span class="p">,</span>
+                  <span class="s">&quot;op&quot;</span><span 
class="p">,</span>   <span class="n">OPERATION_DIVIDE</span><span 
class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+    <span class="cm">/* Exceptions are passed back from service methods in a 
manner</span>
+<span class="cm">       similar to return values. */</span>
+    <span class="k">if</span> <span class="p">(</span><span 
class="n">calculator_if_calculate</span> <span class="p">(</span><span 
class="n">client</span><span class="p">,</span>
+                                 <span class="nb">NULL</span><span 
class="p">,</span>
+                                 <span class="mi">1</span><span 
class="p">,</span>
+                                 <span class="n">work</span><span 
class="p">,</span>
+                                 <span class="o">&amp;</span><span 
class="n">invalid_operation</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span 
class="n">error</span><span class="p">))</span> <span class="p">{</span>
+      <span class="n">puts</span> <span class="p">(</span><span 
class="s">&quot;Whoa? We can divide by zero!&quot;</span><span 
class="p">);</span>
+    <span class="p">}</span>
+    <span class="k">else</span> <span class="p">{</span>
+      <span class="k">if</span> <span class="p">(</span><span 
class="n">invalid_operation</span><span class="p">)</span> <span 
class="p">{</span>
+        <span class="n">gchar</span> <span class="o">*</span><span 
class="n">why</span><span class="p">;</span>
+
+        <span class="cm">/* Like structs, exceptions are implemented as 
objects with</span>
+<span class="cm">           properties. */</span>
+        <span class="n">g_object_get</span> <span class="p">(</span><span 
class="n">invalid_operation</span><span class="p">,</span> <span 
class="s">&quot;why&quot;</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">why</span><span class="p">,</span> <span 
class="nb">NULL</span><span class="p">);</span>
+
+        <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;InvalidOperation: %s</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span class="n">why</span><span 
class="p">);</span>
+
+        <span class="k">if</span> <span class="p">(</span><span 
class="n">why</span> <span class="o">!=</span> <span 
class="nb">NULL</span><span class="p">)</span>
+          <span class="n">g_free</span> <span class="p">(</span><span 
class="n">why</span><span class="p">);</span>
+        <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">invalid_operation</span><span class="p">);</span>
+        <span class="n">invalid_operation</span> <span class="o">=</span> 
<span class="nb">NULL</span><span class="p">;</span>
+      <span class="p">}</span>
+
+      <span class="n">g_clear_error</span> <span class="p">(</span><span 
class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+
+  <span class="k">if</span> <span class="p">(</span><span 
class="o">!</span><span class="n">error</span><span class="p">)</span> <span 
class="p">{</span>
+    <span class="cm">/* Struct objects can be reused across method 
invocations. */</span>
+    <span class="n">g_object_set</span> <span class="p">(</span><span 
class="n">work</span><span class="p">,</span>
+                  <span class="s">&quot;num1&quot;</span><span 
class="p">,</span> <span class="mi">15</span><span class="p">,</span>
+                  <span class="s">&quot;num2&quot;</span><span 
class="p">,</span> <span class="mi">10</span><span class="p">,</span>
+                  <span class="s">&quot;op&quot;</span><span 
class="p">,</span>   <span class="n">OPERATION_SUBTRACT</span><span 
class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+    <span class="k">if</span> <span class="p">(</span><span 
class="n">calculator_if_calculate</span> <span class="p">(</span><span 
class="n">client</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span 
class="n">diff</span><span class="p">,</span>
+                                 <span class="mi">1</span><span 
class="p">,</span>
+                                 <span class="n">work</span><span 
class="p">,</span>
+                                 <span class="o">&amp;</span><span 
class="n">invalid_operation</span><span class="p">,</span>
+                                 <span class="o">&amp;</span><span 
class="n">error</span><span class="p">))</span> <span class="p">{</span>
+      <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;15-10=%d</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span 
class="n">diff</span><span class="p">);</span>
+    <span class="p">}</span>
+  <span class="p">}</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">work</span><span class="p">);</span>
+
+  <span class="k">if</span> <span class="p">(</span><span 
class="o">!</span><span class="n">error</span><span class="p">)</span> <span 
class="p">{</span>
+    <span class="n">SharedStruct</span> <span class="o">*</span><span 
class="n">shared_struct</span><span class="p">;</span>
+    <span class="n">gchar</span> <span class="o">*</span><span 
class="n">value</span><span class="p">;</span>
+
+    <span class="n">shared_struct</span> <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">TYPE_SHARED_STRUCT</span><span class="p">,</span> <span 
class="nb">NULL</span><span class="p">);</span>
+
+    <span class="cm">/* As defined in the Thrift file, the Calculator service 
extends</span>
+<span class="cm">       the SharedService service. Correspondingly, in the 
generated</span>
+<span class="cm">       code CalculatorIf inherits from SharedServiceIf, and 
the parent</span>
+<span class="cm">       service&#39;s methods are accessible through a simple 
cast. */</span>
+    <span class="k">if</span> <span class="p">(</span><span 
class="n">shared_service_client_get_struct</span> <span class="p">(</span><span 
class="n">SHARED_SERVICE_IF</span> <span class="p">(</span><span 
class="n">client</span><span class="p">),</span>
+                                          <span class="o">&amp;</span><span 
class="n">shared_struct</span><span class="p">,</span>
+                                          <span class="mi">1</span><span 
class="p">,</span>
+                                          <span class="o">&amp;</span><span 
class="n">error</span><span class="p">))</span> <span class="p">{</span>
+      <span class="n">g_object_get</span> <span class="p">(</span><span 
class="n">shared_struct</span><span class="p">,</span> <span 
class="s">&quot;value&quot;</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">value</span><span class="p">,</span> 
<span class="nb">NULL</span><span class="p">);</span>
+      <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;Check log: %s</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span 
class="n">value</span><span class="p">);</span>
+      <span class="n">g_free</span> <span class="p">(</span><span 
class="n">value</span><span class="p">);</span>
+    <span class="p">}</span>
+
+    <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">shared_struct</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">if</span> <span class="p">(</span><span 
class="n">error</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;ERROR: %s</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span 
class="n">error</span><span class="o">-&gt;</span><span 
class="n">message</span><span class="p">);</span>
+    <span class="n">g_clear_error</span> <span class="p">(</span><span 
class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+
+    <span class="n">exit_status</span> <span class="o">=</span> <span 
class="mi">1</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="n">thrift_transport_close</span> <span class="p">(</span><span 
class="n">transport</span><span class="p">,</span> <span 
class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">client</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">protocol</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">transport</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">socket</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">exit_status</span><span 
class="p">;</span>
+<span class="p">}</span>
+</pre></div>
+
+<p class='snippet_footer'>
+  This snippet was generated by Apache Thrift's <strong>source tree 
docs</strong>:
+  <a 
href="http://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=tutorial/c_glib/c_glib_client.c;hb=HEAD";</a>tutorial/c_glib/c_glib_client.c</a>
+</p>
+
+<h3 id="server">Server</h3>
+<div class="codehilite"><pre><span class="cp">#include 
&lt;glib-object.h&gt;</span>
+<span class="cp">#include &lt;signal.h&gt;</span>
+<span class="cp">#include &lt;stdio.h&gt;</span>
+<span class="cp">#include &lt;string.h&gt;</span>
+
+<span class="cp">#include &lt;thrift/c_glib/thrift.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/protocol/thrift_binary_protocol_factory.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/protocol/thrift_protocol_factory.h&gt;</span>
+<span class="cp">#include &lt;thrift/c_glib/server/thrift_server.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/server/thrift_simple_server.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/transport/thrift_buffered_transport_factory.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/transport/thrift_server_socket.h&gt;</span>
+<span class="cp">#include 
&lt;thrift/c_glib/transport/thrift_server_transport.h&gt;</span>
+
+<span class="cp">#include &quot;gen-c_glib/calculator.h&quot;</span>
+
+<span class="n">G_BEGIN_DECLS</span>
+
+<span class="cm">/* In the C (GLib) implementation of Thrift, the actual work 
done by a</span>
+<span class="cm">   server---that is, the code that runs when a client invokes 
a</span>
+<span class="cm">   service method---is defined in a separate 
&quot;handler&quot; class that</span>
+<span class="cm">   implements the service interface. Here we define the</span>
+<span class="cm">   TutorialCalculatorHandler class, which implements the 
CalculatorIf</span>
+<span class="cm">   interface and provides the behavior expected by tutorial 
clients.</span>
+<span class="cm">   (Typically this code would be placed in its own module but 
for</span>
+<span class="cm">   clarity this tutorial is presented entirely in a single 
file.)</span>
+
+<span class="cm">   For each service the Thrift compiler generates an abstract 
base</span>
+<span class="cm">   class from which handler implementations should inherit. 
In our</span>
+<span class="cm">   case TutorialCalculatorHandler inherits from 
CalculatorHandler,</span>
+<span class="cm">   defined in gen-c_glib/calculator.h.</span>
+
+<span class="cm">   If you&#39;re new to GObject, try not to be intimidated by 
the quantity</span>
+<span class="cm">   of code here---much of it is boilerplate and can mostly 
be</span>
+<span class="cm">   copied-and-pasted from existing work. For more information 
refer to</span>
+<span class="cm">   the GObject Reference Manual, available online at</span>
+<span class="cm">   https://developer.gnome.org/gobject/. */</span>
+
+<span class="cp">#define TYPE_TUTORIAL_CALCULATOR_HANDLER \</span>
+<span class="cp">  (tutorial_calculator_handler_get_type ())</span>
+
+<span class="cp">#define TUTORIAL_CALCULATOR_HANDLER(obj)                      
          \</span>
+<span class="cp">  (G_TYPE_CHECK_INSTANCE_CAST ((obj),                         
          \</span>
+<span class="cp">                               
TYPE_TUTORIAL_CALCULATOR_HANDLER,        \</span>
+<span class="cp">                               
TutorialCalculatorHandler))</span>
+<span class="cp">#define TUTORIAL_CALCULATOR_HANDLER_CLASS(c)                  
  \</span>
+<span class="cp">  (G_TYPE_CHECK_CLASS_CAST ((c),                              
  \</span>
+<span class="cp">                            TYPE_TUTORIAL_CALCULATOR_HANDLER, 
  \</span>
+<span class="cp">                            
TutorialCalculatorHandlerClass))</span>
+<span class="cp">#define IS_TUTORIAL_CALCULATOR_HANDLER(obj)                   
          \</span>
+<span class="cp">  (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                         
          \</span>
+<span class="cp">                               
TYPE_TUTORIAL_CALCULATOR_HANDLER))</span>
+<span class="cp">#define IS_TUTORIAL_CALCULATOR_HANDLER_CLASS(c)               
  \</span>
+<span class="cp">  (G_TYPE_CHECK_CLASS_TYPE ((c),                              
  \</span>
+<span class="cp">                            
TYPE_TUTORIAL_CALCULATOR_HANDLER))</span>
+<span class="cp">#define TUTORIAL_CALCULATOR_HANDLER_GET_CLASS(obj)            
  \</span>
+<span class="cp">  (G_TYPE_INSTANCE_GET_CLASS ((obj),                          
  \</span>
+<span class="cp">                              
TYPE_TUTORIAL_CALCULATOR_HANDLER, \</span>
+<span class="cp">                              
TutorialCalculatorHandlerClass))</span>
+
+<span class="k">struct</span> <span 
class="n">_TutorialCalculatorHandler</span> <span class="p">{</span>
+  <span class="n">CalculatorHandler</span> <span 
class="n">parent_instance</span><span class="p">;</span>
+
+  <span class="cm">/* private */</span>
+  <span class="n">GHashTable</span> <span class="o">*</span><span 
class="n">log</span><span class="p">;</span>
+<span class="p">};</span>
+<span class="k">typedef</span> <span class="k">struct</span> <span 
class="n">_TutorialCalculatorHandler</span> <span 
class="n">TutorialCalculatorHandler</span><span class="p">;</span>
+
+<span class="k">struct</span> <span 
class="n">_TutorialCalculatorHandlerClass</span> <span class="p">{</span>
+  <span class="n">CalculatorHandlerClass</span> <span 
class="n">parent_class</span><span class="p">;</span>
+<span class="p">};</span>
+<span class="k">typedef</span> <span class="k">struct</span> <span 
class="n">_TutorialCalculatorHandlerClass</span> <span 
class="n">TutorialCalculatorHandlerClass</span><span class="p">;</span>
+
+<span class="n">GType</span> <span 
class="n">tutorial_calculator_handler_get_type</span> <span 
class="p">(</span><span class="kt">void</span><span class="p">);</span>
+
+<span class="n">G_END_DECLS</span>
+
+<span class="cm">/* 
---------------------------------------------------------------- */</span>
+
+<span class="cm">/* The implementation of TutorialCalculatorHandler follows. 
*/</span>
+
+<span class="n">G_DEFINE_TYPE</span> <span class="p">(</span><span 
class="n">TutorialCalculatorHandler</span><span class="p">,</span>
+               <span class="n">tutorial_calculator_handler</span><span 
class="p">,</span>
+               <span class="n">TYPE_CALCULATOR_HANDLER</span><span 
class="p">);</span>
+
+<span class="cm">/* Each of a handler&#39;s methods accepts at least two 
parameters: A</span>
+<span class="cm">   pointer to the service-interface implementation (the 
handler object</span>
+<span class="cm">   itself) and a handle to a GError structure to receive 
information</span>
+<span class="cm">   about any error that occurs.</span>
+
+<span class="cm">   On success, a handler method returns TRUE. A return value 
of FALSE</span>
+<span class="cm">   indicates an error occurred and the error parameter has 
been</span>
+<span class="cm">   set. (Methods should not return FALSE without first 
setting the</span>
+<span class="cm">   error parameter.) */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_ping</span> <span 
class="p">(</span><span class="n">CalculatorIf</span>  <span 
class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                  <span class="n">GError</span>       <span 
class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">);</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">error</span><span class="p">);</span>
+
+  <span class="n">puts</span> <span class="p">(</span><span 
class="s">&quot;ping()&quot;</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* Service-method parameters are passed through as parameters 
to the</span>
+<span class="cm">   handler method.</span>
+
+<span class="cm">   If the service method returns a value an output parameter, 
_return,</span>
+<span class="cm">   is additionally passed to the handler method. This 
parameter should</span>
+<span class="cm">   be set appropriately before the method returns, whenever 
it</span>
+<span class="cm">   succeeds.</span>
+
+<span class="cm">   The return value from this method happens to be of a base 
type,</span>
+<span class="cm">   i32, but note if a method returns a complex type such as a 
map or</span>
+<span class="cm">   list *_return will point to a pre-allocated data structure 
that</span>
+<span class="cm">   does not need to be re-allocated and should not be 
destroyed. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_add</span> <span 
class="p">(</span><span class="n">CalculatorIf</span>  <span 
class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                 <span class="n">gint32</span>        <span 
class="o">*</span><span class="n">_return</span><span class="p">,</span>
+                                 <span class="k">const</span> <span 
class="n">gint32</span>   <span class="n">num1</span><span class="p">,</span>
+                                 <span class="k">const</span> <span 
class="n">gint32</span>   <span class="n">num2</span><span class="p">,</span>
+                                 <span class="n">GError</span>       <span 
class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">);</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">error</span><span class="p">);</span>
+
+  <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;add(%d,%d)</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span 
class="n">num1</span><span class="p">,</span> <span class="n">num2</span><span 
class="p">);</span>
+  <span class="o">*</span><span class="n">_return</span> <span 
class="o">=</span> <span class="n">num1</span> <span class="o">+</span> <span 
class="n">num2</span><span class="p">;</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* Any handler method can return a ThriftApplicationException 
to the</span>
+<span class="cm">   client by setting its error parameter appropriately and 
returning</span>
+<span class="cm">   FALSE. See the ThriftApplicationExceptionError enumeration 
defined</span>
+<span class="cm">   in thrift_application_exception.h for a list of 
recognized</span>
+<span class="cm">   exception types (GError codes).</span>
+
+<span class="cm">   If a service method can also throw a custom exception 
(that is, one</span>
+<span class="cm">   defined in the .thrift file) an additional output 
parameter will be</span>
+<span class="cm">   provided (here, &quot;ouch&quot;) to hold an instance of 
the exception, when</span>
+<span class="cm">   necessary. Note there will be a separate parameter added 
for each</span>
+<span class="cm">   type of exception the method can throw.</span>
+
+<span class="cm">   Unlike return values, exception objects are never 
pre-created; this</span>
+<span class="cm">   is always the responsibility of the handler method. 
*/</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_calculate</span> <span 
class="p">(</span><span class="n">CalculatorIf</span>      <span 
class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                       <span class="n">gint32</span>           
 <span class="o">*</span><span class="n">_return</span><span class="p">,</span>
+                                       <span class="k">const</span> <span 
class="n">gint32</span>       <span class="n">logid</span><span 
class="p">,</span>
+                                       <span class="k">const</span> <span 
class="n">Work</span>        <span class="o">*</span><span 
class="n">w</span><span class="p">,</span>
+                                       <span class="n">InvalidOperation</span> 
<span class="o">**</span><span class="n">ouch</span><span class="p">,</span>
+                                       <span class="n">GError</span>           
<span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">error</span><span class="p">);</span>
+
+  <span class="n">TutorialCalculatorHandler</span> <span 
class="o">*</span><span class="n">self</span><span class="p">;</span>
+
+  <span class="n">gint</span> <span class="o">*</span><span 
class="n">log_key</span><span class="p">;</span>
+  <span class="n">gchar</span> <span class="n">log_value</span><span 
class="p">[</span><span class="mi">12</span><span class="p">];</span>
+  <span class="n">SharedStruct</span> <span class="o">*</span><span 
class="n">log_struct</span><span class="p">;</span>
+
+  <span class="n">gint</span> <span class="n">num1</span><span 
class="p">;</span>
+  <span class="n">gint</span> <span class="n">num2</span><span 
class="p">;</span>
+  <span class="n">Operation</span> <span class="n">op</span><span 
class="p">;</span>
+  <span class="n">gboolean</span> <span class="n">result</span> <span 
class="o">=</span> <span class="n">TRUE</span><span class="p">;</span>
+
+  <span class="n">g_return_val_if_fail</span> <span class="p">(</span><span 
class="n">IS_TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">),</span>
+                        <span class="n">FALSE</span><span class="p">);</span>
+  <span class="n">self</span> <span class="o">=</span> <span 
class="n">TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">);</span>
+
+  <span class="cm">/* Remember: Exception objects are never pre-created 
*/</span>
+  <span class="n">g_assert</span> <span class="p">(</span><span 
class="o">*</span><span class="n">ouch</span> <span class="o">==</span> <span 
class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Fetch the contents of our Work parameter.</span>
+
+<span class="cm">     Note that integer properties of thirty-two bits or fewer 
in width</span>
+<span class="cm">     are _always_ of type gint, regardless of the range of 
values they</span>
+<span class="cm">     hold. A common error is trying to retrieve, say, a 
structure</span>
+<span class="cm">     member defined in the .thrift file as type i16 into a 
variable of</span>
+<span class="cm">     type gint16, which will clobber variables adjacent on 
the</span>
+<span class="cm">     stack. Remember: If you&#39;re retrieving an integer 
property the</span>
+<span class="cm">     receiving variable must be of either type gint or 
gint64, as</span>
+<span class="cm">     appropriate. */</span>
+  <span class="n">g_object_get</span> <span class="p">((</span><span 
class="n">Work</span> <span class="o">*</span><span class="p">)</span><span 
class="n">w</span><span class="p">,</span>
+                <span class="s">&quot;num1&quot;</span><span 
class="p">,</span> <span class="o">&amp;</span><span class="n">num1</span><span 
class="p">,</span>
+                <span class="s">&quot;num2&quot;</span><span 
class="p">,</span> <span class="o">&amp;</span><span class="n">num2</span><span 
class="p">,</span>
+                <span class="s">&quot;op&quot;</span><span class="p">,</span>  
 <span class="o">&amp;</span><span class="n">op</span><span class="p">,</span>
+                <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;calculate(%d,{%d,%d,%d})</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span 
class="n">logid</span><span class="p">,</span> <span class="n">op</span><span 
class="p">,</span> <span class="n">num1</span><span class="p">,</span> <span 
class="n">num2</span><span class="p">);</span>
+
+  <span class="k">switch</span> <span class="p">(</span><span 
class="n">op</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">case</span> <span class="n">OPERATION_ADD</span>:
+    <span class="o">*</span><span class="n">_return</span> <span 
class="o">=</span> <span class="n">num1</span> <span class="o">+</span> <span 
class="n">num2</span><span class="p">;</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="k">case</span> <span class="n">OPERATION_SUBTRACT</span>:
+    <span class="o">*</span><span class="n">_return</span> <span 
class="o">=</span> <span class="n">num1</span> <span class="o">-</span> <span 
class="n">num2</span><span class="p">;</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="k">case</span> <span class="n">OPERATION_MULTIPLY</span>:
+    <span class="o">*</span><span class="n">_return</span> <span 
class="o">=</span> <span class="n">num1</span> <span class="o">*</span> <span 
class="n">num2</span><span class="p">;</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="k">case</span> <span class="n">OPERATION_DIVIDE</span>:
+    <span class="k">if</span> <span class="p">(</span><span 
class="n">num2</span> <span class="o">==</span> <span class="mi">0</span><span 
class="p">)</span> <span class="p">{</span>
+      <span class="cm">/* For each custom exception type a subclass of 
ThriftStruct is</span>
+<span class="cm">         generated by the Thrift compiler. Throw an exception 
by</span>
+<span class="cm">         setting the corresponding output parameter to a new 
instance</span>
+<span class="cm">         of its type and returning FALSE. */</span>
+      <span class="o">*</span><span class="n">ouch</span> <span 
class="o">=</span> <span class="n">g_object_new</span> <span 
class="p">(</span><span class="n">TYPE_INVALID_OPERATION</span><span 
class="p">,</span>
+                            <span class="s">&quot;whatOp&quot;</span><span 
class="p">,</span> <span class="n">op</span><span class="p">,</span>
+                            <span class="s">&quot;why&quot;</span><span 
class="p">,</span>  <span class="n">g_strdup</span> <span 
class="p">(</span><span class="s">&quot;Cannot divide by 0&quot;</span><span 
class="p">),</span>
+                            <span class="nb">NULL</span><span 
class="p">);</span>
+      <span class="n">result</span> <span class="o">=</span> <span 
class="n">FALSE</span><span class="p">;</span>
+
+      <span class="cm">/* Note the call to g_strdup above: All the memory used 
by a</span>
+<span class="cm">         ThriftStruct&#39;s properties belongs to the object 
itself and</span>
+<span class="cm">         will be freed on destruction. Removing this call to 
g_strdup</span>
+<span class="cm">         will lead to a segmentation fault as the object 
tries to</span>
+<span class="cm">         release memory allocated statically to the program. 
*/</span>
+    <span class="p">}</span>
+    <span class="k">else</span> <span class="p">{</span>
+      <span class="o">*</span><span class="n">_return</span> <span 
class="o">=</span> <span class="n">num1</span> <span class="o">/</span> <span 
class="n">num2</span><span class="p">;</span>
+    <span class="p">}</span>
+    <span class="k">break</span><span class="p">;</span>
+
+  <span class="nl">default:</span>
+    <span class="o">*</span><span class="n">ouch</span> <span 
class="o">=</span> <span class="n">g_object_new</span> <span 
class="p">(</span><span class="n">TYPE_INVALID_OPERATION</span><span 
class="p">,</span>
+                          <span class="s">&quot;whatOp&quot;</span><span 
class="p">,</span> <span class="n">op</span><span class="p">,</span>
+                          <span class="s">&quot;why&quot;</span><span 
class="p">,</span>  <span class="n">g_strdup</span> <span 
class="p">(</span><span class="s">&quot;Invalid Operation&quot;</span><span 
class="p">),</span>
+                          <span class="nb">NULL</span><span class="p">);</span>
+    <span class="n">result</span> <span class="o">=</span> <span 
class="n">FALSE</span><span class="p">;</span>
+  <span class="p">}</span>
+
+  <span class="cm">/* On success, log a record of the result to our hash table 
*/</span>
+  <span class="k">if</span> <span class="p">(</span><span 
class="n">result</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">log_key</span> <span class="o">=</span> <span 
class="n">g_malloc</span> <span class="p">(</span><span class="k">sizeof</span> 
<span class="o">*</span><span class="n">log_key</span><span class="p">);</span>
+    <span class="o">*</span><span class="n">log_key</span> <span 
class="o">=</span> <span class="n">logid</span><span class="p">;</span>
+
+    <span class="n">snprintf</span> <span class="p">(</span><span 
class="n">log_value</span><span class="p">,</span> <span 
class="k">sizeof</span> <span class="n">log_value</span><span 
class="p">,</span> <span class="s">&quot;%d&quot;</span><span 
class="p">,</span> <span class="o">*</span><span class="n">_return</span><span 
class="p">);</span>
+
+    <span class="n">log_struct</span> <span class="o">=</span> <span 
class="n">g_object_new</span> <span class="p">(</span><span 
class="n">TYPE_SHARED_STRUCT</span><span class="p">,</span>
+                               <span class="s">&quot;key&quot;</span><span 
class="p">,</span>   <span class="o">*</span><span 
class="n">log_key</span><span class="p">,</span>
+                               <span class="s">&quot;value&quot;</span><span 
class="p">,</span>  <span class="n">g_strdup</span> <span 
class="p">(</span><span class="n">log_value</span><span class="p">),</span>
+                               <span class="nb">NULL</span><span 
class="p">);</span>
+    <span class="n">g_hash_table_replace</span> <span class="p">(</span><span 
class="n">self</span><span class="o">-&gt;</span><span 
class="n">log</span><span class="p">,</span> <span 
class="n">log_key</span><span class="p">,</span> <span 
class="n">log_struct</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">return</span> <span class="n">result</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* A one-way method has the same signature as an equivalent, 
regular</span>
+<span class="cm">   method that returns no value. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_zip</span> <span 
class="p">(</span><span class="n">CalculatorIf</span>  <span 
class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                 <span class="n">GError</span>       <span 
class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">);</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">error</span><span class="p">);</span>
+
+  <span class="n">puts</span> <span class="p">(</span><span 
class="s">&quot;zip()&quot;</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* As specified in the .thrift file (tutorial.thrift), the 
Calculator</span>
+<span class="cm">   service extends the SharedService service. 
Correspondingly, in the</span>
+<span class="cm">   generated code the Calculator interface, CalculatorIf, 
extends the</span>
+<span class="cm">   SharedService interface, SharedServiceIf, and subclasses 
of</span>
+<span class="cm">   CalculatorHandler should implement its methods as 
well.</span>
+
+<span class="cm">   Here we provide an implementation for the getStruct method 
from the</span>
+<span class="cm">   parent service. */</span>
+<span class="k">static</span> <span class="n">gboolean</span>
+<span class="nf">tutorial_calculator_handler_get_struct</span> <span 
class="p">(</span><span class="n">SharedServiceIf</span>  <span 
class="o">*</span><span class="n">iface</span><span class="p">,</span>
+                                        <span class="n">SharedStruct</span>    
<span class="o">**</span><span class="n">_return</span><span class="p">,</span>
+                                        <span class="k">const</span> <span 
class="n">gint32</span>      <span class="n">key32</span><span 
class="p">,</span>
+                                        <span class="n">GError</span>          
<span class="o">**</span><span class="n">error</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">error</span><span class="p">);</span>
+
+  <span class="n">gint</span> <span class="n">key</span> <span 
class="o">=</span> <span class="p">(</span><span class="n">gint</span><span 
class="p">)</span><span class="n">key32</span><span class="p">;</span>
+  <span class="n">TutorialCalculatorHandler</span> <span 
class="o">*</span><span class="n">self</span><span class="p">;</span>
+  <span class="n">SharedStruct</span> <span class="o">*</span><span 
class="n">log_struct</span><span class="p">;</span>
+  <span class="n">gint</span> <span class="n">log_key</span><span 
class="p">;</span>
+  <span class="n">gchar</span> <span class="o">*</span><span 
class="n">log_value</span><span class="p">;</span>
+
+  <span class="n">g_return_val_if_fail</span> <span class="p">(</span><span 
class="n">IS_TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">),</span>
+                        <span class="n">FALSE</span><span class="p">);</span>
+  <span class="n">self</span> <span class="o">=</span> <span 
class="n">TUTORIAL_CALCULATOR_HANDLER</span> <span class="p">(</span><span 
class="n">iface</span><span class="p">);</span>
+
+  <span class="cm">/* Remember: Complex return types are always pre-created 
and need</span>
+<span class="cm">     only be populated */</span>
+  <span class="n">g_assert</span> <span class="p">(</span><span 
class="o">*</span><span class="n">_return</span> <span class="o">!=</span> 
<span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="n">printf</span> <span class="p">(</span><span 
class="s">&quot;getStruct(%d)</span><span class="se">\n</span><span 
class="s">&quot;</span><span class="p">,</span> <span class="n">key</span><span 
class="p">);</span>
+
+  <span class="cm">/* If the key exists in our log, return the corresponding 
logged</span>
+<span class="cm">     data (or an empty SharedStruct structure if it does 
not).</span>
+
+<span class="cm">     Incidentally, note we _must_ here copy the values from 
the hash</span>
+<span class="cm">     table into the return structure. All memory used by the 
return</span>
+<span class="cm">     structure belongs to the structure itself and will be 
freed once</span>
+<span class="cm">     a response is sent to the client. If we merely freed 
*_return and</span>
+<span class="cm">     set it to point to our hash-table entry, that would mean 
memory</span>
+<span class="cm">     would be released (effectively, data erased) out of the 
hash</span>
+<span class="cm">     table! */</span>
+  <span class="n">log_struct</span> <span class="o">=</span> <span 
class="n">g_hash_table_lookup</span> <span class="p">(</span><span 
class="n">self</span><span class="o">-&gt;</span><span 
class="n">log</span><span class="p">,</span> <span class="o">&amp;</span><span 
class="n">key</span><span class="p">);</span>
+  <span class="k">if</span> <span class="p">(</span><span 
class="n">log_struct</span> <span class="o">!=</span> <span 
class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
+    <span class="n">g_object_get</span> <span class="p">(</span><span 
class="n">log_struct</span><span class="p">,</span>
+                  <span class="s">&quot;key&quot;</span><span 
class="p">,</span>   <span class="o">&amp;</span><span 
class="n">log_key</span><span class="p">,</span>
+                  <span class="s">&quot;value&quot;</span><span 
class="p">,</span> <span class="o">&amp;</span><span 
class="n">log_value</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+    <span class="n">g_object_set</span> <span class="p">(</span><span 
class="o">*</span><span class="n">_return</span><span class="p">,</span>
+                  <span class="s">&quot;key&quot;</span><span 
class="p">,</span>   <span class="n">log_key</span><span class="p">,</span>
+                  <span class="s">&quot;value&quot;</span><span 
class="p">,</span> <span class="n">g_strdup</span> <span 
class="p">(</span><span class="n">log_value</span><span class="p">),</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="k">return</span> <span class="n">TRUE</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* TutorialCalculatorHandler&#39;s instance finalizer 
(destructor) */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">tutorial_calculator_handler_finalize</span> <span 
class="p">(</span><span class="n">GObject</span> <span class="o">*</span><span 
class="n">object</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">TutorialCalculatorHandler</span> <span 
class="o">*</span><span class="n">self</span> <span class="o">=</span>
+    <span class="n">TUTORIAL_CALCULATOR_HANDLER</span> <span 
class="p">(</span><span class="n">object</span><span class="p">);</span>
+
+  <span class="cm">/* Free our calculation-log hash table */</span>
+  <span class="n">g_hash_table_unref</span> <span class="p">(</span><span 
class="n">self</span><span class="o">-&gt;</span><span 
class="n">log</span><span class="p">);</span>
+  <span class="n">self</span><span class="o">-&gt;</span><span 
class="n">log</span> <span class="o">=</span> <span class="nb">NULL</span><span 
class="p">;</span>
+
+  <span class="cm">/* Chain up to the parent class */</span>
+  <span class="n">G_OBJECT_CLASS</span> <span class="p">(</span><span 
class="n">tutorial_calculator_handler_parent_class</span><span 
class="p">)</span><span class="o">-&gt;</span>
+    <span class="n">finalize</span> <span class="p">(</span><span 
class="n">object</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="cm">/* TutorialCalculatorHandler&#39;s instance initializer 
(constructor) */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">tutorial_calculator_handler_init</span> <span 
class="p">(</span><span class="n">TutorialCalculatorHandler</span> <span 
class="o">*</span><span class="n">self</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="cm">/* Create our calculation-log hash table */</span>
+  <span class="n">self</span><span class="o">-&gt;</span><span 
class="n">log</span> <span class="o">=</span> <span 
class="n">g_hash_table_new_full</span> <span class="p">(</span><span 
class="n">g_int_hash</span><span class="p">,</span>
+                                     <span class="n">g_int_equal</span><span 
class="p">,</span>
+                                     <span class="n">g_free</span><span 
class="p">,</span>
+                                     <span 
class="n">g_object_unref</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="cm">/* TutorialCalculatorHandler&#39;s class initializer */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">tutorial_calculator_handler_class_init</span> <span 
class="p">(</span><span class="n">TutorialCalculatorHandlerClass</span> <span 
class="o">*</span><span class="n">klass</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">GObjectClass</span> <span class="o">*</span><span 
class="n">gobject_class</span> <span class="o">=</span> <span 
class="n">G_OBJECT_CLASS</span> <span class="p">(</span><span 
class="n">klass</span><span class="p">);</span>
+  <span class="n">SharedServiceHandlerClass</span> <span 
class="o">*</span><span class="n">shared_service_handler_class</span> <span 
class="o">=</span>
+    <span class="n">SHARED_SERVICE_HANDLER_CLASS</span> <span 
class="p">(</span><span class="n">klass</span><span class="p">);</span>
+  <span class="n">CalculatorHandlerClass</span> <span class="o">*</span><span 
class="n">calculator_handler_class</span> <span class="o">=</span>
+    <span class="n">CALCULATOR_HANDLER_CLASS</span> <span 
class="p">(</span><span class="n">klass</span><span class="p">);</span>
+
+  <span class="cm">/* Register our destructor */</span>
+  <span class="n">gobject_class</span><span class="o">-&gt;</span><span 
class="n">finalize</span> <span class="o">=</span> <span 
class="n">tutorial_calculator_handler_finalize</span><span class="p">;</span>
+
+  <span class="cm">/* Register our implementations of CalculatorHandler&#39;s 
methods */</span>
+  <span class="n">calculator_handler_class</span><span 
class="o">-&gt;</span><span class="n">ping</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_ping</span><span 
class="p">;</span>
+  <span class="n">calculator_handler_class</span><span 
class="o">-&gt;</span><span class="n">add</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_add</span><span 
class="p">;</span>
+  <span class="n">calculator_handler_class</span><span 
class="o">-&gt;</span><span class="n">calculate</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_calculate</span><span 
class="p">;</span>
+  <span class="n">calculator_handler_class</span><span 
class="o">-&gt;</span><span class="n">zip</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_zip</span><span 
class="p">;</span>
+
+  <span class="cm">/* Register our implementation of 
SharedServiceHandler&#39;s method */</span>
+  <span class="n">shared_service_handler_class</span><span 
class="o">-&gt;</span><span class="n">get_struct</span> <span class="o">=</span>
+    <span class="n">tutorial_calculator_handler_get_struct</span><span 
class="p">;</span>
+<span class="p">}</span>
+
+<span class="cm">/* 
---------------------------------------------------------------- */</span>
+
+<span class="cm">/* That ends the implementation of 
TutorialCalculatorHandler.</span>
+<span class="cm">   Everything below is fairly generic code that sets up a 
minimal</span>
+<span class="cm">   Thrift server for tutorial clients. */</span>
+
+
+<span class="cm">/* Our server object, declared globally so it is accessible 
within the</span>
+<span class="cm">   SIGINT signal handler */</span>
+<span class="n">ThriftServer</span> <span class="o">*</span><span 
class="n">server</span> <span class="o">=</span> <span 
class="nb">NULL</span><span class="p">;</span>
+
+<span class="cm">/* A flag that indicates whether the server was interrupted 
with</span>
+<span class="cm">   SIGINT (i.e. Ctrl-C) so we can tell whether its 
termination was</span>
+<span class="cm">   abnormal */</span>
+<span class="n">gboolean</span> <span class="n">sigint_received</span> <span 
class="o">=</span> <span class="n">FALSE</span><span class="p">;</span>
+
+<span class="cm">/* Handle SIGINT (&quot;Ctrl-C&quot;) signals by gracefully 
stopping the</span>
+<span class="cm">   server */</span>
+<span class="k">static</span> <span class="kt">void</span>
+<span class="nf">sigint_handler</span> <span class="p">(</span><span 
class="kt">int</span> <span class="n">signal_number</span><span 
class="p">)</span>
+<span class="p">{</span>
+  <span class="n">THRIFT_UNUSED_VAR</span> <span class="p">(</span><span 
class="n">signal_number</span><span class="p">);</span>
+
+  <span class="cm">/* Take note we were called */</span>
+  <span class="n">sigint_received</span> <span class="o">=</span> <span 
class="n">TRUE</span><span class="p">;</span>
+
+  <span class="cm">/* Shut down the server gracefully */</span>
+  <span class="k">if</span> <span class="p">(</span><span 
class="n">server</span> <span class="o">!=</span> <span 
class="nb">NULL</span><span class="p">)</span>
+    <span class="n">thrift_server_stop</span> <span class="p">(</span><span 
class="n">server</span><span class="p">);</span>
+<span class="p">}</span>
+
+<span class="kt">int</span> <span class="nf">main</span> <span 
class="p">(</span><span class="kt">void</span><span class="p">)</span>
+<span class="p">{</span>
+  <span class="n">TutorialCalculatorHandler</span> <span 
class="o">*</span><span class="n">handler</span><span class="p">;</span>
+  <span class="n">CalculatorProcessor</span> <span class="o">*</span><span 
class="n">processor</span><span class="p">;</span>
+
+  <span class="n">ThriftServerTransport</span> <span class="o">*</span><span 
class="n">server_transport</span><span class="p">;</span>
+  <span class="n">ThriftTransportFactory</span> <span class="o">*</span><span 
class="n">transport_factory</span><span class="p">;</span>
+  <span class="n">ThriftProtocolFactory</span> <span class="o">*</span><span 
class="n">protocol_factory</span><span class="p">;</span>
+
+  <span class="k">struct</span> <span class="n">sigaction</span> <span 
class="n">sigint_action</span><span class="p">;</span>
+
+  <span class="n">GError</span> <span class="o">*</span><span 
class="n">error</span><span class="p">;</span>
+  <span class="kt">int</span> <span class="n">exit_status</span> <span 
class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+
+<span class="cp">#if (!GLIB_CHECK_VERSION (2, 36, 0))</span>
+  <span class="n">g_type_init</span> <span class="p">();</span>
+<span class="cp">#endif</span>
+
+  <span class="cm">/* Create an instance of our handler, which provides the 
service&#39;s</span>
+<span class="cm">     methods&#39; implementation */</span>
+  <span class="n">handler</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span 
class="n">TYPE_TUTORIAL_CALCULATOR_HANDLER</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create an instance of the service&#39;s processor, 
automatically</span>
+<span class="cm">     generated by the Thrift compiler, which parses incoming 
messages</span>
+<span class="cm">     and dispatches them to the appropriate method in the 
handler */</span>
+  <span class="n">processor</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span 
class="n">TYPE_CALCULATOR_PROCESSOR</span><span class="p">,</span>
+                  <span class="s">&quot;handler&quot;</span><span 
class="p">,</span> <span class="n">handler</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create our server socket, which binds to the specified 
port and</span>
+<span class="cm">     listens for client connections */</span>
+  <span class="n">server_transport</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_SERVER_SOCKET</span><span class="p">,</span>
+                  <span class="s">&quot;port&quot;</span><span 
class="p">,</span> <span class="mi">9090</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create our transport factory, used by the server to wrap 
&quot;raw&quot;</span>
+<span class="cm">     incoming connections from the client (in this case with 
a</span>
+<span class="cm">     ThriftBufferedTransport to improve performance) */</span>
+  <span class="n">transport_factory</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_BUFFERED_TRANSPORT_FACTORY</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create our protocol factory, which determines which wire 
protocol</span>
+<span class="cm">     the server will use (in this case, Thrift&#39;s binary 
protocol) */</span>
+  <span class="n">protocol_factory</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_BINARY_PROTOCOL_FACTORY</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Create the server itself */</span>
+  <span class="n">server</span> <span class="o">=</span>
+    <span class="n">g_object_new</span> <span class="p">(</span><span 
class="n">THRIFT_TYPE_SIMPLE_SERVER</span><span class="p">,</span>
+                  <span class="s">&quot;processor&quot;</span><span 
class="p">,</span>                <span class="n">processor</span><span 
class="p">,</span>
+                  <span class="s">&quot;server_transport&quot;</span><span 
class="p">,</span>         <span class="n">server_transport</span><span 
class="p">,</span>
+                  <span 
class="s">&quot;input_transport_factory&quot;</span><span class="p">,</span>  
<span class="n">transport_factory</span><span class="p">,</span>
+                  <span 
class="s">&quot;output_transport_factory&quot;</span><span class="p">,</span> 
<span class="n">transport_factory</span><span class="p">,</span>
+                  <span 
class="s">&quot;input_protocol_factory&quot;</span><span class="p">,</span>   
<span class="n">protocol_factory</span><span class="p">,</span>
+                  <span 
class="s">&quot;output_protocol_factory&quot;</span><span class="p">,</span>  
<span class="n">protocol_factory</span><span class="p">,</span>
+                  <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Install our SIGINT handler, which handles Ctrl-C being 
pressed by</span>
+<span class="cm">     stopping the server gracefully (not strictly necessary, 
but a</span>
+<span class="cm">     nice touch) */</span>
+  <span class="n">memset</span> <span class="p">(</span><span 
class="o">&amp;</span><span class="n">sigint_action</span><span 
class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span 
class="k">sizeof</span> <span class="p">(</span><span 
class="n">sigint_action</span><span class="p">));</span>
+  <span class="n">sigint_action</span><span class="p">.</span><span 
class="n">sa_handler</span> <span class="o">=</span> <span 
class="n">sigint_handler</span><span class="p">;</span>
+  <span class="n">sigint_action</span><span class="p">.</span><span 
class="n">sa_flags</span> <span class="o">=</span> <span 
class="n">SA_RESETHAND</span><span class="p">;</span>
+  <span class="n">sigaction</span> <span class="p">(</span><span 
class="n">SIGINT</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">sigint_action</span><span 
class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
+
+  <span class="cm">/* Start the server, which will run until its stop method 
is invoked</span>
+<span class="cm">     (from within the SIGINT handler, in this case) */</span>
+  <span class="n">puts</span> <span class="p">(</span><span 
class="s">&quot;Starting the server...&quot;</span><span class="p">);</span>
+  <span class="n">thrift_server_serve</span> <span class="p">(</span><span 
class="n">server</span><span class="p">,</span> <span 
class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+
+  <span class="cm">/* If the server stopped for any reason other than having 
been</span>
+<span class="cm">     interrupted by the user, report the error */</span>
+  <span class="k">if</span> <span class="p">(</span><span 
class="o">!</span><span class="n">sigint_received</span><span 
class="p">)</span> <span class="p">{</span>
+    <span class="n">g_message</span> <span class="p">(</span><span 
class="s">&quot;thrift_server_serve: %s&quot;</span><span class="p">,</span>
+               <span class="n">error</span> <span class="o">!=</span> <span 
class="nb">NULL</span> <span class="o">?</span> <span 
class="n">error</span><span class="o">-&gt;</span><span 
class="n">message</span> <span class="o">:</span> <span 
class="s">&quot;(null)&quot;</span><span class="p">);</span>
+    <span class="n">g_clear_error</span> <span class="p">(</span><span 
class="o">&amp;</span><span class="n">error</span><span class="p">);</span>
+  <span class="p">}</span>
+
+  <span class="n">puts</span> <span class="p">(</span><span 
class="s">&quot;done.&quot;</span><span class="p">);</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">server</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">transport_factory</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">protocol_factory</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">server_transport</span><span class="p">);</span>
+
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">processor</span><span class="p">);</span>
+  <span class="n">g_object_unref</span> <span class="p">(</span><span 
class="n">handler</span><span class="p">);</span>
+
+  <span class="k">return</span> <span class="n">exit_status</span><span 
class="p">;</span>
+<span class="p">}</span>
+</pre></div>
+
+<p class='snippet_footer'>
+  This snippet was generated by Apache Thrift's <strong>source tree 
docs</strong>:
+  <a 
href="http://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=tutorial/c_glib/c_glib_server.c;hb=HEAD";</a>tutorial/c_glib/c_glib_server.c</a>
+</p>
+       </div>
+       <div class="container">
+       <hr>
+       <footer class="footer">
+               <div class="row">
+                       <div class="span3">
+                               <h3>Links</h3>
+                               <ul class="unstyled">
+                                       <li><a 
href="/download">Download</a></li>
+                                       <li><a 
href="/developers">Developers</a></li>
+                                       <li><a 
href="/tutorial">Tutorials</a></li>
+                           </ul>
+                               <ul class="unstyled">
+                                       <li><a href="/sitemap">Sitemap</a></li>
+                               </ul>
+                       </div>
+                       <div class="span3">
+                               <h3>Get Involved</h3>
+                               <ul class="unstyled">
+                                       <li><a href="/mailing">Mailing 
Lists</a></li>
+                                       <li><a 
href="http://issues.apache.org/jira/browse/THRIFT";>Issue Tracking</a></li>
+                                       <li><a href="/docs/HowToContribute">How 
To Contribute</a></li>
+                               </ul>   
+                       </div>
+                       <div class="span6">
+                               <a href="http://www.apache.org/";><img 
src="/static/images/favicon.ico" /></a> Copyright 2014 <a 
href="http://www.apache.org/";>Apache Software Foundation</a>. Licensed under 
the <a href="http://www.apache.org/licenses/";>Apache License v2.0</a>. Apache, 
Apache Thrift, and the Apache feather logo are trademarks of The Apache 
Software Foundation.
+                       </div>
+               </div>
+               
+       </footer>
+</div>
+
+  </body>
+</html>

Modified: websites/staging/thrift/trunk/content/tutorial/index.html
==============================================================================
--- websites/staging/thrift/trunk/content/tutorial/index.html (original)
+++ websites/staging/thrift/trunk/content/tutorial/index.html Mon Jun  1 
20:08:06 2015
@@ -116,6 +116,7 @@ Both files will be used to demonstrate h
 <h2 id="examples-clients-and-servers">Examples Clients and Servers</h2>
 <ul>
 <li><a href="/tutorial/as3">Actionscript 3.0</a></li>
+<li><a href="/tutorial/c_glib"></a></li>
 <li><a href="/tutorial/cpp">C++</a></li>
 <li><a href="/tutorial/csharp">CSharp</a></li>
 <li><a href="/tutorial/d">D</a></li>


Reply via email to