<table><tr><td style="">dfaure requested changes to this revision.<br />dfaure added inline comments.<br />This revision now requires changes to proceed.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D13034">View Revision</a></tr></table><br /><div><strong>INLINE COMMENTS</strong><div><div style="margin: 6px 0 12px 0;"><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82522">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigtest.cpp:1793</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #304a96">#if !KCONFIG_USE_DBUS</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">QEXPECT_FAIL</span><span class="p">(</span><span style="color: #766510">""</span><span class="p">,</span> <span style="color: #766510">"KConfig notification requires DBus"</span><span class="p">,</span> <span class="n">QTest</span><span style="color: #aa2211">::</span><span class="n">Continue</span><span class="p">)</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">Q_ASSERT</span><span class="p">(</span><span style="color: #304a96">false</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">This is normally done using QSKIP.</p>

<p style="padding: 0; margin: 8px;">Better than this, which will "fail to fail" in release mode (at least on the Q_ASSERT(false) line).</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82523">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigtest.cpp:1800</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #74777d">//mimcs a config in another process, which is watching for events</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #aa4000">auto</span> <span class="n">remoteConfig</span> <span style="color: #aa2211">=</span> <span class="n">KSharedConfig</span><span style="color: #aa2211">::</span><span class="n">openConfig</span><span class="p">(</span><span class="n">TEST_SUBDIR</span> <span style="color: #766510">"kconfigtest"</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">typo: mimics</p>

<p style="padding: 0; margin: 8px;">The fact that it's not actually another process, means that this test would pass with a simple emit as well ;)<br />
A proper test would use QProcess to run a helper executable which would make changes to a config file.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82524">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfig.cpp:460</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">                    <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">bNotify</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">                        <span class="n">notifyGroupsGlobal</span><span class="p">[</span><span class="n">QString</span><span style="color: #aa2211">::</span><span class="n">fromLatin1</span><span class="p">(</span><span class="n">it</span><span class="p">.</span><span class="n">key</span><span class="p">().</span><span class="n">mGroup</span><span class="p">)]</span> <span style="color: #aa2211"><<</span> <span class="n">it</span><span class="p">.</span><span class="n">key</span><span class="p">().</span><span class="n">mKey</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">                    <span class="p">}</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Why latin1? Can't groups use utf8?</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82525">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfig.cpp:465</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">                    <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">bNotify</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">                        <span class="n">notifyGroupsLocal</span><span class="p">[</span><span class="n">QString</span><span style="color: #aa2211">::</span><span class="n">fromLatin1</span><span class="p">(</span><span class="n">it</span><span class="p">.</span><span class="n">key</span><span class="p">().</span><span class="n">mGroup</span><span class="p">)]</span> <span style="color: #aa2211"><<</span> <span class="n">it</span><span class="p">.</span><span class="n">key</span><span class="p">().</span><span class="n">mKey</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; ">                    <span class="p">}</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">writeGlobals</span> <span style="color: #aa2211">&&</span> <span class="n">writeLocals</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                    <span style="color: #aa4000">break</span><span class="p">;</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">I wonder if we should skip doing this work when DBUS support is disabled, for performance reasons.<br />
More #if, but more speed... in the corner-case scenario though.<br />
So I'm not sure ;)</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82527">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigbase.h:61</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; ">        <span style="color: #74777d">/**<</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d">         * Notify remote KConfigWatchers of changes (Linux only)</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d">         * @since 5.CONFIGWATCHERVERSION</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">I see no reason why this wouldn't work on BSD :-)</p>

<p style="padding: 0; margin: 8px;">I would change this to "(requires DBus support)".</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82526">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigbase.h:62</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d">         * Notify remote KConfigWatchers of changes (Linux only)</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d">         * @since 5.CONFIGWATCHERVERSION</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d">         */</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Let's go for 51 :)</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82528">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigdata.cpp:304</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span style="color: #aa4000">case</span> <span style="color: #a0a000">EntryNotify</span><span class="p">:</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">            <span class="n">it</span><span style="color: #aa2211">-></span><span class="n">bNotify</span> <span style="color: #aa2211">=</span> <span class="n">bf</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; ">        <span style="color: #aa4000">default</span><span style="color: #aa2211">:</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">missing break;</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82531">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigwatcher.cpp:1</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #304a96">#include</span> <span class="cpf">"kconfigwatcher.h"</span><span style="color: #304a96"></span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">License header missing</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82533">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigwatcher.cpp:20</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #aa4000">typedef</span> <span class="n">QHash</span><span style="color: #aa2211"><</span><span class="n">KSharedConfig</span><span style="color: #aa2211">*</span><span class="p">,</span> <span class="n">QWeakPointer</span><span style="color: #aa2211"><</span><span class="n">KConfigWatcher</span><span style="color: #aa2211">>></span> <span class="n">ConfigWatcherMap</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span class="n">Q_GLOBAL_STATIC</span><span class="p">(</span><span class="n">ConfigWatcherMap</span><span class="p">,</span> <span class="n">s_globalWatcherList</span><span class="p">)</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">(I'm curious, why not a raw pointer? You clean up the hash when the watcher is destroyed anyway; probably doesn't matter either way though)</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82532">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigwatcher.cpp:21</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #aa4000">typedef</span> <span class="n">QHash</span><span style="color: #aa2211"><</span><span class="n">KSharedConfig</span><span style="color: #aa2211">*</span><span class="p">,</span> <span class="n">QWeakPointer</span><span style="color: #aa2211"><</span><span class="n">KConfigWatcher</span><span style="color: #aa2211">>></span> <span class="n">ConfigWatcherMap</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span class="n">Q_GLOBAL_STATIC</span><span class="p">(</span><span class="n">ConfigWatcherMap</span><span class="p">,</span> <span class="n">s_globalWatcherList</span><span class="p">)</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">You could also do this the C++11 way with a static object inside the create() method, which is the only place where it's used.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82534">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigwatcher.cpp:28</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #aa4000">if</span> <span class="p">(</span><span style="color: #aa2211">!</span><span class="n">s_globalWatcherList</span><span style="color: #aa2211">-></span><span class="n">contains</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">watcher</span> <span style="color: #aa2211">=</span> <span class="n">KConfigWatcher</span><span style="color: #aa2211">::</span><span class="n">Ptr</span><span class="p">(</span><span style="color: #aa4000">new</span> <span class="n">KConfigWatcher</span><span class="p">(</span><span class="n">config</span><span class="p">));</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">There should probably be a mutex around this whole method implementation, in case two threads create a watcher for the same KSharedConfig (which is itself threadsafe).</p>

<p style="padding: 0; margin: 8px;">Alternatively, the static can be a QThreadStorage, like I did in ksharedconfig.cpp.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82529">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigwatcher.h:34</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d"> * Notifies when another client has updated this config file with the Notify flag set.</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d"> * @since 5.CONFIGWATCHERVERSION</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span style="color: #74777d"> */</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">51</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D13034#inline-82530">View Inline</a><span style="color: #4b4d51; font-weight: bold;">kconfigwatcher.h:60</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);"><span class="n">private</span> <span style="color: #a0a000">Q_SLOTS</span><span class="p">:</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #aa4000">void</span> <span class="n">onConfigChangeNotification</span><span class="p">(</span><span class="n">QHash</span><span style="color: #aa2211"><</span><span class="n">QString</span><span class="p">,</span> <span class="n">QByteArrayList</span><span style="color: #aa2211">></span> <span class="n">changes</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">const ref</p></div></div></div></div></div><br /><div><strong>REPOSITORY</strong><div><div>R237 KConfig</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D13034">https://phabricator.kde.org/D13034</a></div></div><br /><div><strong>To: </strong>davidedmundson, broulik, dfaure<br /><strong>Cc: </strong>dfaure, broulik, zzag, kde-frameworks-devel, michaelh, ngraham, bruns<br /></div>