<html><head><title>/vejviseren/liv-i-ruden/</title></head>
<body>
<h2>/vejviseren/liv-i-ruden/</h2>
<ul>
<li><a href='/bynu/content/plain/vejviseren/?id=4488aceab98b2b7a58b51e1e54e0fd5beb9fc823'>../</a></li>
  <li><a href='/bynu/content/plain/vejviseren/liv-i-ruden/liv-i-ruden-fernisering.jpg?id=4488aceab98b2b7a58b51e1e54e0fd5beb9fc823'>liv-i-ruden-fernisering.jpg</a></li>
  <li><a href='/bynu/content/plain/vejviseren/liv-i-ruden/liv-i-ruden-sys.jpg?id=4488aceab98b2b7a58b51e1e54e0fd5beb9fc823'>liv-i-ruden-sys.jpg</a></li>
 </ul>
</body></html>
dk/omni/voctomix/atom/voctocore/lib/controlserver.py?h=master' type='application/atom+xml'/>
<link rel='vcs-git' href='https://source.couchdesign.dk/omni/voctomix' title='omni/voctomix Git repository'/>
<link rel='vcs-git' href='user@source.couchdesign.dk:omni/voctomix' title='omni/voctomix Git repository'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/'><img src='/cgit-css/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/'>index</a> : <a href='/omni/voctomix/'>omni/voctomix</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='358046081cd9809ac0a38fee957cf6ea40c3d7e6'/><select name='h' onchange='this.form.submit();'>
<option value='master' selected='selected'>master</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>Unnamed repository; edit this file 'description' to name the repository.</td><td class='sub right'>Jonas Smedegaard</td></tr></table>
<table class='tabs'><tr><td>
<a href='/omni/voctomix/about/'>about</a><a href='/omni/voctomix/'>summary</a><a href='/omni/voctomix/refs/?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>refs</a><a href='/omni/voctomix/log/voctocore/lib/controlserver.py'>log</a><a class='active' href='/omni/voctomix/tree/voctocore/lib/controlserver.py?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>tree</a><a href='/omni/voctomix/commit/voctocore/lib/controlserver.py?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>commit</a><a href='/omni/voctomix/diff/voctocore/lib/controlserver.py?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>diff</a></td><td class='form'><form class='right' method='get' action='/omni/voctomix/log/voctocore/lib/controlserver.py'>
<input type='hidden' name='id' value='358046081cd9809ac0a38fee957cf6ea40c3d7e6'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/omni/voctomix/tree/?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>root</a>/<a href='/omni/voctomix/tree/voctocore?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>voctocore</a>/<a href='/omni/voctomix/tree/voctocore/lib?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>lib</a>/<a href='/omni/voctomix/tree/voctocore/lib/controlserver.py?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>controlserver.py</a></div><div class='content'>blob: 87a28c8d934e5aada7a766af10440ada9007445b (<a href='/omni/voctomix/plain/voctocore/lib/controlserver.py?id=358046081cd9809ac0a38fee957cf6ea40c3d7e6'>plain</a>)
<table summary='blob content' class='blob'>
<tr>
<td class='lines'><pre><code><ol class="hl">
<li id="n_1" class="hl"><span class="hl slc">#!/usr/bin/python3</span></li>
<li id="n_2" class="hl"><span class="hl kwa">import&nbsp;</span>socket<span class="hl opt">, </span>logging<span class="hl opt">, </span>traceback</li>
<li id="n_3" class="hl"><span class="hl kwa">from </span>queue <span class="hl kwa">import </span>Queue</li>
<li id="n_4" class="hl"><span class="hl kwa">from </span>gi<span class="hl opt">.</span>repository <span class="hl kwa">import </span>GObject</li>
<li id="n_5" class="hl"></li>
<li id="n_6" class="hl"><span class="hl kwa">from </span>lib<span class="hl opt">.</span>commands <span class="hl kwa">import </span>ControlServerCommands</li>
<li id="n_7" class="hl"><span class="hl kwa">from </span>lib<span class="hl opt">.</span>tcpmulticonnection <span class="hl kwa">import </span>TCPMultiConnection</li>
<li id="n_8" class="hl"><span class="hl kwa">from </span>lib<span class="hl opt">.</span>response <span class="hl kwa">import </span>NotifyResponse<span class="hl opt">, </span>OkResponse</li>
<li id="n_9" class="hl"></li>
<li id="n_10" class="hl"><span class="hl kwa">class </span><span class="hl kwd">ControlServer</span><span class="hl opt">(</span>TCPMultiConnection<span class="hl opt">):</span></li>
<li id="n_11" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">__init__</span><span class="hl opt">(</span>self<span class="hl opt">, </span>pipeline<span class="hl opt">):</span></li>
<li id="n_12" class="hl">        <span class="hl sng">&#39;&#39;&#39;Initialize server and start listening.&#39;&#39;&#39;</span></li>
<li id="n_13" class="hl">        self<span class="hl opt">.</span>log <span class="hl opt">= </span>logging<span class="hl opt">.</span><span class="hl kwd">getLogger</span><span class="hl opt">(</span><span class="hl sng">&#39;ControlServer&#39;</span><span class="hl opt">)</span></li>
<li id="n_14" class="hl">        <span class="hl kwb">super</span><span class="hl opt">()</span><span class="hl num">.__</span>init<span class="hl num">__</span><span class="hl opt">(</span>port<span class="hl opt">=</span><span class="hl num">9999</span><span class="hl opt">)</span></li>
<li id="n_15" class="hl"></li>
<li id="n_16" class="hl">        self<span class="hl opt">.</span>command_queue <span class="hl opt">= </span><span class="hl kwd">Queue</span><span class="hl opt">()</span></li>
<li id="n_17" class="hl"></li>
<li id="n_18" class="hl">        self<span class="hl opt">.</span>commands <span class="hl opt">= </span><span class="hl kwd">ControlServerCommands</span><span class="hl opt">(</span>pipeline<span class="hl opt">)</span></li>
<li id="n_19" class="hl"></li>
<li id="n_20" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">on_accepted</span><span class="hl opt">(</span>self<span class="hl opt">, </span>conn<span class="hl opt">, </span>addr<span class="hl opt">):</span></li>
<li id="n_21" class="hl">        <span class="hl sng">&#39;&#39;&#39;Asynchronous connection listener. Starts a handler for each connection.&#39;&#39;&#39;</span></li>
<li id="n_22" class="hl">        self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;setting gobject io-watch on connection&#39;</span><span class="hl opt">)</span></li>
<li id="n_23" class="hl">        GObject<span class="hl opt">.</span><span class="hl kwd">io_add_watch</span><span class="hl opt">(</span>conn<span class="hl opt">, </span>GObject<span class="hl opt">.</span>IO_IN<span class="hl opt">, </span>self<span class="hl opt">.</span>on_data<span class="hl opt">, [</span><span class="hl sng">&#39;&#39;</span><span class="hl opt">])</span></li>
<li id="n_24" class="hl"></li>
<li id="n_25" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">on_data</span><span class="hl opt">(</span>self<span class="hl opt">, </span>conn<span class="hl opt">, </span>_<span class="hl opt">, </span>leftovers<span class="hl opt">, *</span>args<span class="hl opt">):</span></li>
<li id="n_26" class="hl">        <span class="hl sng">&#39;&#39;&#39;Asynchronous connection handler. Pushes data from socket</span></li>
<li id="n_27" class="hl"><span class="hl sng">        into command queue linewise&#39;&#39;&#39;</span></li>
<li id="n_28" class="hl">        close_after <span class="hl opt">= </span><span class="hl kwa">False</span></li>
<li id="n_29" class="hl">        <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_30" class="hl">            <span class="hl kwa">while True</span><span class="hl opt">:</span></li>
<li id="n_31" class="hl">                <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_32" class="hl">                    leftovers<span class="hl opt">.</span><span class="hl kwd">append</span><span class="hl opt">(</span>conn<span class="hl opt">.</span><span class="hl kwd">recv</span><span class="hl opt">(</span><span class="hl num">4096</span><span class="hl opt">).</span><span class="hl kwd">decode</span><span class="hl opt">(</span>errors<span class="hl opt">=</span><span class="hl sng">&#39;replace&#39;</span><span class="hl opt">))</span></li>
<li id="n_33" class="hl">                    <span class="hl kwa">if </span><span class="hl kwb">len</span><span class="hl opt">(</span>leftovers<span class="hl opt">[-</span><span class="hl num">1</span><span class="hl opt">]) == </span><span class="hl num">0</span><span class="hl opt">:</span></li>
<li id="n_34" class="hl">                        self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">info</span><span class="hl opt">(</span><span class="hl sng">&quot;Socket was closed&quot;</span><span class="hl opt">)</span></li>
<li id="n_35" class="hl">                        leftovers<span class="hl opt">.</span><span class="hl kwd">pop</span><span class="hl opt">()</span></li>
<li id="n_36" class="hl">                        close_after <span class="hl opt">= </span><span class="hl kwa">True</span></li>
<li id="n_37" class="hl">                        <span class="hl kwa">break</span></li>
<li id="n_38" class="hl"></li>
<li id="n_39" class="hl">                <span class="hl kwa">except </span><span class="hl kwc">UnicodeDecodeError </span><span class="hl kwa">as </span>e<span class="hl opt">:</span></li>
<li id="n_40" class="hl">                    <span class="hl kwa">continue</span></li>
<li id="n_41" class="hl">        <span class="hl kwa">except</span><span class="hl opt">:</span></li>
<li id="n_42" class="hl">            <span class="hl kwa">pass</span></li>
<li id="n_43" class="hl"></li>
<li id="n_44" class="hl">        data <span class="hl opt">= </span><span class="hl sng">&quot;&quot;</span><span class="hl opt">.</span><span class="hl kwd">join</span><span class="hl opt">(</span>leftovers<span class="hl opt">)</span></li>
<li id="n_45" class="hl">        <span class="hl kwa">del </span>leftovers<span class="hl opt">[:]</span></li>
<li id="n_46" class="hl"></li>
<li id="n_47" class="hl">        lines <span class="hl opt">= </span>data<span class="hl opt">.</span><span class="hl kwd">split</span><span class="hl opt">(</span><span class="hl sng">&#39;</span><span class="hl esc">\n</span><span class="hl sng">&#39;</span><span class="hl opt">)</span></li>
<li id="n_48" class="hl">        <span class="hl kwa">for </span>line <span class="hl kwa">in </span>lines<span class="hl opt">[:-</span><span class="hl num">1</span><span class="hl opt">]:</span></li>
<li id="n_49" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&quot;got line: </span><span class="hl ipl">%r</span><span class="hl sng">&quot;</span><span class="hl opt">, </span>line<span class="hl opt">)</span></li>
<li id="n_50" class="hl"></li>
<li id="n_51" class="hl">            line <span class="hl opt">= </span>line<span class="hl opt">.</span><span class="hl kwd">strip</span><span class="hl opt">()</span></li>
<li id="n_52" class="hl">            <span class="hl slc"># &#39;quit&#39; = remote wants us to close the connection</span></li>
<li id="n_53" class="hl">            <span class="hl kwa">if </span>line <span class="hl opt">== </span><span class="hl sng">&#39;quit&#39;</span><span class="hl opt">:</span></li>
<li id="n_54" class="hl">                self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">info</span><span class="hl opt">(</span><span class="hl sng">&quot;Client asked us to close the Connection&quot;</span><span class="hl opt">)</span></li>
<li id="n_55" class="hl">                self<span class="hl opt">.</span><span class="hl kwd">close_connection</span><span class="hl opt">(</span>conn<span class="hl opt">)</span></li>
<li id="n_56" class="hl">                <span class="hl kwa">return False</span></li>
<li id="n_57" class="hl"></li>
<li id="n_58" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;re-starting on_loop scheduling&#39;</span><span class="hl opt">)</span></li>
<li id="n_59" class="hl">            GObject<span class="hl opt">.</span><span class="hl kwd">idle_add</span><span class="hl opt">(</span>self<span class="hl opt">.</span>on_loop<span class="hl opt">)</span></li>
<li id="n_60" class="hl"></li>
<li id="n_61" class="hl">            self<span class="hl opt">.</span>command_queue<span class="hl opt">.</span><span class="hl kwd">put</span><span class="hl opt">((</span>line<span class="hl opt">, </span>conn<span class="hl opt">))</span></li>
<li id="n_62" class="hl"></li>
<li id="n_63" class="hl">        <span class="hl kwa">if </span>close_after<span class="hl opt">:</span></li>
<li id="n_64" class="hl">            self<span class="hl opt">.</span><span class="hl kwd">close_connection</span><span class="hl opt">(</span>conn<span class="hl opt">)</span></li>
<li id="n_65" class="hl">            <span class="hl kwa">return False</span></li>
<li id="n_66" class="hl"></li>
<li id="n_67" class="hl">        <span class="hl kwa">if </span>lines<span class="hl opt">[-</span><span class="hl num">1</span><span class="hl opt">] != </span><span class="hl sng">&#39;&#39;</span><span class="hl opt">:</span></li>
<li id="n_68" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&quot;remaining </span><span class="hl ipl">%r</span><span class="hl sng">&quot;</span><span class="hl opt">, </span>lines<span class="hl opt">[-</span><span class="hl num">1</span><span class="hl opt">])</span></li>
<li id="n_69" class="hl"></li>
<li id="n_70" class="hl">        leftovers<span class="hl opt">.</span><span class="hl kwd">append</span><span class="hl opt">(</span>lines<span class="hl opt">[-</span><span class="hl num">1</span><span class="hl opt">])</span></li>
<li id="n_71" class="hl">        <span class="hl kwa">return True</span></li>
<li id="n_72" class="hl"></li>
<li id="n_73" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">on_loop</span><span class="hl opt">(</span>self<span class="hl opt">):</span></li>
<li id="n_74" class="hl">        <span class="hl sng">&#39;&#39;&#39;Command handler. Processes commands in the command queue whenever</span></li>
<li id="n_75" class="hl"><span class="hl sng">        nothing else is happening (registered as GObject idle callback)&#39;&#39;&#39;</span></li>
<li id="n_76" class="hl"></li>
<li id="n_77" class="hl">        self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;on_loop called&#39;</span><span class="hl opt">)</span></li>
<li id="n_78" class="hl"></li>
<li id="n_79" class="hl">        <span class="hl kwa">if </span>self<span class="hl opt">.</span>command_queue<span class="hl opt">.</span><span class="hl kwd">empty</span><span class="hl opt">():</span></li>
<li id="n_80" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;command_queue is empty again, stopping on_loop scheduling&#39;</span><span class="hl opt">)</span></li>
<li id="n_81" class="hl">            <span class="hl kwa">return False</span></li>
<li id="n_82" class="hl"></li>
<li id="n_83" class="hl">        line<span class="hl opt">, </span>requestor <span class="hl opt">= </span>self<span class="hl opt">.</span>command_queue<span class="hl opt">.</span><span class="hl kwd">get</span><span class="hl opt">()</span></li>
<li id="n_84" class="hl"></li>
<li id="n_85" class="hl">        words <span class="hl opt">= </span>line<span class="hl opt">.</span><span class="hl kwd">split</span><span class="hl opt">()</span></li>
<li id="n_86" class="hl">        <span class="hl kwa">if </span><span class="hl kwb">len</span><span class="hl opt">(</span>words<span class="hl opt">) &lt; </span><span class="hl num">1</span><span class="hl opt">:</span></li>
<li id="n_87" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;command_queue is empty again, stopping on_loop scheduling&#39;</span><span class="hl opt">)</span></li>
<li id="n_88" class="hl">            <span class="hl kwa">return True</span></li>
<li id="n_89" class="hl"></li>
<li id="n_90" class="hl">        command <span class="hl opt">= </span>words<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span></li>
<li id="n_91" class="hl">        args <span class="hl opt">= </span>words<span class="hl opt">[</span><span class="hl num">1</span><span class="hl opt">:]</span></li>
<li id="n_92" class="hl"></li>
<li id="n_93" class="hl">        self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">info</span><span class="hl opt">(</span><span class="hl sng">&quot;processing command </span><span class="hl ipl">%r </span><span class="hl sng">with args </span><span class="hl ipl">%s</span><span class="hl sng">&quot;</span><span class="hl opt">, </span>command<span class="hl opt">, </span>args<span class="hl opt">)</span></li>
<li id="n_94" class="hl"></li>
<li id="n_95" class="hl">        response <span class="hl opt">= </span><span class="hl kwa">None</span></li>
<li id="n_96" class="hl">        <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_97" class="hl">            <span class="hl slc"># deny calling private methods</span></li>
<li id="n_98" class="hl">            <span class="hl kwa">if </span>command<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">] == </span><span class="hl sng">&#39;_&#39;</span><span class="hl opt">:</span></li>
<li id="n_99" class="hl">                self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">info</span><span class="hl opt">(</span><span class="hl sng">&#39;private methods are not callable&#39;</span><span class="hl opt">)</span></li>
<li id="n_100" class="hl">                <span class="hl kwa">raise </span><span class="hl kwc">KeyError</span><span class="hl opt">()</span></li>
<li id="n_101" class="hl"></li>
<li id="n_102" class="hl">            command_function <span class="hl opt">= </span>self<span class="hl opt">.</span>commands<span class="hl num">.__</span>class<span class="hl num">__.__</span>dict<span class="hl num">__</span><span class="hl opt">[</span>command<span class="hl opt">]</span></li>
<li id="n_103" class="hl"></li>
<li id="n_104" class="hl">        <span class="hl kwa">except </span><span class="hl kwc">KeyError </span><span class="hl kwa">as </span>e<span class="hl opt">:</span></li>
<li id="n_105" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">info</span><span class="hl opt">(</span><span class="hl sng">&quot;received unknown command </span><span class="hl ipl">%s</span><span class="hl sng">&quot;</span><span class="hl opt">, </span>command<span class="hl opt">)</span></li>
<li id="n_106" class="hl">            response <span class="hl opt">= </span><span class="hl sng">&quot;error unknown command </span><span class="hl ipl">%s</span><span class="hl sng"></span><span class="hl esc">\n</span><span class="hl sng">&quot;</span> <span class="hl opt">% </span>command</li>
<li id="n_107" class="hl"></li>
<li id="n_108" class="hl">        <span class="hl kwa">else</span><span class="hl opt">:</span></li>
<li id="n_109" class="hl">            <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_110" class="hl">                responseObject <span class="hl opt">= </span><span class="hl kwd">command_function</span><span class="hl opt">(</span>self<span class="hl opt">.</span>commands<span class="hl opt">, *</span>args<span class="hl opt">)</span></li>
<li id="n_111" class="hl"></li>
<li id="n_112" class="hl">            <span class="hl kwa">except </span><span class="hl kwc">Exception </span><span class="hl kwa">as </span>e<span class="hl opt">:</span></li>
<li id="n_113" class="hl">                message <span class="hl opt">= </span><span class="hl kwb">str</span><span class="hl opt">(</span>e<span class="hl opt">) </span><span class="hl kwa">or </span><span class="hl sng">&quot;&lt;no message&gt;&quot;</span></li>
<li id="n_114" class="hl">                response <span class="hl opt">= </span><span class="hl sng">&quot;error </span><span class="hl ipl">%s</span><span class="hl sng"></span><span class="hl esc">\n</span><span class="hl sng">&quot;</span> <span class="hl opt">% </span>message</li>
<li id="n_115" class="hl"></li>
<li id="n_116" class="hl">            <span class="hl kwa">else</span><span class="hl opt">:</span></li>
<li id="n_117" class="hl">                <span class="hl kwa">if </span><span class="hl kwb">isinstance</span><span class="hl opt">(</span>responseObject<span class="hl opt">, </span>NotifyResponse<span class="hl opt">):</span></li>
<li id="n_118" class="hl">                    responseObject <span class="hl opt">= [ </span>responseObject <span class="hl opt">]</span></li>
<li id="n_119" class="hl"></li>
<li id="n_120" class="hl">                <span class="hl kwa">if </span><span class="hl kwb">isinstance</span><span class="hl opt">(</span>responseObject<span class="hl opt">, </span><span class="hl kwb">list</span><span class="hl opt">):</span></li>
<li id="n_121" class="hl">                    <span class="hl kwa">for </span>obj <span class="hl kwa">in </span>responseObject<span class="hl opt">:</span></li>
<li id="n_122" class="hl">                        signal <span class="hl opt">= </span><span class="hl sng">&quot;</span><span class="hl ipl">%s</span><span class="hl sng"></span><span class="hl esc">\n</span><span class="hl sng">&quot;</span> <span class="hl opt">% </span><span class="hl kwb">str</span><span class="hl opt">(</span>obj<span class="hl opt">)</span></li>
<li id="n_123" class="hl">                        <span class="hl kwa">for </span>conn <span class="hl kwa">in </span>self<span class="hl opt">.</span>currentConnections<span class="hl opt">:</span></li>
<li id="n_124" class="hl">                            self<span class="hl num">._</span>schedule<span class="hl num">_</span>write<span class="hl opt">(</span>conn<span class="hl opt">, </span>signal<span class="hl opt">)</span></li>
<li id="n_125" class="hl">                <span class="hl kwa">else</span><span class="hl opt">:</span></li>
<li id="n_126" class="hl">                    response <span class="hl opt">= </span><span class="hl sng">&quot;</span><span class="hl ipl">%s</span><span class="hl sng"></span><span class="hl esc">\n</span><span class="hl sng">&quot;</span> <span class="hl opt">% </span><span class="hl kwb">str</span><span class="hl opt">(</span>responseObject<span class="hl opt">)</span></li>
<li id="n_127" class="hl"></li>
<li id="n_128" class="hl">        <span class="hl kwa">finally</span><span class="hl opt">:</span></li>
<li id="n_129" class="hl">            <span class="hl kwa">if </span>response <span class="hl kwa">is not None and </span>requestor <span class="hl kwa">in </span>self<span class="hl opt">.</span>currentConnections<span class="hl opt">:</span></li>
<li id="n_130" class="hl">                self<span class="hl num">._</span>schedule<span class="hl num">_</span>write<span class="hl opt">(</span>requestor<span class="hl opt">, </span>response<span class="hl opt">)</span></li>
<li id="n_131" class="hl"></li>
<li id="n_132" class="hl">        <span class="hl kwa">return False</span></li>
<li id="n_133" class="hl"></li>
<li id="n_134" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">_schedule_write</span><span class="hl opt">(</span>self<span class="hl opt">, </span>conn<span class="hl opt">, </span>message<span class="hl opt">):</span></li>
<li id="n_135" class="hl">        queue <span class="hl opt">= </span>self<span class="hl opt">.</span>currentConnections<span class="hl opt">[</span>conn<span class="hl opt">]</span></li>
<li id="n_136" class="hl"></li>
<li id="n_137" class="hl">        self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;re-starting on_write[</span><span class="hl ipl">%u</span><span class="hl sng">] scheduling&#39;</span><span class="hl opt">, </span>conn<span class="hl opt">.</span><span class="hl kwd">fileno</span><span class="hl opt">())</span></li>
<li id="n_138" class="hl">        GObject<span class="hl opt">.</span><span class="hl kwd">io_add_watch</span><span class="hl opt">(</span>conn<span class="hl opt">, </span>GObject<span class="hl opt">.</span>IO_OUT<span class="hl opt">, </span>self<span class="hl opt">.</span>on_write<span class="hl opt">)</span></li>
<li id="n_139" class="hl"></li>
<li id="n_140" class="hl">        queue<span class="hl opt">.</span><span class="hl kwd">put</span><span class="hl opt">(</span>message<span class="hl opt">)</span></li>
<li id="n_141" class="hl"></li>
<li id="n_142" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">on_write</span><span class="hl opt">(</span>self<span class="hl opt">, </span>conn<span class="hl opt">, *</span>args<span class="hl opt">):</span></li>
<li id="n_143" class="hl">        self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;on_write[</span><span class="hl ipl">%u</span><span class="hl sng">] called&#39;</span><span class="hl opt">, </span>conn<span class="hl opt">.</span><span class="hl kwd">fileno</span><span class="hl opt">())</span></li>
<li id="n_144" class="hl"></li>
<li id="n_145" class="hl">        <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_146" class="hl">            queue <span class="hl opt">= </span>self<span class="hl opt">.</span>currentConnections<span class="hl opt">[</span>conn<span class="hl opt">]</span></li>
<li id="n_147" class="hl">        <span class="hl kwa">except </span><span class="hl kwc">KeyError</span><span class="hl opt">:</span></li>
<li id="n_148" class="hl">            <span class="hl kwa">return False</span></li>
<li id="n_149" class="hl"></li>
<li id="n_150" class="hl">        <span class="hl kwa">if </span>queue<span class="hl opt">.</span><span class="hl kwd">empty</span><span class="hl opt">():</span></li>
<li id="n_151" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&#39;write_queue[</span><span class="hl ipl">%u</span><span class="hl sng">] is empty again, stopping on_write scheduling&#39;</span><span class="hl opt">, </span>conn<span class="hl opt">.</span><span class="hl kwd">fileno</span><span class="hl opt">())</span></li>
<li id="n_152" class="hl">            <span class="hl kwa">return False</span></li>
<li id="n_153" class="hl"></li>
<li id="n_154" class="hl">        message <span class="hl opt">= </span>queue<span class="hl opt">.</span><span class="hl kwd">get</span><span class="hl opt">()</span></li>
<li id="n_155" class="hl">        <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_156" class="hl">            conn<span class="hl opt">.</span><span class="hl kwd">send</span><span class="hl opt">(</span>message<span class="hl opt">.</span><span class="hl kwd">encode</span><span class="hl opt">())</span></li>
<li id="n_157" class="hl">        <span class="hl kwa">except </span><span class="hl kwc">Exception </span><span class="hl kwa">as </span>e<span class="hl opt">:</span></li>
<li id="n_158" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">warn</span><span class="hl opt">(</span>e<span class="hl opt">)</span></li>
<li id="n_159" class="hl"></li>
<li id="n_160" class="hl">        <span class="hl kwa">return True</span></li>
<li id="n_161" class="hl"></li>
<li id="n_162" class="hl">    <span class="hl kwa">def </span><span class="hl kwd">notify_all</span><span class="hl opt">(</span>self<span class="hl opt">, </span>msg<span class="hl opt">):</span></li>
<li id="n_163" class="hl">        <span class="hl kwa">try</span><span class="hl opt">:</span></li>
<li id="n_164" class="hl">            words <span class="hl opt">= </span>msg<span class="hl opt">.</span><span class="hl kwd">split</span><span class="hl opt">()</span></li>
<li id="n_165" class="hl">            words<span class="hl opt">[-</span><span class="hl num">1</span><span class="hl opt">] = </span>self<span class="hl opt">.</span>commands<span class="hl opt">.</span><span class="hl kwd">encodeSourceName</span><span class="hl opt">(</span><span class="hl kwb">int</span><span class="hl opt">(</span>words<span class="hl opt">[-</span><span class="hl num">1</span><span class="hl opt">]))</span></li>
<li id="n_166" class="hl">            msg <span class="hl opt">= </span><span class="hl sng">&quot; &quot;</span><span class="hl opt">.</span><span class="hl kwd">join</span><span class="hl opt">(</span>words<span class="hl opt">) + </span><span class="hl sng">&#39;</span><span class="hl esc">\n</span><span class="hl sng">&#39;</span></li>
<li id="n_167" class="hl">            <span class="hl kwa">for </span>conn <span class="hl kwa">in </span>self<span class="hl opt">.</span>currentConnections<span class="hl opt">:</span></li>
<li id="n_168" class="hl">                self<span class="hl num">._</span>schedule<span class="hl num">_</span>write<span class="hl opt">(</span>conn<span class="hl opt">, </span>msg<span class="hl opt">)</span></li>
<li id="n_169" class="hl">        <span class="hl kwa">except </span><span class="hl kwc">Exception </span><span class="hl kwa">as </span>e<span class="hl opt">:</span></li>
<li id="n_170" class="hl">            self<span class="hl opt">.</span>log<span class="hl opt">.</span><span class="hl kwd">debug</span><span class="hl opt">(</span><span class="hl sng">&quot;error during notify: </span><span class="hl ipl">%s</span><span class="hl sng">&quot;</span><span class="hl opt">, </span>e<span class="hl opt">)</span></li>
</ol></code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.46.0</a>) at 2025-07-17 09:42:30 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
