Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 1f9eb832ba1e4b88d9a5c2b384813bb4 > files > 2225

kdelibs3-apidocs-3.5.10-31.fc15.noarch.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">

<head>
  <title>kdecore: kconfigbackend.cpp Source File (kdecore)</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <meta http-equiv="Content-Style-Type" content="text/css" />

  <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org"  r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org"  r (n 0 s 0 v 0 l 0))' />

  <meta name="trademark" content="KDE e.V." />
  <meta name="description" content="K Desktop Environment Homepage, KDE.org" />
  <meta name="MSSmartTagsPreventParsing" content="true" />
  <meta name="robots" content="all" />

  <link rel="shortcut icon" href="../../favicon.ico" />

<link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" />



</head>

<body>

<div id="nav_header_top" align="right">
  <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a>

  <a href="../.."><img id="nav_header_logo" alt="Home" align="left" src="../../kde_gear_64.png" border="0" /></a>
  <span class="doNotDisplay">::</span>

  <div id="nav_header_title" align="left">KDE API Reference</div>


</div>

<div id="nav_header_bottom" align="right">
  <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span>
  <div id="nav_header_bottom_right" style="text-align: left;">
/ <a href="../..">API Reference</a>
 / <a href=".">kdecore</a>
  </div>
</div>


<table id="main" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
      <td valign="top" class="menuheader" height="0"></td>

  <td id="contentcolumn" valign="top" rowspan="2" >
    <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;">
    <a name="content"></a>


<!-- Generated by Doxygen 1.7.4 -->
<div class="header">
  <div class="headertitle">
<div class="title">kconfigbackend.cpp</div>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">  This file is part of the KDE libraries</span>
<a name="l00003"></a>00003 <span class="comment">  Copyright (c) 1999 Preston Brown &lt;pbrown@kde.org&gt;</span>
<a name="l00004"></a>00004 <span class="comment">  Copyright (c) 1997-1999 Matthias Kalle Dalheimer &lt;kalle@kde.org&gt;</span>
<a name="l00005"></a>00005 <span class="comment"></span>
<a name="l00006"></a>00006 <span class="comment">  This library is free software; you can redistribute it and/or</span>
<a name="l00007"></a>00007 <span class="comment">  modify it under the terms of the GNU Library General Public</span>
<a name="l00008"></a>00008 <span class="comment">  License as published by the Free Software Foundation; either</span>
<a name="l00009"></a>00009 <span class="comment">  version 2 of the License, or (at your option) any later version.</span>
<a name="l00010"></a>00010 <span class="comment"></span>
<a name="l00011"></a>00011 <span class="comment">  This library is distributed in the hope that it will be useful,</span>
<a name="l00012"></a>00012 <span class="comment">  but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00013"></a>00013 <span class="comment">  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00014"></a>00014 <span class="comment">  Library General Public License for more details.</span>
<a name="l00015"></a>00015 <span class="comment"></span>
<a name="l00016"></a>00016 <span class="comment">  You should have received a copy of the GNU Library General Public License</span>
<a name="l00017"></a>00017 <span class="comment">  along with this library; see the file COPYING.LIB.  If not, write to</span>
<a name="l00018"></a>00018 <span class="comment">  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span>
<a name="l00019"></a>00019 <span class="comment">  Boston, MA 02110-1301, USA.</span>
<a name="l00020"></a>00020 <span class="comment">*/</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;config.h&gt;</span>
<a name="l00023"></a>00023 
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;ctype.h&gt;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#ifdef HAVE_SYS_MMAN_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/mman.h&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/types.h&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#ifdef HAVE_SYS_STAT_H</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/stat.h&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#endif</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include &lt;fcntl.h&gt;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;signal.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;setjmp.h&gt;</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="preprocessor">#include &lt;qdir.h&gt;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;qfileinfo.h&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;qtextcodec.h&gt;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;qtextstream.h&gt;</span>
<a name="l00041"></a>00041 
<a name="l00042"></a>00042 <span class="preprocessor">#include &quot;kconfigbackend.h&quot;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &quot;kconfigbase.h&quot;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &lt;kapplication.h&gt;</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include &lt;kglobal.h&gt;</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include &lt;kprocess.h&gt;</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include &lt;<a class="code" href="klocale_8h.html">klocale.h</a>&gt;</span>
<a name="l00048"></a>00048 <span class="preprocessor">#include &lt;kstandarddirs.h&gt;</span>
<a name="l00049"></a>00049 <span class="preprocessor">#include &lt;ksavefile.h&gt;</span>
<a name="l00050"></a>00050 <span class="preprocessor">#include &lt;kurl.h&gt;</span>
<a name="l00051"></a>00051 <span class="preprocessor">#include &lt;kde_file.h&gt;</span>
<a name="l00052"></a>00052 
<a name="l00053"></a>00053 <span class="keyword">extern</span> <span class="keywordtype">bool</span> <a class="code" href="classKGlobal.html#ab9c56417bdaa9cbb6e5b6d908455f915">checkAccess</a>(<span class="keyword">const</span> <a class="codeRef" href="qstring.html">QString</a>&amp; pathname, <span class="keywordtype">int</span> mode);
<a name="l00054"></a>00054 <span class="comment">/* translate escaped escape sequences to their actual values. */</span>
<a name="l00055"></a>00055 <span class="keyword">static</span> <a class="codeRef" href="qcstring.html">QCString</a> printableToString(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keywordtype">int</span> l)
<a name="l00056"></a>00056 {
<a name="l00057"></a>00057   <span class="comment">// Strip leading white-space.</span>
<a name="l00058"></a>00058   <span class="keywordflow">while</span>((l&gt;0) &amp;&amp;
<a name="l00059"></a>00059         ((*str == <span class="charliteral">&#39; &#39;</span>) || (*str == <span class="charliteral">&#39;\t&#39;</span>) || (*str == <span class="charliteral">&#39;\r&#39;</span>)))
<a name="l00060"></a>00060   {
<a name="l00061"></a>00061      str++; l--;
<a name="l00062"></a>00062   }
<a name="l00063"></a>00063 
<a name="l00064"></a>00064   <span class="comment">// Strip trailing white-space.</span>
<a name="l00065"></a>00065   <span class="keywordflow">while</span>((l&gt;0) &amp;&amp;
<a name="l00066"></a>00066         ((str[l-1] == <span class="charliteral">&#39; &#39;</span>) || (str[l-1] == <span class="charliteral">&#39;\t&#39;</span>) || (str[l-1] == <span class="charliteral">&#39;\r&#39;</span>)))
<a name="l00067"></a>00067   {
<a name="l00068"></a>00068      l--;
<a name="l00069"></a>00069   }
<a name="l00070"></a>00070 
<a name="l00071"></a>00071   <a class="codeRef" href="qcstring.html">QCString</a> result(l + 1);
<a name="l00072"></a>00072   <span class="keywordtype">char</span> *r = result.data();
<a name="l00073"></a>00073 
<a name="l00074"></a>00074   <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i &lt; l;i++, str++)
<a name="l00075"></a>00075   {
<a name="l00076"></a>00076      <span class="keywordflow">if</span> (*str == <span class="charliteral">&#39;\\&#39;</span>)
<a name="l00077"></a>00077      {
<a name="l00078"></a>00078         i++, str++;
<a name="l00079"></a>00079         <span class="keywordflow">if</span> (i &gt;= l) <span class="comment">// End of line. (Line ends with single slash)</span>
<a name="l00080"></a>00080         {
<a name="l00081"></a>00081            *r++ = <span class="charliteral">&#39;\\&#39;</span>;
<a name="l00082"></a>00082            <span class="keywordflow">break</span>;
<a name="l00083"></a>00083         }
<a name="l00084"></a>00084         <span class="keywordflow">switch</span>(*str)
<a name="l00085"></a>00085         {
<a name="l00086"></a>00086            <span class="keywordflow">case</span> <span class="charliteral">&#39;s&#39;</span>:
<a name="l00087"></a>00087               *r++ = <span class="charliteral">&#39; &#39;</span>;
<a name="l00088"></a>00088               <span class="keywordflow">break</span>;
<a name="l00089"></a>00089            <span class="keywordflow">case</span> <span class="charliteral">&#39;t&#39;</span>:
<a name="l00090"></a>00090               *r++ = <span class="charliteral">&#39;\t&#39;</span>;
<a name="l00091"></a>00091               <span class="keywordflow">break</span>;
<a name="l00092"></a>00092            <span class="keywordflow">case</span> <span class="charliteral">&#39;n&#39;</span>:
<a name="l00093"></a>00093               *r++ = <span class="charliteral">&#39;\n&#39;</span>;
<a name="l00094"></a>00094               <span class="keywordflow">break</span>;
<a name="l00095"></a>00095            <span class="keywordflow">case</span> <span class="charliteral">&#39;r&#39;</span>:
<a name="l00096"></a>00096               *r++ = <span class="charliteral">&#39;\r&#39;</span>;
<a name="l00097"></a>00097               <span class="keywordflow">break</span>;
<a name="l00098"></a>00098            <span class="keywordflow">case</span> <span class="charliteral">&#39;\\&#39;</span>:
<a name="l00099"></a>00099               *r++ = <span class="charliteral">&#39;\\&#39;</span>;
<a name="l00100"></a>00100               <span class="keywordflow">break</span>;
<a name="l00101"></a>00101            <span class="keywordflow">default</span>:
<a name="l00102"></a>00102               *r++ = <span class="charliteral">&#39;\\&#39;</span>;
<a name="l00103"></a>00103               *r++ = *str;
<a name="l00104"></a>00104         }
<a name="l00105"></a>00105      }
<a name="l00106"></a>00106      <span class="keywordflow">else</span>
<a name="l00107"></a>00107      {
<a name="l00108"></a>00108         *r++ = *str;
<a name="l00109"></a>00109      }
<a name="l00110"></a>00110   }
<a name="l00111"></a>00111   result.truncate(r-result.data());
<a name="l00112"></a>00112   <span class="keywordflow">return</span> result;
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114 
<a name="l00115"></a>00115 <span class="keyword">static</span> <a class="codeRef" href="qcstring.html">QCString</a> stringToPrintable(<span class="keyword">const</span> <a class="codeRef" href="qcstring.html">QCString</a>&amp; str){
<a name="l00116"></a>00116   <a class="codeRef" href="qcstring.html">QCString</a> result(str.<a class="codeRef" href="qcstring.html#length">length</a>()*2); <span class="comment">// Maximum 2x as long as source string</span>
<a name="l00117"></a>00117   <span class="keyword">register</span> <span class="keywordtype">char</span> *r = result.data();
<a name="l00118"></a>00118   <span class="keyword">register</span> <span class="keywordtype">char</span> *s = str.data();
<a name="l00119"></a>00119 
<a name="l00120"></a>00120   <span class="keywordflow">if</span> (!s) <span class="keywordflow">return</span> <a class="codeRef" href="qcstring.html">QCString</a>(<span class="stringliteral">&quot;&quot;</span>);
<a name="l00121"></a>00121 
<a name="l00122"></a>00122   <span class="comment">// Escape leading space</span>
<a name="l00123"></a>00123   <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39; &#39;</span>)
<a name="l00124"></a>00124   {
<a name="l00125"></a>00125      *r++ = <span class="charliteral">&#39;\\&#39;</span>; *r++ = <span class="charliteral">&#39;s&#39;</span>;
<a name="l00126"></a>00126      s++;
<a name="l00127"></a>00127   }
<a name="l00128"></a>00128 
<a name="l00129"></a>00129   <span class="keywordflow">if</span> (*s)
<a name="l00130"></a>00130   {
<a name="l00131"></a>00131    <span class="keywordflow">while</span>(*s)
<a name="l00132"></a>00132    {
<a name="l00133"></a>00133     <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;\n&#39;</span>)
<a name="l00134"></a>00134     {
<a name="l00135"></a>00135       *r++ = <span class="charliteral">&#39;\\&#39;</span>; *r++ = <span class="charliteral">&#39;n&#39;</span>;
<a name="l00136"></a>00136     }
<a name="l00137"></a>00137     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;\t&#39;</span>)
<a name="l00138"></a>00138     {
<a name="l00139"></a>00139       *r++ = <span class="charliteral">&#39;\\&#39;</span>; *r++ = <span class="charliteral">&#39;t&#39;</span>;
<a name="l00140"></a>00140     }
<a name="l00141"></a>00141     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;\r&#39;</span>)
<a name="l00142"></a>00142     {
<a name="l00143"></a>00143       *r++ = <span class="charliteral">&#39;\\&#39;</span>; *r++ = <span class="charliteral">&#39;r&#39;</span>;
<a name="l00144"></a>00144     }
<a name="l00145"></a>00145     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;\\&#39;</span>)
<a name="l00146"></a>00146     {
<a name="l00147"></a>00147       *r++ = <span class="charliteral">&#39;\\&#39;</span>; *r++ = <span class="charliteral">&#39;\\&#39;</span>;
<a name="l00148"></a>00148     }
<a name="l00149"></a>00149     <span class="keywordflow">else</span>
<a name="l00150"></a>00150     {
<a name="l00151"></a>00151       *r++ = *s;
<a name="l00152"></a>00152     }
<a name="l00153"></a>00153     s++;
<a name="l00154"></a>00154    }
<a name="l00155"></a>00155    <span class="comment">// Escape trailing space</span>
<a name="l00156"></a>00156    <span class="keywordflow">if</span> (*(r-1) == <span class="charliteral">&#39; &#39;</span>)
<a name="l00157"></a>00157    {
<a name="l00158"></a>00158       *(r-1) = <span class="charliteral">&#39;\\&#39;</span>; *r++ = <span class="charliteral">&#39;s&#39;</span>;
<a name="l00159"></a>00159    }
<a name="l00160"></a>00160   }
<a name="l00161"></a>00161 
<a name="l00162"></a>00162   result.truncate(r - result.data());
<a name="l00163"></a>00163   <span class="keywordflow">return</span> result;
<a name="l00164"></a>00164 }
<a name="l00165"></a>00165 
<a name="l00166"></a>00166 <span class="keyword">static</span> <a class="codeRef" href="qcstring.html">QCString</a> decodeGroup(<span class="keyword">const</span> <span class="keywordtype">char</span>*s, <span class="keywordtype">int</span> l)
<a name="l00167"></a>00167 {
<a name="l00168"></a>00168   <a class="codeRef" href="qcstring.html">QCString</a> result(l);
<a name="l00169"></a>00169   <span class="keyword">register</span> <span class="keywordtype">char</span> *r = result.data();
<a name="l00170"></a>00170 
<a name="l00171"></a>00171   l--; <span class="comment">// Correct for trailing \0</span>
<a name="l00172"></a>00172   <span class="keywordflow">while</span>(l)
<a name="l00173"></a>00173   {
<a name="l00174"></a>00174     <span class="keywordflow">if</span> ((*s == <span class="charliteral">&#39;[&#39;</span>) &amp;&amp; (l &gt; 1))
<a name="l00175"></a>00175     {
<a name="l00176"></a>00176        <span class="keywordflow">if</span> ((*(s+1) == <span class="charliteral">&#39;[&#39;</span>))
<a name="l00177"></a>00177        {
<a name="l00178"></a>00178           l--;
<a name="l00179"></a>00179           s++;
<a name="l00180"></a>00180        }
<a name="l00181"></a>00181     }
<a name="l00182"></a>00182     <span class="keywordflow">if</span> ((*s == <span class="charliteral">&#39;]&#39;</span>) &amp;&amp; (l &gt; 1))
<a name="l00183"></a>00183     {
<a name="l00184"></a>00184        <span class="keywordflow">if</span> ((*(s+1) == <span class="charliteral">&#39;]&#39;</span>))
<a name="l00185"></a>00185        {
<a name="l00186"></a>00186           l--;
<a name="l00187"></a>00187           s++;
<a name="l00188"></a>00188        }
<a name="l00189"></a>00189     }
<a name="l00190"></a>00190     *r++ = *s++;
<a name="l00191"></a>00191     l--;
<a name="l00192"></a>00192   }
<a name="l00193"></a>00193   result.truncate(r - result.data());
<a name="l00194"></a>00194   <span class="keywordflow">return</span> result;
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196 
<a name="l00197"></a>00197 <span class="keyword">static</span> <a class="codeRef" href="qcstring.html">QCString</a> encodeGroup(<span class="keyword">const</span> <a class="codeRef" href="qcstring.html">QCString</a> &amp;str)
<a name="l00198"></a>00198 {
<a name="l00199"></a>00199   <span class="keywordtype">int</span> l = str.<a class="codeRef" href="qcstring.html#length">length</a>();
<a name="l00200"></a>00200   <a class="codeRef" href="qcstring.html">QCString</a> result(l*2+1);
<a name="l00201"></a>00201   <span class="keyword">register</span> <span class="keywordtype">char</span> *r = result.data();
<a name="l00202"></a>00202   <span class="keyword">register</span> <span class="keywordtype">char</span> *s = str.data();
<a name="l00203"></a>00203   <span class="keywordflow">while</span>(l)
<a name="l00204"></a>00204   {
<a name="l00205"></a>00205     <span class="keywordflow">if</span> ((*s == <span class="charliteral">&#39;[&#39;</span>) || (*s == <span class="charliteral">&#39;]&#39;</span>))
<a name="l00206"></a>00206        *r++ = *s;
<a name="l00207"></a>00207     *r++ = *s++;
<a name="l00208"></a>00208     l--;
<a name="l00209"></a>00209   }
<a name="l00210"></a>00210   result.<a class="codeRef" href="qcstring.html#truncate">truncate</a>(r - result.data());
<a name="l00211"></a>00211   <span class="keywordflow">return</span> result;
<a name="l00212"></a>00212 }
<a name="l00213"></a>00213 
<a name="l00214"></a>00214 <span class="keyword">static</span> <a class="codeRef" href="qcstring.html">QCString</a> encodeKey(<span class="keyword">const</span> <span class="keywordtype">char</span>* key)
<a name="l00215"></a>00215 {
<a name="l00216"></a>00216     <a class="codeRef" href="qcstring.html">QCString</a> newKey(key);
<a name="l00217"></a>00217 
<a name="l00218"></a>00218     newKey.replace(<span class="charliteral">&#39;[&#39;</span>, <span class="stringliteral">&quot;%5b&quot;</span>);
<a name="l00219"></a>00219     newKey.replace(<span class="charliteral">&#39;]&#39;</span>, <span class="stringliteral">&quot;%5d&quot;</span>);
<a name="l00220"></a>00220 
<a name="l00221"></a>00221     <span class="keywordflow">return</span> newKey;
<a name="l00222"></a>00222 }
<a name="l00223"></a>00223 
<a name="l00224"></a>00224 <span class="keyword">static</span> <a class="codeRef" href="qcstring.html">QCString</a> decodeKey(<span class="keyword">const</span> <span class="keywordtype">char</span>* key)
<a name="l00225"></a>00225 {
<a name="l00226"></a>00226     <a class="codeRef" href="qcstring.html">QCString</a> newKey(key);
<a name="l00227"></a>00227 
<a name="l00228"></a>00228     newKey.replace(<span class="stringliteral">&quot;%5b&quot;</span>, <span class="stringliteral">&quot;[&quot;</span>);
<a name="l00229"></a>00229     newKey.replace(<span class="stringliteral">&quot;%5d&quot;</span>, <span class="stringliteral">&quot;]&quot;</span>);
<a name="l00230"></a>00230 
<a name="l00231"></a>00231     <span class="keywordflow">return</span> newKey;
<a name="l00232"></a>00232 }
<a name="l00233"></a>00233 
<a name="l00234"></a>00234 <span class="keyword">class </span>KConfigBackEnd::KConfigBackEndPrivate
<a name="l00235"></a>00235 {
<a name="l00236"></a>00236 <span class="keyword">public</span>:
<a name="l00237"></a>00237    <a class="codeRef" href="qdatetime.html">QDateTime</a> localLastModified;
<a name="l00238"></a>00238    uint      localLastSize;
<a name="l00239"></a>00239    <a class="code" href="classKSharedPtr.html">KLockFile::Ptr</a> localLockFile;
<a name="l00240"></a>00240    <a class="code" href="classKSharedPtr.html">KLockFile::Ptr</a> globalLockFile;
<a name="l00241"></a>00241 };
<a name="l00242"></a>00242 
<a name="l00243"></a><a class="code" href="classKConfigBackEnd.html#a867e9fe0ee7bb1cf9e33a5dc838dd29c">00243</a> <span class="keywordtype">void</span> <a class="code" href="classKConfigBackEnd.html#a867e9fe0ee7bb1cf9e33a5dc838dd29c" title="Changes the filenames associated with this back end.">KConfigBackEnd::changeFileName</a>(<span class="keyword">const</span> <a class="codeRef" href="qstring.html">QString</a> &amp;_fileName,
<a name="l00244"></a>00244                                     <span class="keyword">const</span> <span class="keywordtype">char</span> * _resType,
<a name="l00245"></a>00245                                     <span class="keywordtype">bool</span> _useKDEGlobals)
<a name="l00246"></a>00246 {
<a name="l00247"></a>00247    mfileName = _fileName;
<a name="l00248"></a>00248    resType = _resType;
<a name="l00249"></a>00249    useKDEGlobals = _useKDEGlobals;
<a name="l00250"></a>00250    <span class="keywordflow">if</span> (mfileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>())
<a name="l00251"></a>00251       mLocalFileName = QString::null;
<a name="l00252"></a>00252    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="codeRef" href="qdir.html#isRelativePath">QDir::isRelativePath</a>(mfileName))
<a name="l00253"></a>00253       mLocalFileName = mfileName;
<a name="l00254"></a>00254    <span class="keywordflow">else</span>
<a name="l00255"></a>00255       mLocalFileName = <a class="code" href="classKGlobal.html#a431d05bf9a252475846c89769fbff8c1" title="Returns the application standard dirs object.">KGlobal::dirs</a>()-&gt;<a class="code" href="classKStandardDirs.html#ac0f4d29ad29c1db30b2984d078e18fdc" title="Finds a location to save files into for the given type in the user&#39;s home directory.">saveLocation</a>(resType) + mfileName;
<a name="l00256"></a>00256 
<a name="l00257"></a>00257    <span class="keywordflow">if</span> (useKDEGlobals)
<a name="l00258"></a>00258       mGlobalFileName = <a class="code" href="classKGlobal.html#a431d05bf9a252475846c89769fbff8c1" title="Returns the application standard dirs object.">KGlobal::dirs</a>()-&gt;<a class="code" href="classKStandardDirs.html#ac0f4d29ad29c1db30b2984d078e18fdc" title="Finds a location to save files into for the given type in the user&#39;s home directory.">saveLocation</a>(<span class="stringliteral">&quot;config&quot;</span>) +
<a name="l00259"></a>00259           <a class="codeRef" href="qstring.html#fromLatin1">QString::fromLatin1</a>(<span class="stringliteral">&quot;kdeglobals&quot;</span>);
<a name="l00260"></a>00260    <span class="keywordflow">else</span>
<a name="l00261"></a>00261       mGlobalFileName = QString::null;
<a name="l00262"></a>00262 
<a name="l00263"></a>00263    d-&gt;localLastModified = <a class="codeRef" href="qdatetime.html">QDateTime</a>();
<a name="l00264"></a>00264    d-&gt;localLastSize = 0;
<a name="l00265"></a>00265    d-&gt;localLockFile = 0;
<a name="l00266"></a>00266    d-&gt;globalLockFile = 0;
<a name="l00267"></a>00267 }
<a name="l00268"></a>00268 
<a name="l00269"></a><a class="code" href="classKConfigBackEnd.html#a239ce116492474e28fa7fbb2cf3c9b4c">00269</a> <a class="code" href="classKSharedPtr.html">KLockFile::Ptr</a> <a class="code" href="classKConfigBackEnd.html#a239ce116492474e28fa7fbb2cf3c9b4c" title="Returns a lock file object for the configuration file.">KConfigBackEnd::lockFile</a>(<span class="keywordtype">bool</span> bGlobal)
<a name="l00270"></a>00270 {
<a name="l00271"></a>00271    <span class="keywordflow">if</span> (bGlobal)
<a name="l00272"></a>00272    {
<a name="l00273"></a>00273       <span class="keywordflow">if</span> (d-&gt;globalLockFile)
<a name="l00274"></a>00274          <span class="keywordflow">return</span> d-&gt;globalLockFile;
<a name="l00275"></a>00275       
<a name="l00276"></a>00276       <span class="keywordflow">if</span> (!mGlobalFileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>())
<a name="l00277"></a>00277       {
<a name="l00278"></a>00278          d-&gt;globalLockFile = <span class="keyword">new</span> <a class="code" href="classKLockFile.html" title="The KLockFile class provides NFS safe lockfiles.">KLockFile</a>(mGlobalFileName+<span class="stringliteral">&quot;.lock&quot;</span>);
<a name="l00279"></a>00279          <span class="keywordflow">return</span> d-&gt;globalLockFile;
<a name="l00280"></a>00280       }
<a name="l00281"></a>00281    }
<a name="l00282"></a>00282    <span class="keywordflow">else</span>
<a name="l00283"></a>00283    {
<a name="l00284"></a>00284       <span class="keywordflow">if</span> (d-&gt;localLockFile)
<a name="l00285"></a>00285          <span class="keywordflow">return</span> d-&gt;localLockFile;
<a name="l00286"></a>00286       
<a name="l00287"></a>00287       <span class="keywordflow">if</span> (!mLocalFileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>())
<a name="l00288"></a>00288       {
<a name="l00289"></a>00289          d-&gt;localLockFile = <span class="keyword">new</span> <a class="code" href="classKLockFile.html" title="The KLockFile class provides NFS safe lockfiles.">KLockFile</a>(mLocalFileName+<span class="stringliteral">&quot;.lock&quot;</span>);
<a name="l00290"></a>00290          <span class="keywordflow">return</span> d-&gt;localLockFile;
<a name="l00291"></a>00291       }
<a name="l00292"></a>00292    }
<a name="l00293"></a>00293    <span class="keywordflow">return</span> 0;
<a name="l00294"></a>00294 }
<a name="l00295"></a>00295 
<a name="l00296"></a><a class="code" href="classKConfigBackEnd.html#a2a506a98fa707325b3452b28d1884594">00296</a> <a class="code" href="classKConfigBackEnd.html#a2a506a98fa707325b3452b28d1884594" title="Constructs a configuration back end.">KConfigBackEnd::KConfigBackEnd</a>(<a class="code" href="classKConfigBase.html" title="KDE Configuration Management abstract base class.">KConfigBase</a> *_config,
<a name="l00297"></a>00297                    <span class="keyword">const</span> <a class="codeRef" href="qstring.html">QString</a> &amp;_fileName,
<a name="l00298"></a>00298                    <span class="keyword">const</span> <span class="keywordtype">char</span> * _resType,
<a name="l00299"></a>00299                    <span class="keywordtype">bool</span> _useKDEGlobals)
<a name="l00300"></a>00300   : pConfig(_config), bFileImmutable(false), mConfigState(<a class="code" href="classKConfigBase.html" title="KDE Configuration Management abstract base class.">KConfigBase</a>::NoAccess), mFileMode(-1)
<a name="l00301"></a>00301 {
<a name="l00302"></a>00302    d = <span class="keyword">new</span> KConfigBackEndPrivate;
<a name="l00303"></a>00303    <a class="code" href="classKConfigBackEnd.html#a867e9fe0ee7bb1cf9e33a5dc838dd29c" title="Changes the filenames associated with this back end.">changeFileName</a>(_fileName, _resType, _useKDEGlobals);
<a name="l00304"></a>00304 }
<a name="l00305"></a>00305 
<a name="l00306"></a><a class="code" href="classKConfigBackEnd.html#a03c1f04f6caafb0e073d48d7343715e0">00306</a> <a class="code" href="classKConfigBackEnd.html#a03c1f04f6caafb0e073d48d7343715e0" title="Destructs the configuration backend.">KConfigBackEnd::~KConfigBackEnd</a>()
<a name="l00307"></a>00307 {
<a name="l00308"></a>00308    <span class="keyword">delete</span> d;
<a name="l00309"></a>00309 }
<a name="l00310"></a>00310 
<a name="l00311"></a><a class="code" href="classKConfigBackEnd.html#ad7f1fc251b512137536de4be89d08905">00311</a> <span class="keywordtype">void</span> <a class="code" href="classKConfigBackEnd.html#ad7f1fc251b512137536de4be89d08905" title="Set the file mode for newly created files.">KConfigBackEnd::setFileWriteMode</a>(<span class="keywordtype">int</span> mode)
<a name="l00312"></a>00312 {
<a name="l00313"></a>00313   mFileMode = mode;
<a name="l00314"></a>00314 }
<a name="l00315"></a>00315 
<a name="l00316"></a><a class="code" href="classKConfigINIBackEnd.html#af63c8ace52e859bf8fc763eb017a9d16">00316</a> <span class="keywordtype">bool</span> <a class="code" href="classKConfigINIBackEnd.html#af63c8ace52e859bf8fc763eb017a9d16" title="Parses all INI-style configuration files for a config object.">KConfigINIBackEnd::parseConfigFiles</a>()
<a name="l00317"></a>00317 {
<a name="l00318"></a>00318   <span class="comment">// Check if we can write to the local file.</span>
<a name="l00319"></a>00319   mConfigState = KConfigBase::ReadOnly;
<a name="l00320"></a>00320   <span class="keywordflow">if</span> (!mLocalFileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>() &amp;&amp; !pConfig-&gt;<a class="code" href="classKConfigBase.html#ae6b73baec1f7a7dec84292924bc5876b" title="Returns the read-only status of the config object.">isReadOnly</a>())
<a name="l00321"></a>00321   {
<a name="l00322"></a>00322      <span class="keywordflow">if</span> (checkAccess(mLocalFileName, W_OK))
<a name="l00323"></a>00323      {
<a name="l00324"></a>00324         mConfigState = KConfigBase::ReadWrite;
<a name="l00325"></a>00325      }
<a name="l00326"></a>00326      <span class="keywordflow">else</span>
<a name="l00327"></a>00327      {
<a name="l00328"></a>00328         <span class="comment">// Create the containing dir, maybe it wasn&#39;t there</span>
<a name="l00329"></a>00329         <a class="code" href="classKURL.html" title="Represents and parses a URL.">KURL</a> path;
<a name="l00330"></a>00330         path.<a class="code" href="classKURL.html#a6c0a0828b4b9f1126b13380076e2b2f3" title="Sets the decoded path of the URL.">setPath</a>(mLocalFileName);
<a name="l00331"></a>00331         <a class="codeRef" href="qstring.html">QString</a> dir=path.<a class="code" href="classKURL.html#a0ff924855867aa98d0cbb5f3f20f4f87" title="Returns the directory of the path.">directory</a>();
<a name="l00332"></a>00332         <a class="code" href="classKStandardDirs.html#a69a6cdd47b96c5183cdc2eb38d28d543" title="Recursively creates still-missing directories in the given path.">KStandardDirs::makeDir</a>(dir);
<a name="l00333"></a>00333 
<a name="l00334"></a>00334         <span class="keywordflow">if</span> (checkAccess(mLocalFileName, W_OK))
<a name="l00335"></a>00335         {
<a name="l00336"></a>00336            mConfigState = KConfigBase::ReadWrite;
<a name="l00337"></a>00337         }
<a name="l00338"></a>00338      }
<a name="l00339"></a>00339      <a class="codeRef" href="qfileinfo.html">QFileInfo</a> info(mLocalFileName);
<a name="l00340"></a>00340      d-&gt;localLastModified = info.<a class="codeRef" href="qfileinfo.html#lastModified">lastModified</a>();
<a name="l00341"></a>00341      d-&gt;localLastSize = info.<a class="codeRef" href="qfileinfo.html#size">size</a>();
<a name="l00342"></a>00342   }
<a name="l00343"></a>00343 
<a name="l00344"></a>00344   <span class="comment">// Parse all desired files from the least to the most specific.</span>
<a name="l00345"></a>00345   bFileImmutable = <span class="keyword">false</span>;
<a name="l00346"></a>00346 
<a name="l00347"></a>00347   <span class="comment">// Parse the general config files</span>
<a name="l00348"></a>00348   <span class="keywordflow">if</span> (useKDEGlobals) {
<a name="l00349"></a>00349     <a class="codeRef" href="qstringlist.html">QStringList</a> kdercs = <a class="code" href="classKGlobal.html#a431d05bf9a252475846c89769fbff8c1" title="Returns the application standard dirs object.">KGlobal::dirs</a>()-&gt;
<a name="l00350"></a>00350       findAllResources(<span class="stringliteral">&quot;config&quot;</span>, <a class="codeRef" href="qstring.html#fromLatin1">QString::fromLatin1</a>(<span class="stringliteral">&quot;kdeglobals&quot;</span>));
<a name="l00351"></a>00351 
<a name="l00352"></a>00352 <span class="preprocessor">#ifdef Q_WS_WIN</span>
<a name="l00353"></a>00353 <span class="preprocessor"></span>    <a class="codeRef" href="qstring.html">QString</a> etc_kderc = <a class="codeRef" href="qfile.html#decodeName">QFile::decodeName</a>( <a class="codeRef" href="qcstring.html">QCString</a>(getenv(<span class="stringliteral">&quot;WINDIR&quot;</span>)) + <span class="stringliteral">&quot;\\kderc&quot;</span> );
<a name="l00354"></a>00354 <span class="preprocessor">#else</span>
<a name="l00355"></a>00355 <span class="preprocessor"></span>    <a class="codeRef" href="qstring.html">QString</a> etc_kderc = <a class="codeRef" href="qstring.html#fromLatin1">QString::fromLatin1</a>(<span class="stringliteral">&quot;/etc/kderc&quot;</span>);
<a name="l00356"></a>00356 <span class="preprocessor">#endif</span>
<a name="l00357"></a>00357 <span class="preprocessor"></span>
<a name="l00358"></a>00358     <span class="keywordflow">if</span> (checkAccess(etc_kderc, R_OK))
<a name="l00359"></a>00359       kdercs += etc_kderc;
<a name="l00360"></a>00360 
<a name="l00361"></a>00361     kdercs += <a class="code" href="classKGlobal.html#a431d05bf9a252475846c89769fbff8c1" title="Returns the application standard dirs object.">KGlobal::dirs</a>()-&gt;
<a name="l00362"></a>00362       findAllResources(<span class="stringliteral">&quot;config&quot;</span>, <a class="codeRef" href="qstring.html#fromLatin1">QString::fromLatin1</a>(<span class="stringliteral">&quot;system.kdeglobals&quot;</span>));
<a name="l00363"></a>00363 
<a name="l00364"></a>00364     QStringList::ConstIterator it;
<a name="l00365"></a>00365 
<a name="l00366"></a>00366     <span class="keywordflow">for</span> (it = kdercs.fromLast(); it != kdercs.end(); --it) {
<a name="l00367"></a>00367 
<a name="l00368"></a>00368       <a class="codeRef" href="qfile.html">QFile</a> aConfigFile( *it );
<a name="l00369"></a>00369       <span class="keywordflow">if</span> (!aConfigFile.<a class="codeRef" href="qfile.html#open">open</a>( IO_ReadOnly ))
<a name="l00370"></a>00370        <span class="keywordflow">continue</span>;
<a name="l00371"></a>00371       <a class="code" href="classKConfigINIBackEnd.html#a0ada8a31259aca589b8ac973490329d3" title="Parses one configuration file.">parseSingleConfigFile</a>( aConfigFile, 0L, <span class="keyword">true</span>, (*it != mGlobalFileName) );
<a name="l00372"></a>00372       aConfigFile.<a class="codeRef" href="qfile.html#close">close</a>();
<a name="l00373"></a>00373       <span class="keywordflow">if</span> (bFileImmutable)
<a name="l00374"></a>00374          <span class="keywordflow">break</span>;
<a name="l00375"></a>00375     }
<a name="l00376"></a>00376   }
<a name="l00377"></a>00377 
<a name="l00378"></a>00378   <span class="keywordtype">bool</span> bReadFile = !mfileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>();
<a name="l00379"></a>00379   <span class="keywordflow">while</span>(bReadFile) {
<a name="l00380"></a>00380     bReadFile = <span class="keyword">false</span>;
<a name="l00381"></a>00381     <a class="codeRef" href="qstring.html">QString</a> bootLanguage;
<a name="l00382"></a>00382     <span class="keywordflow">if</span> (useKDEGlobals &amp;&amp; localeString.<a class="codeRef" href="qcstring.html#isEmpty">isEmpty</a>() &amp;&amp; !KGlobal::_locale) {
<a name="l00383"></a>00383        <span class="comment">// Boot strap language</span>
<a name="l00384"></a>00384        bootLanguage = KLocale::_initLanguage(pConfig);
<a name="l00385"></a>00385        <a class="code" href="classKConfigBackEnd.html#a55bfa0ed9f2e6c36622b803bcbc791fe" title="Set the locale string that defines the current language.">setLocaleString</a>(bootLanguage.<a class="codeRef" href="qstring.html#utf8">utf8</a>());
<a name="l00386"></a>00386     }
<a name="l00387"></a>00387 
<a name="l00388"></a>00388     bFileImmutable = <span class="keyword">false</span>;
<a name="l00389"></a>00389     <a class="codeRef" href="qstringlist.html">QStringList</a> list;
<a name="l00390"></a>00390     <span class="keywordflow">if</span> ( !<a class="codeRef" href="qdir.html#isRelativePath">QDir::isRelativePath</a>(mfileName) )
<a name="l00391"></a>00391        list &lt;&lt; mfileName;
<a name="l00392"></a>00392     <span class="keywordflow">else</span>
<a name="l00393"></a>00393        list = <a class="code" href="classKGlobal.html#a431d05bf9a252475846c89769fbff8c1" title="Returns the application standard dirs object.">KGlobal::dirs</a>()-&gt;<a class="code" href="classKStandardDirs.html#ae6310facab4e97b2aceb5cf37080c3c0" title="Tries to find all resources with the specified type.">findAllResources</a>(resType, mfileName);
<a name="l00394"></a>00394 
<a name="l00395"></a>00395     QStringList::ConstIterator it;
<a name="l00396"></a>00396 
<a name="l00397"></a>00397     <span class="keywordflow">for</span> (it = list.fromLast(); it != list.end(); --it) {
<a name="l00398"></a>00398 
<a name="l00399"></a>00399       <a class="codeRef" href="qfile.html">QFile</a> aConfigFile( *it );
<a name="l00400"></a>00400       <span class="comment">// we can already be sure that this file exists</span>
<a name="l00401"></a>00401       <span class="keywordtype">bool</span> bIsLocal = (*it == mLocalFileName);
<a name="l00402"></a>00402       <span class="keywordflow">if</span> (aConfigFile.<a class="codeRef" href="qfile.html#open">open</a>( IO_ReadOnly )) {
<a name="l00403"></a>00403          <a class="code" href="classKConfigINIBackEnd.html#a0ada8a31259aca589b8ac973490329d3" title="Parses one configuration file.">parseSingleConfigFile</a>( aConfigFile, 0L, <span class="keyword">false</span>, !bIsLocal );
<a name="l00404"></a>00404          aConfigFile.<a class="codeRef" href="qfile.html#close">close</a>();
<a name="l00405"></a>00405          <span class="keywordflow">if</span> (bFileImmutable)
<a name="l00406"></a>00406             <span class="keywordflow">break</span>;
<a name="l00407"></a>00407       }
<a name="l00408"></a>00408     }
<a name="l00409"></a>00409     <span class="keywordflow">if</span> (<a class="code" href="classKGlobal.html#a431d05bf9a252475846c89769fbff8c1" title="Returns the application standard dirs object.">KGlobal::dirs</a>()-&gt;isRestrictedResource(resType, mfileName))
<a name="l00410"></a>00410        bFileImmutable = <span class="keyword">true</span>;
<a name="l00411"></a>00411     <a class="codeRef" href="qstring.html">QString</a> currentLanguage;
<a name="l00412"></a>00412     <span class="keywordflow">if</span> (!bootLanguage.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>())
<a name="l00413"></a>00413     {
<a name="l00414"></a>00414        currentLanguage = KLocale::_initLanguage(pConfig);
<a name="l00415"></a>00415        <span class="comment">// If the file changed the language, we need to read the file again</span>
<a name="l00416"></a>00416        <span class="comment">// with the new language setting.</span>
<a name="l00417"></a>00417        <span class="keywordflow">if</span> (bootLanguage != currentLanguage)
<a name="l00418"></a>00418        {
<a name="l00419"></a>00419           bReadFile = <span class="keyword">true</span>;
<a name="l00420"></a>00420           <a class="code" href="classKConfigBackEnd.html#a55bfa0ed9f2e6c36622b803bcbc791fe" title="Set the locale string that defines the current language.">setLocaleString</a>(currentLanguage.<a class="codeRef" href="qstring.html#utf8">utf8</a>());
<a name="l00421"></a>00421        }
<a name="l00422"></a>00422     }
<a name="l00423"></a>00423   }
<a name="l00424"></a>00424   <span class="keywordflow">if</span> (bFileImmutable)
<a name="l00425"></a>00425      mConfigState = KConfigBase::ReadOnly;
<a name="l00426"></a>00426 
<a name="l00427"></a>00427   <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00428"></a>00428 }
<a name="l00429"></a>00429 
<a name="l00430"></a>00430 <span class="preprocessor">#ifdef HAVE_MMAP</span>
<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#ifdef SIGBUS</span>
<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="keyword">static</span> sigjmp_buf mmap_jmpbuf;
<a name="l00433"></a>00433 <span class="keyword">struct </span>sigaction mmap_old_sigact;
<a name="l00434"></a>00434 
<a name="l00435"></a>00435 <span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {
<a name="l00436"></a>00436    <span class="keyword">static</span> <span class="keywordtype">void</span> mmap_sigbus_handler(<span class="keywordtype">int</span>)
<a name="l00437"></a>00437    {
<a name="l00438"></a>00438       siglongjmp (mmap_jmpbuf, 1);
<a name="l00439"></a>00439    }
<a name="l00440"></a>00440 }
<a name="l00441"></a>00441 <span class="preprocessor">#endif</span>
<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00443"></a>00443 <span class="preprocessor"></span>
<a name="l00444"></a>00444 <span class="keyword">extern</span> <span class="keywordtype">bool</span> kde_kiosk_exception;
<a name="l00445"></a>00445 
<a name="l00446"></a><a class="code" href="classKConfigINIBackEnd.html#a0ada8a31259aca589b8ac973490329d3">00446</a> <span class="keywordtype">void</span> <a class="code" href="classKConfigINIBackEnd.html#a0ada8a31259aca589b8ac973490329d3" title="Parses one configuration file.">KConfigINIBackEnd::parseSingleConfigFile</a>(<a class="codeRef" href="qfile.html">QFile</a> &amp;rFile,
<a name="l00447"></a>00447                           <a class="code" href="structKEntry.html#a7e47f8d4ccee5d45b4b5a23e8a1c08d6">KEntryMap</a> *pWriteBackMap,
<a name="l00448"></a>00448                           <span class="keywordtype">bool</span> bGlobal, <span class="keywordtype">bool</span> bDefault)
<a name="l00449"></a>00449 {
<a name="l00450"></a>00450    <span class="keyword">const</span> <span class="keywordtype">char</span> *s; <span class="comment">// May get clobbered by sigsetjump, but we don&#39;t use them afterwards.</span>
<a name="l00451"></a>00451    <span class="keyword">const</span> <span class="keywordtype">char</span> *eof; <span class="comment">// May get clobbered by sigsetjump, but we don&#39;t use them afterwards.</span>
<a name="l00452"></a>00452    <a class="codeRef" href="qbytearray.html">QByteArray</a> data;
<a name="l00453"></a>00453 
<a name="l00454"></a>00454    <span class="keywordflow">if</span> (!rFile.isOpen()) <span class="comment">// come back, if you have real work for us ;-&gt;</span>
<a name="l00455"></a>00455       <span class="keywordflow">return</span>;
<a name="l00456"></a>00456 
<a name="l00457"></a>00457    <span class="comment">//using kdDebug() here leads to an infinite loop</span>
<a name="l00458"></a>00458    <span class="comment">//remove this for the release, aleXXX</span>
<a name="l00459"></a>00459    <span class="comment">//qWarning(&quot;Parsing %s, global = %s default = %s&quot;,</span>
<a name="l00460"></a>00460    <span class="comment">//           rFile.name().latin1(), bGlobal ? &quot;true&quot; : &quot;false&quot;, bDefault ? &quot;true&quot; : &quot;false&quot;);</span>
<a name="l00461"></a>00461 
<a name="l00462"></a>00462    <a class="codeRef" href="qcstring.html">QCString</a> aCurrentGroup(<span class="stringliteral">&quot;&lt;default&gt;&quot;</span>);
<a name="l00463"></a>00463 
<a name="l00464"></a>00464    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ll = localeString.<a class="codeRef" href="qcstring.html#length">length</a>();
<a name="l00465"></a>00465 
<a name="l00466"></a>00466 <span class="preprocessor">#ifdef HAVE_MMAP</span>
<a name="l00467"></a>00467 <span class="preprocessor"></span>   <span class="keyword">static</span> <span class="keyword">volatile</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *map;
<a name="l00468"></a>00468    map = ( <span class="keyword">const</span> <span class="keywordtype">char</span>* ) mmap(0, rFile.<a class="codeRef" href="qfile.html#size">size</a>(), PROT_READ, MAP_PRIVATE,
<a name="l00469"></a>00469                                           rFile.<a class="codeRef" href="qfile.html#handle">handle</a>(), 0);
<a name="l00470"></a>00470 
<a name="l00471"></a>00471    <span class="keywordflow">if</span> ( map != MAP_FAILED )
<a name="l00472"></a>00472    {
<a name="l00473"></a>00473       s = (<span class="keyword">const</span> <span class="keywordtype">char</span>*) map;
<a name="l00474"></a>00474       eof = s + rFile.<a class="codeRef" href="qfile.html#size">size</a>();
<a name="l00475"></a>00475 
<a name="l00476"></a>00476 <span class="preprocessor">#ifdef SIGBUS</span>
<a name="l00477"></a>00477 <span class="preprocessor"></span>      <span class="keyword">struct </span>sigaction act;
<a name="l00478"></a>00478       act.sa_handler = mmap_sigbus_handler;
<a name="l00479"></a>00479       sigemptyset( &amp;act.sa_mask );
<a name="l00480"></a>00480 <span class="preprocessor">#ifdef SA_ONESHOT</span>
<a name="l00481"></a>00481 <span class="preprocessor"></span>      act.sa_flags = SA_ONESHOT;
<a name="l00482"></a>00482 <span class="preprocessor">#else</span>
<a name="l00483"></a>00483 <span class="preprocessor"></span>      act.sa_flags = SA_RESETHAND;
<a name="l00484"></a>00484 <span class="preprocessor">#endif      </span>
<a name="l00485"></a>00485 <span class="preprocessor"></span>      sigaction( SIGBUS, &amp;act, &amp;mmap_old_sigact );
<a name="l00486"></a>00486 
<a name="l00487"></a>00487       <span class="keywordflow">if</span> (sigsetjmp (mmap_jmpbuf, 1))
<a name="l00488"></a>00488       {
<a name="l00489"></a>00489 qWarning(<span class="stringliteral">&quot;SIGBUS while reading %s&quot;</span>, rFile.<a class="codeRef" href="qfile.html#name">name</a>().latin1());
<a name="l00490"></a>00490          munmap(( <span class="keywordtype">char</span>* )map, rFile.<a class="codeRef" href="qfile.html#size">size</a>());
<a name="l00491"></a>00491          sigaction (SIGBUS, &amp;mmap_old_sigact, 0);
<a name="l00492"></a>00492          <span class="keywordflow">return</span>;
<a name="l00493"></a>00493       }
<a name="l00494"></a>00494 <span class="preprocessor">#endif</span>
<a name="l00495"></a>00495 <span class="preprocessor"></span>   }
<a name="l00496"></a>00496    <span class="keywordflow">else</span>
<a name="l00497"></a>00497 <span class="preprocessor">#endif</span>
<a name="l00498"></a>00498 <span class="preprocessor"></span>   {
<a name="l00499"></a>00499       rFile.at(0);
<a name="l00500"></a>00500       data = rFile.<a class="codeRef" href="qfile.html#readAll">readAll</a>();
<a name="l00501"></a>00501       s = data.data();
<a name="l00502"></a>00502       eof = s + data.size();
<a name="l00503"></a>00503    }
<a name="l00504"></a>00504 
<a name="l00505"></a>00505    <span class="keywordtype">bool</span> fileOptionImmutable = <span class="keyword">false</span>;
<a name="l00506"></a>00506    <span class="keywordtype">bool</span> groupOptionImmutable = <span class="keyword">false</span>;
<a name="l00507"></a>00507    <span class="keywordtype">bool</span> groupSkip = <span class="keyword">false</span>;
<a name="l00508"></a>00508 
<a name="l00509"></a>00509    <span class="keywordtype">int</span> line = 0;
<a name="l00510"></a>00510    <span class="keywordflow">for</span>(; s &lt; eof; s++)
<a name="l00511"></a>00511    {
<a name="l00512"></a>00512       line++;
<a name="l00513"></a>00513 
<a name="l00514"></a>00514       <span class="keywordflow">while</span>((s &lt; eof) &amp;&amp; isspace(*s) &amp;&amp; (*s != <span class="charliteral">&#39;\n&#39;</span>))
<a name="l00515"></a>00515          s++; <span class="comment">//skip leading whitespace, shouldn&#39;t happen too often</span>
<a name="l00516"></a>00516 
<a name="l00517"></a>00517       <span class="comment">//skip empty lines, lines starting with #</span>
<a name="l00518"></a>00518       <span class="keywordflow">if</span> ((s &lt; eof) &amp;&amp; ((*s == <span class="charliteral">&#39;\n&#39;</span>) || (*s == <span class="charliteral">&#39;#&#39;</span>)))
<a name="l00519"></a>00519       {
<a name="l00520"></a>00520     sktoeol:    <span class="comment">//skip till end-of-line</span>
<a name="l00521"></a>00521          <span class="keywordflow">while</span> ((s &lt; eof) &amp;&amp; (*s != <span class="charliteral">&#39;\n&#39;</span>))
<a name="l00522"></a>00522             s++;
<a name="l00523"></a>00523          <span class="keywordflow">continue</span>; <span class="comment">// Empty or comment or no keyword</span>
<a name="l00524"></a>00524       }
<a name="l00525"></a>00525       <span class="keyword">const</span> <span class="keywordtype">char</span> *startLine = s;
<a name="l00526"></a>00526 
<a name="l00527"></a>00527       <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;[&#39;</span>)  <span class="comment">//group</span>
<a name="l00528"></a>00528       {
<a name="l00529"></a>00529          <span class="comment">// In a group [[ and ]] have a special meaning</span>
<a name="l00530"></a>00530          <span class="keywordflow">while</span> ((s &lt; eof) &amp;&amp; (*s != <span class="charliteral">&#39;\n&#39;</span>)) 
<a name="l00531"></a>00531          {
<a name="l00532"></a>00532             <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;]&#39;</span>)
<a name="l00533"></a>00533             {
<a name="l00534"></a>00534                <span class="keywordflow">if</span> ((s+1 &lt; eof) &amp;&amp; (*(s+1) == <span class="charliteral">&#39;]&#39;</span>))
<a name="l00535"></a>00535                   s++; <span class="comment">// Skip &quot;]]&quot;</span>
<a name="l00536"></a>00536                <span class="keywordflow">else</span>
<a name="l00537"></a>00537                   <span class="keywordflow">break</span>;
<a name="l00538"></a>00538             }
<a name="l00539"></a>00539 
<a name="l00540"></a>00540             s++; <span class="comment">// Search till end of group</span>
<a name="l00541"></a>00541          }
<a name="l00542"></a>00542          <span class="keyword">const</span> <span class="keywordtype">char</span> *e = s;
<a name="l00543"></a>00543          <span class="keywordflow">while</span> ((s &lt; eof) &amp;&amp; (*s != <span class="charliteral">&#39;\n&#39;</span>)) s++; <span class="comment">// Search till end of line / end of file</span>
<a name="l00544"></a>00544          <span class="keywordflow">if</span> ((e &gt;= eof) || (*e != <span class="charliteral">&#39;]&#39;</span>))
<a name="l00545"></a>00545          {
<a name="l00546"></a>00546             fprintf(stderr, <span class="stringliteral">&quot;Invalid group header at %s:%d\n&quot;</span>, rFile.<a class="codeRef" href="qfile.html#name">name</a>().latin1(), line);
<a name="l00547"></a>00547             <span class="keywordflow">continue</span>;
<a name="l00548"></a>00548          }
<a name="l00549"></a>00549          <span class="comment">// group found; get the group name by taking everything in</span>
<a name="l00550"></a>00550          <span class="comment">// between the brackets</span>
<a name="l00551"></a>00551          <span class="keywordflow">if</span> ((e-startLine == 3) &amp;&amp;
<a name="l00552"></a>00552              (startLine[1] == <span class="charliteral">&#39;$&#39;</span>) &amp;&amp;
<a name="l00553"></a>00553              (startLine[2] == <span class="charliteral">&#39;i&#39;</span>))
<a name="l00554"></a>00554          {
<a name="l00555"></a>00555             <span class="keywordflow">if</span> (!kde_kiosk_exception)
<a name="l00556"></a>00556                fileOptionImmutable = <span class="keyword">true</span>;
<a name="l00557"></a>00557             <span class="keywordflow">continue</span>;
<a name="l00558"></a>00558          }
<a name="l00559"></a>00559 
<a name="l00560"></a>00560          aCurrentGroup = decodeGroup(startLine + 1, e - startLine);
<a name="l00561"></a>00561          <span class="comment">//cout&lt;&lt;&quot;found group [&quot;&lt;&lt;aCurrentGroup&lt;&lt;&quot;]&quot;&lt;&lt;endl;</span>
<a name="l00562"></a>00562 
<a name="l00563"></a>00563          <span class="comment">// Backwards compatibility</span>
<a name="l00564"></a>00564          <span class="keywordflow">if</span> (aCurrentGroup == <span class="stringliteral">&quot;KDE Desktop Entry&quot;</span>)
<a name="l00565"></a>00565             aCurrentGroup = <span class="stringliteral">&quot;Desktop Entry&quot;</span>;
<a name="l00566"></a>00566 
<a name="l00567"></a>00567          groupOptionImmutable = fileOptionImmutable;
<a name="l00568"></a>00568 
<a name="l00569"></a>00569          e++;
<a name="l00570"></a>00570          <span class="keywordflow">if</span> ((e+2 &lt; eof) &amp;&amp; (*e++ == <span class="charliteral">&#39;[&#39;</span>) &amp;&amp; (*e++ == <span class="charliteral">&#39;$&#39;</span>)) <span class="comment">// Option follows</span>
<a name="l00571"></a>00571          {
<a name="l00572"></a>00572             <span class="keywordflow">if</span> ((*e == <span class="charliteral">&#39;i&#39;</span>) &amp;&amp; !kde_kiosk_exception)
<a name="l00573"></a>00573             {
<a name="l00574"></a>00574                groupOptionImmutable = <span class="keyword">true</span>;
<a name="l00575"></a>00575             }
<a name="l00576"></a>00576          }
<a name="l00577"></a>00577 
<a name="l00578"></a>00578          <a class="code" href="structKEntryKey.html" title="key structure holding both the actual key and the the group to which it belongs.">KEntryKey</a> groupKey(aCurrentGroup, 0);
<a name="l00579"></a>00579          <a class="code" href="structKEntry.html" title="map/dict/list config node entry.">KEntry</a> entry = pConfig-&gt;<a class="code" href="classKConfigBase.html#abfd4d4d755d289b5482b18ab3c5b0f7c" title="Looks up an entry in the config object&#39;s internal structure.">lookupData</a>(groupKey);
<a name="l00580"></a>00580          groupSkip = entry.<a class="code" href="structKEntry.html#a1b391d253964a47eb0944bf149658883" title="Entry can not be modified.">bImmutable</a>;
<a name="l00581"></a>00581 
<a name="l00582"></a>00582          <span class="keywordflow">if</span> (groupSkip &amp;&amp; !bDefault)
<a name="l00583"></a>00583             <span class="keywordflow">continue</span>;
<a name="l00584"></a>00584 
<a name="l00585"></a>00585          entry.<a class="code" href="structKEntry.html#a1b391d253964a47eb0944bf149658883" title="Entry can not be modified.">bImmutable</a> |= groupOptionImmutable;
<a name="l00586"></a>00586          pConfig-&gt;<a class="code" href="classKConfigBase.html#a786003558616440ccbe84c2013b38530" title="Inserts a (key/value) pair into the internal storage mechanism of the configuration object...">putData</a>(groupKey, entry, <span class="keyword">false</span>);
<a name="l00587"></a>00587 
<a name="l00588"></a>00588          <span class="keywordflow">if</span> (pWriteBackMap)
<a name="l00589"></a>00589          {
<a name="l00590"></a>00590             <span class="comment">// add the special group key indicator</span>
<a name="l00591"></a>00591             (*pWriteBackMap)[groupKey] = entry;
<a name="l00592"></a>00592          }
<a name="l00593"></a>00593 
<a name="l00594"></a>00594          <span class="keywordflow">continue</span>;
<a name="l00595"></a>00595       }
<a name="l00596"></a>00596       <span class="keywordflow">if</span> (groupSkip &amp;&amp; !bDefault)
<a name="l00597"></a>00597         <span class="keywordflow">goto</span> sktoeol; <span class="comment">// Skip entry</span>
<a name="l00598"></a>00598 
<a name="l00599"></a>00599       <span class="keywordtype">bool</span> optionImmutable = groupOptionImmutable;
<a name="l00600"></a>00600       <span class="keywordtype">bool</span> optionDeleted = <span class="keyword">false</span>;
<a name="l00601"></a>00601       <span class="keywordtype">bool</span> optionExpand = <span class="keyword">false</span>;
<a name="l00602"></a>00602       <span class="keyword">const</span> <span class="keywordtype">char</span> *endOfKey = 0, *locale = 0, *elocale = 0;
<a name="l00603"></a>00603       <span class="keywordflow">for</span> (; (s &lt; eof) &amp;&amp; (*s != <span class="charliteral">&#39;\n&#39;</span>); s++)
<a name="l00604"></a>00604       {
<a name="l00605"></a>00605          <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;=&#39;</span>) <span class="comment">//find the equal sign</span>
<a name="l00606"></a>00606          {
<a name="l00607"></a>00607         <span class="keywordflow">if</span> (!endOfKey)
<a name="l00608"></a>00608             endOfKey = s;
<a name="l00609"></a>00609             <span class="keywordflow">goto</span> haveeq;
<a name="l00610"></a>00610      }
<a name="l00611"></a>00611      <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;[&#39;</span>) <span class="comment">//find the locale or options.</span>
<a name="l00612"></a>00612      {
<a name="l00613"></a>00613             <span class="keyword">const</span> <span class="keywordtype">char</span> *option;
<a name="l00614"></a>00614             <span class="keyword">const</span> <span class="keywordtype">char</span> *eoption;
<a name="l00615"></a>00615         endOfKey = s;
<a name="l00616"></a>00616         option = ++s;
<a name="l00617"></a>00617         <span class="keywordflow">for</span> (;; s++)
<a name="l00618"></a>00618         {
<a name="l00619"></a>00619         <span class="keywordflow">if</span> ((s &gt;= eof) || (*s == <span class="charliteral">&#39;\n&#39;</span>) || (*s == <span class="charliteral">&#39;=&#39;</span>)) {
<a name="l00620"></a>00620             fprintf(stderr, <span class="stringliteral">&quot;Invalid entry (missing &#39;]&#39;) at %s:%d\n&quot;</span>, rFile.<a class="codeRef" href="qfile.html#name">name</a>().latin1(), line);
<a name="l00621"></a>00621             <span class="keywordflow">goto</span> sktoeol;
<a name="l00622"></a>00622         }
<a name="l00623"></a>00623         <span class="keywordflow">if</span> (*s == <span class="charliteral">&#39;]&#39;</span>)
<a name="l00624"></a>00624             <span class="keywordflow">break</span>;
<a name="l00625"></a>00625         }
<a name="l00626"></a>00626         eoption = s;
<a name="l00627"></a>00627             <span class="keywordflow">if</span> (*option != <span class="charliteral">&#39;$&#39;</span>)
<a name="l00628"></a>00628             {
<a name="l00629"></a>00629               <span class="comment">// Locale</span>
<a name="l00630"></a>00630               <span class="keywordflow">if</span> (locale) {
<a name="l00631"></a>00631         fprintf(stderr, <span class="stringliteral">&quot;Invalid entry (second locale!?) at %s:%d\n&quot;</span>, rFile.<a class="codeRef" href="qfile.html#name">name</a>().latin1(), line);
<a name="l00632"></a>00632         <span class="keywordflow">goto</span> sktoeol;
<a name="l00633"></a>00633               }
<a name="l00634"></a>00634               locale = option;
<a name="l00635"></a>00635               elocale = eoption;
<a name="l00636"></a>00636             }
<a name="l00637"></a>00637             <span class="keywordflow">else</span>
<a name="l00638"></a>00638             {
<a name="l00639"></a>00639               <span class="comment">// Option</span>
<a name="l00640"></a>00640               <span class="keywordflow">while</span> (option &lt; eoption)
<a name="l00641"></a>00641               {
<a name="l00642"></a>00642                  option++;
<a name="l00643"></a>00643                  <span class="keywordflow">if</span> ((*option == <span class="charliteral">&#39;i&#39;</span>) &amp;&amp; !kde_kiosk_exception)
<a name="l00644"></a>00644                     optionImmutable = <span class="keyword">true</span>;
<a name="l00645"></a>00645                  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*option == <span class="charliteral">&#39;e&#39;</span>)
<a name="l00646"></a>00646                     optionExpand = <span class="keyword">true</span>;
<a name="l00647"></a>00647                  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*option == <span class="charliteral">&#39;d&#39;</span>)
<a name="l00648"></a>00648                  {
<a name="l00649"></a>00649                     optionDeleted = <span class="keyword">true</span>;
<a name="l00650"></a>00650                     <span class="keywordflow">goto</span> haveeq;
<a name="l00651"></a>00651                  }
<a name="l00652"></a>00652          <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*option == <span class="charliteral">&#39;]&#39;</span>)
<a name="l00653"></a>00653             <span class="keywordflow">break</span>;
<a name="l00654"></a>00654               }
<a name="l00655"></a>00655             }
<a name="l00656"></a>00656          }
<a name="l00657"></a>00657       }
<a name="l00658"></a>00658       fprintf(stderr, <span class="stringliteral">&quot;Invalid entry (missing &#39;=&#39;) at %s:%d\n&quot;</span>, rFile.<a class="codeRef" href="qfile.html#name">name</a>().latin1(), line);
<a name="l00659"></a>00659       <span class="keywordflow">continue</span>;
<a name="l00660"></a>00660 
<a name="l00661"></a>00661    haveeq:
<a name="l00662"></a>00662       <span class="keywordflow">for</span> (endOfKey--; ; endOfKey--)
<a name="l00663"></a>00663       {
<a name="l00664"></a>00664      <span class="keywordflow">if</span> (endOfKey &lt; startLine)
<a name="l00665"></a>00665      {
<a name="l00666"></a>00666        fprintf(stderr, <span class="stringliteral">&quot;Invalid entry (empty key) at %s:%d\n&quot;</span>, rFile.<a class="codeRef" href="qfile.html#name">name</a>().latin1(), line);
<a name="l00667"></a>00667        <span class="keywordflow">goto</span> sktoeol;
<a name="l00668"></a>00668      }
<a name="l00669"></a>00669      <span class="keywordflow">if</span> (!isspace(*endOfKey))
<a name="l00670"></a>00670         <span class="keywordflow">break</span>;
<a name="l00671"></a>00671       }
<a name="l00672"></a>00672 
<a name="l00673"></a>00673       <span class="keyword">const</span> <span class="keywordtype">char</span> *st = ++s;
<a name="l00674"></a>00674       <span class="keywordflow">while</span> ((s &lt; eof) &amp;&amp; (*s != <span class="charliteral">&#39;\n&#39;</span>)) s++; <span class="comment">// Search till end of line / end of file</span>
<a name="l00675"></a>00675 
<a name="l00676"></a>00676       <span class="keywordflow">if</span> (locale) {
<a name="l00677"></a>00677           <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cl = <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(elocale - locale);
<a name="l00678"></a>00678           <span class="keywordflow">if</span> ((ll != cl) || memcmp(locale, localeString.data(), ll))
<a name="l00679"></a>00679           {
<a name="l00680"></a>00680               <span class="comment">// backward compatibility. C == en_US</span>
<a name="l00681"></a>00681               <span class="keywordflow">if</span> ( cl != 1 || ll != 5 || *locale != <span class="charliteral">&#39;C&#39;</span> || memcmp(localeString.data(), <span class="stringliteral">&quot;en_US&quot;</span>, 5)) {
<a name="l00682"></a>00682                   <span class="comment">//cout&lt;&lt;&quot;mismatched locale &#39;&quot;&lt;&lt;QCString(locale, elocale-locale +1)&lt;&lt;&quot;&#39;&quot;&lt;&lt;endl;</span>
<a name="l00683"></a>00683                   <span class="comment">// We can ignore this one</span>
<a name="l00684"></a>00684                   <span class="keywordflow">if</span> (!pWriteBackMap)
<a name="l00685"></a>00685                       <span class="keywordflow">continue</span>; <span class="comment">// We just ignore it</span>
<a name="l00686"></a>00686                   <span class="comment">// We just store it as is to be able to write it back later.</span>
<a name="l00687"></a>00687                   endOfKey = elocale;
<a name="l00688"></a>00688                   locale = 0;
<a name="l00689"></a>00689               }
<a name="l00690"></a>00690           }
<a name="l00691"></a>00691       }
<a name="l00692"></a>00692 
<a name="l00693"></a>00693       <span class="comment">// insert the key/value line</span>
<a name="l00694"></a>00694       <a class="codeRef" href="qcstring.html">QCString</a> key(startLine, endOfKey - startLine + 2);
<a name="l00695"></a>00695       <a class="codeRef" href="qcstring.html">QCString</a> val = printableToString(st, s - st);
<a name="l00696"></a>00696       <span class="comment">//qDebug(&quot;found key &#39;%s&#39; with value &#39;%s&#39;&quot;, key.data(), val.data());</span>
<a name="l00697"></a>00697 
<a name="l00698"></a>00698       <a class="code" href="structKEntryKey.html" title="key structure holding both the actual key and the the group to which it belongs.">KEntryKey</a> aEntryKey(aCurrentGroup, decodeKey(key));
<a name="l00699"></a>00699       aEntryKey.<a class="code" href="structKEntryKey.html#a457839125794297576e713c160f083ac" title="Entry is localised or not.">bLocal</a> = (locale != 0);
<a name="l00700"></a>00700       aEntryKey.<a class="code" href="structKEntryKey.html#a1aa02e66ff1a3c5a9b1f48984f25220b" title="Entry indicates if this is a default value.">bDefault</a> = bDefault;
<a name="l00701"></a>00701 
<a name="l00702"></a>00702       <a class="code" href="structKEntry.html" title="map/dict/list config node entry.">KEntry</a> aEntry;
<a name="l00703"></a>00703       aEntry.mValue = val;
<a name="l00704"></a>00704       aEntry.<a class="code" href="structKEntry.html#a6cd73aa253368b94a1cc88923f9a6c32" title="Entry should be written to the global config file.">bGlobal</a> = bGlobal;
<a name="l00705"></a>00705       aEntry.<a class="code" href="structKEntry.html#a1b391d253964a47eb0944bf149658883" title="Entry can not be modified.">bImmutable</a> = optionImmutable;
<a name="l00706"></a>00706       aEntry.<a class="code" href="structKEntry.html#accd73af842318df06b1ce2e10229683d" title="Entry has been deleted.">bDeleted</a> = optionDeleted;
<a name="l00707"></a>00707       aEntry.<a class="code" href="structKEntry.html#a74ff0d2fe59eb0bd8f8550d2d1b0130e" title="Whether to apply dollar expansion or not.">bExpand</a> = optionExpand;
<a name="l00708"></a>00708       aEntry.<a class="code" href="structKEntry.html#a3e2e7892b22ef6a8c862472482101af0" title="Entry should be written with locale tag.">bNLS</a> = (locale != 0);
<a name="l00709"></a>00709 
<a name="l00710"></a>00710       <span class="keywordflow">if</span> (pWriteBackMap) {
<a name="l00711"></a>00711          <span class="comment">// don&#39;t insert into the config object but into the temporary</span>
<a name="l00712"></a>00712          <span class="comment">// scratchpad map</span>
<a name="l00713"></a>00713          pWriteBackMap-&gt;insert(aEntryKey, aEntry);
<a name="l00714"></a>00714       } <span class="keywordflow">else</span> {
<a name="l00715"></a>00715          <span class="comment">// directly insert value into config object</span>
<a name="l00716"></a>00716          <span class="comment">// no need to specify localization; if the key we just</span>
<a name="l00717"></a>00717          <span class="comment">// retrieved was localized already, no need to localize it again.</span>
<a name="l00718"></a>00718          pConfig-&gt;<a class="code" href="classKConfigBase.html#a786003558616440ccbe84c2013b38530" title="Inserts a (key/value) pair into the internal storage mechanism of the configuration object...">putData</a>(aEntryKey, aEntry, <span class="keyword">false</span>);
<a name="l00719"></a>00719       }
<a name="l00720"></a>00720    }
<a name="l00721"></a>00721    <span class="keywordflow">if</span> (fileOptionImmutable)
<a name="l00722"></a>00722       bFileImmutable = <span class="keyword">true</span>;
<a name="l00723"></a>00723 
<a name="l00724"></a>00724 <span class="preprocessor">#ifdef HAVE_MMAP</span>
<a name="l00725"></a>00725 <span class="preprocessor"></span>   <span class="keywordflow">if</span> (map)
<a name="l00726"></a>00726    {
<a name="l00727"></a>00727       munmap(( <span class="keywordtype">char</span>* )map, rFile.<a class="codeRef" href="qfile.html#size">size</a>());
<a name="l00728"></a>00728 <span class="preprocessor">#ifdef SIGBUS</span>
<a name="l00729"></a>00729 <span class="preprocessor"></span>      sigaction (SIGBUS, &amp;mmap_old_sigact, 0);
<a name="l00730"></a>00730 <span class="preprocessor">#endif</span>
<a name="l00731"></a>00731 <span class="preprocessor"></span>   }
<a name="l00732"></a>00732 <span class="preprocessor">#endif</span>
<a name="l00733"></a>00733 <span class="preprocessor"></span>}
<a name="l00734"></a>00734 
<a name="l00735"></a>00735 
<a name="l00736"></a><a class="code" href="classKConfigINIBackEnd.html#ac62affdbb73afc8a96c9edfaeff9070a">00736</a> <span class="keywordtype">void</span> <a class="code" href="classKConfigINIBackEnd.html#ac62affdbb73afc8a96c9edfaeff9070a" title="Writes configuration data to file(s).">KConfigINIBackEnd::sync</a>(<span class="keywordtype">bool</span> bMerge)
<a name="l00737"></a>00737 {
<a name="l00738"></a>00738   <span class="comment">// write-sync is only necessary if there are dirty entries</span>
<a name="l00739"></a>00739   <span class="keywordflow">if</span> (!pConfig-&gt;<a class="code" href="classKConfigBase.html#a8073970c1827d45eb078635af26a4288" title="Checks whether the config file has any dirty (modified) entries.">isDirty</a>())
<a name="l00740"></a>00740     <span class="keywordflow">return</span>;
<a name="l00741"></a>00741 
<a name="l00742"></a>00742   <span class="keywordtype">bool</span> bEntriesLeft = <span class="keyword">true</span>;
<a name="l00743"></a>00743 
<a name="l00744"></a>00744   <span class="comment">// find out the file to write to (most specific writable file)</span>
<a name="l00745"></a>00745   <span class="comment">// try local app-specific file first</span>
<a name="l00746"></a>00746 
<a name="l00747"></a>00747   <span class="keywordflow">if</span> (!mfileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>()) {
<a name="l00748"></a>00748     <span class="comment">// Create the containing dir if needed</span>
<a name="l00749"></a>00749     <span class="keywordflow">if</span> ((resType!=<span class="stringliteral">&quot;config&quot;</span>) &amp;&amp; !<a class="codeRef" href="qdir.html#isRelativePath">QDir::isRelativePath</a>(mLocalFileName))
<a name="l00750"></a>00750     {
<a name="l00751"></a>00751        <a class="code" href="classKURL.html" title="Represents and parses a URL.">KURL</a> path;
<a name="l00752"></a>00752        path.<a class="code" href="classKURL.html#a6c0a0828b4b9f1126b13380076e2b2f3" title="Sets the decoded path of the URL.">setPath</a>(mLocalFileName);
<a name="l00753"></a>00753        <a class="codeRef" href="qstring.html">QString</a> dir=path.<a class="code" href="classKURL.html#a0ff924855867aa98d0cbb5f3f20f4f87" title="Returns the directory of the path.">directory</a>();
<a name="l00754"></a>00754        <a class="code" href="classKStandardDirs.html#a69a6cdd47b96c5183cdc2eb38d28d543" title="Recursively creates still-missing directories in the given path.">KStandardDirs::makeDir</a>(dir);
<a name="l00755"></a>00755     }
<a name="l00756"></a>00756 
<a name="l00757"></a>00757     <span class="comment">// Can we allow the write? We can, if the program</span>
<a name="l00758"></a>00758     <span class="comment">// doesn&#39;t run SUID. But if it runs SUID, we must</span>
<a name="l00759"></a>00759     <span class="comment">// check if the user would be allowed to write if</span>
<a name="l00760"></a>00760     <span class="comment">// it wasn&#39;t SUID.</span>
<a name="l00761"></a>00761     <span class="keywordflow">if</span> (checkAccess(mLocalFileName, W_OK)) {
<a name="l00762"></a>00762       <span class="comment">// File is writable</span>
<a name="l00763"></a>00763       <a class="code" href="classKSharedPtr.html">KLockFile::Ptr</a> lf;
<a name="l00764"></a>00764 
<a name="l00765"></a>00765       <span class="keywordtype">bool</span> mergeLocalFile = bMerge;
<a name="l00766"></a>00766       <span class="comment">// Check if the file has been updated since.</span>
<a name="l00767"></a>00767       <span class="keywordflow">if</span> (mergeLocalFile)
<a name="l00768"></a>00768       {
<a name="l00769"></a>00769          lf = <a class="code" href="classKConfigBackEnd.html#a239ce116492474e28fa7fbb2cf3c9b4c" title="Returns a lock file object for the configuration file.">lockFile</a>(<span class="keyword">false</span>); <span class="comment">// Lock file for local file</span>
<a name="l00770"></a>00770          <span class="keywordflow">if</span> (lf &amp;&amp; lf-&gt;isLocked())
<a name="l00771"></a>00771             lf = 0; <span class="comment">// Already locked, we don&#39;t need to lock/unlock again</span>
<a name="l00772"></a>00772 
<a name="l00773"></a>00773          <span class="keywordflow">if</span> (lf) 
<a name="l00774"></a>00774          {
<a name="l00775"></a>00775             lf-&gt;lock( <a class="code" href="classKLockFile.html#aec248e0c5d98c76307e5b8928cf54868af4c6d2d505657b792e1aab264e1fb439" title="Automatically remove a lock when a lock is detected that is stale for more than staleTime() seconds...">KLockFile::LockForce</a> );
<a name="l00776"></a>00776             <span class="comment">// But what if the locking failed? Ignore it for now...</span>
<a name="l00777"></a>00777          }
<a name="l00778"></a>00778          
<a name="l00779"></a>00779          <a class="codeRef" href="qfileinfo.html">QFileInfo</a> info(mLocalFileName);
<a name="l00780"></a>00780          <span class="keywordflow">if</span> ((d-&gt;localLastSize == info.<a class="codeRef" href="qfileinfo.html#size">size</a>()) &amp;&amp;
<a name="l00781"></a>00781              (d-&gt;localLastModified == info.<a class="codeRef" href="qfileinfo.html#lastModified">lastModified</a>()))
<a name="l00782"></a>00782          {
<a name="l00783"></a>00783             <span class="comment">// Not changed, don&#39;t merge.</span>
<a name="l00784"></a>00784             mergeLocalFile = <span class="keyword">false</span>;
<a name="l00785"></a>00785          }
<a name="l00786"></a>00786          <span class="keywordflow">else</span>
<a name="l00787"></a>00787          {
<a name="l00788"></a>00788             <span class="comment">// Changed...</span>
<a name="l00789"></a>00789             d-&gt;localLastModified = <a class="codeRef" href="qdatetime.html">QDateTime</a>();
<a name="l00790"></a>00790             d-&gt;localLastSize = 0;
<a name="l00791"></a>00791          }
<a name="l00792"></a>00792       }
<a name="l00793"></a>00793 
<a name="l00794"></a>00794       bEntriesLeft = <a class="code" href="classKConfigINIBackEnd.html#a32d09e00cabbb882d94d8f58025271bc" title="Writes configuration file back.">writeConfigFile</a>( mLocalFileName, <span class="keyword">false</span>, mergeLocalFile );
<a name="l00795"></a>00795       
<a name="l00796"></a>00796       <span class="comment">// Only if we didn&#39;t have to merge anything can we use our in-memory state</span>
<a name="l00797"></a>00797       <span class="comment">// the next time around. Otherwise the config-file may contain entries</span>
<a name="l00798"></a>00798       <span class="comment">// that are different from our in-memory state which means we will have to </span>
<a name="l00799"></a>00799       <span class="comment">// do a merge from then on. </span>
<a name="l00800"></a>00800       <span class="comment">// We do not automatically update the in-memory state with the on-disk </span>
<a name="l00801"></a>00801       <span class="comment">// state when writing the config to disk. We only do so when </span>
<a name="l00802"></a>00802       <span class="comment">// KCOnfig::reparseConfiguration() is called.</span>
<a name="l00803"></a>00803       <span class="comment">// For KDE 4.0 we may wish to reconsider that.</span>
<a name="l00804"></a>00804       <span class="keywordflow">if</span> (!mergeLocalFile)
<a name="l00805"></a>00805       {
<a name="l00806"></a>00806          <a class="codeRef" href="qfileinfo.html">QFileInfo</a> info(mLocalFileName);
<a name="l00807"></a>00807          d-&gt;localLastModified = info.<a class="codeRef" href="qfileinfo.html#lastModified">lastModified</a>();
<a name="l00808"></a>00808          d-&gt;localLastSize = info.<a class="codeRef" href="qfileinfo.html#size">size</a>();
<a name="l00809"></a>00809       }
<a name="l00810"></a>00810       <span class="keywordflow">if</span> (lf) lf-&gt;unlock();
<a name="l00811"></a>00811     }
<a name="l00812"></a>00812   }
<a name="l00813"></a>00813 
<a name="l00814"></a>00814   <span class="comment">// only write out entries to the kdeglobals file if there are any</span>
<a name="l00815"></a>00815   <span class="comment">// entries marked global (indicated by bEntriesLeft) and</span>
<a name="l00816"></a>00816   <span class="comment">// the useKDEGlobals flag is set.</span>
<a name="l00817"></a>00817   <span class="keywordflow">if</span> (bEntriesLeft &amp;&amp; useKDEGlobals) {
<a name="l00818"></a>00818 
<a name="l00819"></a>00819     <span class="comment">// can we allow the write? (see above)</span>
<a name="l00820"></a>00820     <span class="keywordflow">if</span> (checkAccess ( mGlobalFileName, W_OK )) {
<a name="l00821"></a>00821       <a class="code" href="classKSharedPtr.html">KLockFile::Ptr</a> lf = <a class="code" href="classKConfigBackEnd.html#a239ce116492474e28fa7fbb2cf3c9b4c" title="Returns a lock file object for the configuration file.">lockFile</a>(<span class="keyword">true</span>); <span class="comment">// Lock file for global file</span>
<a name="l00822"></a>00822       <span class="keywordflow">if</span> (lf &amp;&amp; lf-&gt;isLocked())
<a name="l00823"></a>00823          lf = 0; <span class="comment">// Already locked, we don&#39;t need to lock/unlock again</span>
<a name="l00824"></a>00824 
<a name="l00825"></a>00825       <span class="keywordflow">if</span> (lf) 
<a name="l00826"></a>00826       {
<a name="l00827"></a>00827          lf-&gt;lock( <a class="code" href="classKLockFile.html#aec248e0c5d98c76307e5b8928cf54868af4c6d2d505657b792e1aab264e1fb439" title="Automatically remove a lock when a lock is detected that is stale for more than staleTime() seconds...">KLockFile::LockForce</a> );
<a name="l00828"></a>00828          <span class="comment">// But what if the locking failed? Ignore it for now...</span>
<a name="l00829"></a>00829       }
<a name="l00830"></a>00830       <a class="code" href="classKConfigINIBackEnd.html#a32d09e00cabbb882d94d8f58025271bc" title="Writes configuration file back.">writeConfigFile</a>( mGlobalFileName, <span class="keyword">true</span>, bMerge ); <span class="comment">// Always merge</span>
<a name="l00831"></a>00831       <span class="keywordflow">if</span> (lf) lf-&gt;unlock();
<a name="l00832"></a>00832     }
<a name="l00833"></a>00833   }
<a name="l00834"></a>00834 
<a name="l00835"></a>00835 }
<a name="l00836"></a>00836 
<a name="l00837"></a>00837 <span class="keyword">static</span> <span class="keywordtype">void</span> writeEntries(FILE *pStream, <span class="keyword">const</span> <a class="code" href="structKEntry.html#a7e47f8d4ccee5d45b4b5a23e8a1c08d6">KEntryMap</a>&amp; entryMap, <span class="keywordtype">bool</span> defaultGroup, <span class="keywordtype">bool</span> &amp;firstEntry, <span class="keyword">const</span> <a class="codeRef" href="qcstring.html">QCString</a> &amp;localeString)
<a name="l00838"></a>00838 {
<a name="l00839"></a>00839   <span class="comment">// now write out all other groups.</span>
<a name="l00840"></a>00840   <a class="codeRef" href="qcstring.html">QCString</a> currentGroup;
<a name="l00841"></a>00841   <span class="keywordflow">for</span> (<a class="code" href="structKEntry.html#ab7fb5ad53460c90249a7db81f28b24f6">KEntryMapConstIterator</a> aIt = entryMap.begin();
<a name="l00842"></a>00842        aIt != entryMap.end(); ++aIt)
<a name="l00843"></a>00843   {
<a name="l00844"></a>00844      <span class="keyword">const</span> <a class="code" href="structKEntryKey.html" title="key structure holding both the actual key and the the group to which it belongs.">KEntryKey</a> &amp;key = aIt.key();
<a name="l00845"></a>00845 
<a name="l00846"></a>00846      <span class="comment">// Either proces the default group or all others</span>
<a name="l00847"></a>00847      <span class="keywordflow">if</span> ((key.<a class="code" href="structKEntryKey.html#aa8d5b47fd2fdb0b791b535b1ac8a865a" title="The &quot;group&quot; to which this EntryKey belongs.">mGroup</a> != <span class="stringliteral">&quot;&lt;default&gt;&quot;</span>) == defaultGroup)
<a name="l00848"></a>00848         <span class="keywordflow">continue</span>; <span class="comment">// Skip</span>
<a name="l00849"></a>00849 
<a name="l00850"></a>00850      <span class="comment">// Skip default values and group headers.</span>
<a name="l00851"></a>00851      <span class="keywordflow">if</span> ((key.<a class="code" href="structKEntryKey.html#a1aa02e66ff1a3c5a9b1f48984f25220b" title="Entry indicates if this is a default value.">bDefault</a>) || key.<a class="code" href="structKEntryKey.html#aff233579cbb3a88ca00af4db9343add7" title="The _actual_ key of the entry in question.">mKey</a>.<a class="codeRef" href="qcstring.html#isEmpty">isEmpty</a>())
<a name="l00852"></a>00852         <span class="keywordflow">continue</span>; <span class="comment">// Skip</span>
<a name="l00853"></a>00853 
<a name="l00854"></a>00854      <span class="keyword">const</span> <a class="code" href="structKEntry.html" title="map/dict/list config node entry.">KEntry</a> &amp;currentEntry = *aIt;
<a name="l00855"></a>00855 
<a name="l00856"></a>00856      <a class="code" href="structKEntry.html#ab7fb5ad53460c90249a7db81f28b24f6">KEntryMapConstIterator</a> aTestIt = aIt;
<a name="l00857"></a>00857      ++aTestIt;
<a name="l00858"></a>00858      <span class="keywordtype">bool</span> hasDefault = (aTestIt != entryMap.end());
<a name="l00859"></a>00859      <span class="keywordflow">if</span> (hasDefault)
<a name="l00860"></a>00860      {
<a name="l00861"></a>00861         <span class="keyword">const</span> <a class="code" href="structKEntryKey.html" title="key structure holding both the actual key and the the group to which it belongs.">KEntryKey</a> &amp;defaultKey = aTestIt.key();
<a name="l00862"></a>00862         <span class="keywordflow">if</span> ((!defaultKey.<a class="code" href="structKEntryKey.html#a1aa02e66ff1a3c5a9b1f48984f25220b" title="Entry indicates if this is a default value.">bDefault</a>) ||
<a name="l00863"></a>00863             (defaultKey.<a class="code" href="structKEntryKey.html#aff233579cbb3a88ca00af4db9343add7" title="The _actual_ key of the entry in question.">mKey</a> != key.<a class="code" href="structKEntryKey.html#aff233579cbb3a88ca00af4db9343add7" title="The _actual_ key of the entry in question.">mKey</a>) ||
<a name="l00864"></a>00864             (defaultKey.<a class="code" href="structKEntryKey.html#aa8d5b47fd2fdb0b791b535b1ac8a865a" title="The &quot;group&quot; to which this EntryKey belongs.">mGroup</a> != key.<a class="code" href="structKEntryKey.html#aa8d5b47fd2fdb0b791b535b1ac8a865a" title="The &quot;group&quot; to which this EntryKey belongs.">mGroup</a>) ||
<a name="l00865"></a>00865             (defaultKey.<a class="code" href="structKEntryKey.html#a457839125794297576e713c160f083ac" title="Entry is localised or not.">bLocal</a> != key.<a class="code" href="structKEntryKey.html#a457839125794297576e713c160f083ac" title="Entry is localised or not.">bLocal</a>))
<a name="l00866"></a>00866            hasDefault = <span class="keyword">false</span>;
<a name="l00867"></a>00867      }
<a name="l00868"></a>00868 
<a name="l00869"></a>00869 
<a name="l00870"></a>00870      <span class="keywordflow">if</span> (hasDefault)
<a name="l00871"></a>00871      {
<a name="l00872"></a>00872         <span class="comment">// Entry had a default value</span>
<a name="l00873"></a>00873         <span class="keywordflow">if</span> ((currentEntry.mValue == (*aTestIt).mValue) &amp;&amp;
<a name="l00874"></a>00874             (currentEntry.<a class="code" href="structKEntry.html#accd73af842318df06b1ce2e10229683d" title="Entry has been deleted.">bDeleted</a> == (*aTestIt).bDeleted))
<a name="l00875"></a>00875            <span class="keywordflow">continue</span>; <span class="comment">// Same as default, don&#39;t write.</span>
<a name="l00876"></a>00876      }
<a name="l00877"></a>00877      <span class="keywordflow">else</span>
<a name="l00878"></a>00878      {
<a name="l00879"></a>00879         <span class="comment">// Entry had no default value.</span>
<a name="l00880"></a>00880         <span class="keywordflow">if</span> (currentEntry.<a class="code" href="structKEntry.html#accd73af842318df06b1ce2e10229683d" title="Entry has been deleted.">bDeleted</a>)
<a name="l00881"></a>00881            <span class="keywordflow">continue</span>; <span class="comment">// Don&#39;t write deleted entries if there is no default.</span>
<a name="l00882"></a>00882      }
<a name="l00883"></a>00883 
<a name="l00884"></a>00884      <span class="keywordflow">if</span> (!defaultGroup &amp;&amp; (currentGroup != key.<a class="code" href="structKEntryKey.html#aa8d5b47fd2fdb0b791b535b1ac8a865a" title="The &quot;group&quot; to which this EntryKey belongs.">mGroup</a>)) {
<a name="l00885"></a>00885     <span class="keywordflow">if</span> (!firstEntry)
<a name="l00886"></a>00886         fprintf(pStream, <span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00887"></a>00887     currentGroup = key.<a class="code" href="structKEntryKey.html#aa8d5b47fd2fdb0b791b535b1ac8a865a" title="The &quot;group&quot; to which this EntryKey belongs.">mGroup</a>;
<a name="l00888"></a>00888     fprintf(pStream, <span class="stringliteral">&quot;[%s]\n&quot;</span>, encodeGroup(currentGroup).data());
<a name="l00889"></a>00889      }
<a name="l00890"></a>00890 
<a name="l00891"></a>00891      firstEntry = <span class="keyword">false</span>;
<a name="l00892"></a>00892      <span class="comment">// it is data for a group</span>
<a name="l00893"></a>00893      fputs(encodeKey(key.<a class="code" href="structKEntryKey.html#aff233579cbb3a88ca00af4db9343add7" title="The _actual_ key of the entry in question.">mKey</a>.data()), pStream); <span class="comment">// Key</span>
<a name="l00894"></a>00894 
<a name="l00895"></a>00895      <span class="keywordflow">if</span> ( currentEntry.<a class="code" href="structKEntry.html#a3e2e7892b22ef6a8c862472482101af0" title="Entry should be written with locale tag.">bNLS</a> )
<a name="l00896"></a>00896      {
<a name="l00897"></a>00897         fputc(<span class="charliteral">&#39;[&#39;</span>, pStream);
<a name="l00898"></a>00898         fputs(localeString.data(), pStream);
<a name="l00899"></a>00899         fputc(<span class="charliteral">&#39;]&#39;</span>, pStream);
<a name="l00900"></a>00900      }
<a name="l00901"></a>00901 
<a name="l00902"></a>00902      <span class="keywordflow">if</span> (currentEntry.<a class="code" href="structKEntry.html#accd73af842318df06b1ce2e10229683d" title="Entry has been deleted.">bDeleted</a>)
<a name="l00903"></a>00903      {
<a name="l00904"></a>00904         fputs(<span class="stringliteral">&quot;[$d]\n&quot;</span>, pStream); <span class="comment">// Deleted</span>
<a name="l00905"></a>00905      }
<a name="l00906"></a>00906      <span class="keywordflow">else</span>
<a name="l00907"></a>00907      {
<a name="l00908"></a>00908         <span class="keywordflow">if</span> (currentEntry.<a class="code" href="structKEntry.html#a1b391d253964a47eb0944bf149658883" title="Entry can not be modified.">bImmutable</a> || currentEntry.<a class="code" href="structKEntry.html#a74ff0d2fe59eb0bd8f8550d2d1b0130e" title="Whether to apply dollar expansion or not.">bExpand</a>)
<a name="l00909"></a>00909         {
<a name="l00910"></a>00910            fputc(<span class="charliteral">&#39;[&#39;</span>, pStream);
<a name="l00911"></a>00911            fputc(<span class="charliteral">&#39;$&#39;</span>, pStream);
<a name="l00912"></a>00912            <span class="keywordflow">if</span> (currentEntry.<a class="code" href="structKEntry.html#a1b391d253964a47eb0944bf149658883" title="Entry can not be modified.">bImmutable</a>)
<a name="l00913"></a>00913               fputc(<span class="charliteral">&#39;i&#39;</span>, pStream);
<a name="l00914"></a>00914            <span class="keywordflow">if</span> (currentEntry.<a class="code" href="structKEntry.html#a74ff0d2fe59eb0bd8f8550d2d1b0130e" title="Whether to apply dollar expansion or not.">bExpand</a>)
<a name="l00915"></a>00915               fputc(<span class="charliteral">&#39;e&#39;</span>, pStream);
<a name="l00916"></a>00916 
<a name="l00917"></a>00917            fputc(<span class="charliteral">&#39;]&#39;</span>, pStream);
<a name="l00918"></a>00918         }
<a name="l00919"></a>00919         fputc(<span class="charliteral">&#39;=&#39;</span>, pStream);
<a name="l00920"></a>00920         fputs(stringToPrintable(currentEntry.mValue).data(), pStream);
<a name="l00921"></a>00921         fputc(<span class="charliteral">&#39;\n&#39;</span>, pStream);
<a name="l00922"></a>00922      }
<a name="l00923"></a>00923   } <span class="comment">// for loop</span>
<a name="l00924"></a>00924 }
<a name="l00925"></a>00925 
<a name="l00926"></a><a class="code" href="classKConfigINIBackEnd.html#a56383d30f1fc972760a44f4de6258b72">00926</a> <span class="keywordtype">bool</span> <a class="code" href="classKConfigINIBackEnd.html#a56383d30f1fc972760a44f4de6258b72" title="Get the entry map.">KConfigINIBackEnd::getEntryMap</a>(<a class="code" href="structKEntry.html#a7e47f8d4ccee5d45b4b5a23e8a1c08d6">KEntryMap</a> &amp;aTempMap, <span class="keywordtype">bool</span> bGlobal,
<a name="l00927"></a>00927                                     <a class="codeRef" href="qfile.html">QFile</a> *mergeFile)
<a name="l00928"></a>00928 {
<a name="l00929"></a>00929   <span class="keywordtype">bool</span> bEntriesLeft = <span class="keyword">false</span>;
<a name="l00930"></a>00930   bFileImmutable = <span class="keyword">false</span>;
<a name="l00931"></a>00931 
<a name="l00932"></a>00932   <span class="comment">// Read entries from disk</span>
<a name="l00933"></a>00933   <span class="keywordflow">if</span> (mergeFile &amp;&amp; mergeFile-&gt;<a class="codeRef" href="qfile.html#open">open</a>(IO_ReadOnly))
<a name="l00934"></a>00934   {
<a name="l00935"></a>00935      <span class="comment">// fill the temporary structure with entries from the file</span>
<a name="l00936"></a>00936      <a class="code" href="classKConfigINIBackEnd.html#a0ada8a31259aca589b8ac973490329d3" title="Parses one configuration file.">parseSingleConfigFile</a>(*mergeFile, &amp;aTempMap, bGlobal, <span class="keyword">false</span> );
<a name="l00937"></a>00937 
<a name="l00938"></a>00938      <span class="keywordflow">if</span> (bFileImmutable) <span class="comment">// File has become immutable on disk</span>
<a name="l00939"></a>00939         <span class="keywordflow">return</span> bEntriesLeft;
<a name="l00940"></a>00940   }
<a name="l00941"></a>00941 
<a name="l00942"></a>00942   KEntryMap aMap = pConfig-&gt;<a class="code" href="classKConfigBase.html#a9ba62cb1ad7e959546044cbeb75fd0db" title="Returns a map (tree) of the entries in the specified group.">internalEntryMap</a>();
<a name="l00943"></a>00943 
<a name="l00944"></a>00944   <span class="comment">// augment this structure with the dirty entries from the config object</span>
<a name="l00945"></a>00945   <span class="keywordflow">for</span> (KEntryMapIterator aIt = aMap.begin();
<a name="l00946"></a>00946        aIt != aMap.end(); ++aIt)
<a name="l00947"></a>00947   {
<a name="l00948"></a>00948     <span class="keyword">const</span> <a class="code" href="structKEntry.html" title="map/dict/list config node entry.">KEntry</a> &amp;currentEntry = *aIt;
<a name="l00949"></a>00949     <span class="keywordflow">if</span>(aIt.key().bDefault)
<a name="l00950"></a>00950     {
<a name="l00951"></a>00951        aTempMap.replace(aIt.key(), currentEntry);
<a name="l00952"></a>00952        <span class="keywordflow">continue</span>;
<a name="l00953"></a>00953     }
<a name="l00954"></a>00954 
<a name="l00955"></a>00955     <span class="keywordflow">if</span> (mergeFile &amp;&amp; !currentEntry.<a class="code" href="structKEntry.html#a8d1936142d224febe2ab1810a9beb4b7" title="Must the entry be written back to disk?">bDirty</a>)
<a name="l00956"></a>00956        <span class="keywordflow">continue</span>;
<a name="l00957"></a>00957 
<a name="l00958"></a>00958     <span class="comment">// only write back entries that have the same</span>
<a name="l00959"></a>00959     <span class="comment">// &quot;globality&quot; as the file</span>
<a name="l00960"></a>00960     <span class="keywordflow">if</span> (currentEntry.<a class="code" href="structKEntry.html#a6cd73aa253368b94a1cc88923f9a6c32" title="Entry should be written to the global config file.">bGlobal</a> != bGlobal)
<a name="l00961"></a>00961     {
<a name="l00962"></a>00962        <span class="comment">// wrong &quot;globality&quot; - might have to be saved later</span>
<a name="l00963"></a>00963        bEntriesLeft = <span class="keyword">true</span>;
<a name="l00964"></a>00964        <span class="keywordflow">continue</span>;
<a name="l00965"></a>00965     }
<a name="l00966"></a>00966 
<a name="l00967"></a>00967     <span class="comment">// put this entry from the config object into the</span>
<a name="l00968"></a>00968     <span class="comment">// temporary map, possibly replacing an existing entry</span>
<a name="l00969"></a>00969     KEntryMapIterator aIt2 = aTempMap.find(aIt.key());
<a name="l00970"></a>00970     <span class="keywordflow">if</span> (aIt2 != aTempMap.end() &amp;&amp; (*aIt2).bImmutable)
<a name="l00971"></a>00971        <span class="keywordflow">continue</span>; <span class="comment">// Bail out if the on-disk entry is immutable</span>
<a name="l00972"></a>00972 
<a name="l00973"></a>00973     aTempMap.insert(aIt.key(), currentEntry, <span class="keyword">true</span>);
<a name="l00974"></a>00974   } <span class="comment">// loop</span>
<a name="l00975"></a>00975 
<a name="l00976"></a>00976   <span class="keywordflow">return</span> bEntriesLeft;
<a name="l00977"></a>00977 }
<a name="l00978"></a>00978 
<a name="l00979"></a>00979 <span class="comment">/* antlarr: KDE 4.0:  make the first parameter &quot;const QString &amp;&quot; */</span>
<a name="l00980"></a><a class="code" href="classKConfigINIBackEnd.html#a32d09e00cabbb882d94d8f58025271bc">00980</a> <span class="keywordtype">bool</span> <a class="code" href="classKConfigINIBackEnd.html#a32d09e00cabbb882d94d8f58025271bc" title="Writes configuration file back.">KConfigINIBackEnd::writeConfigFile</a>(<a class="codeRef" href="qstring.html">QString</a> filename, <span class="keywordtype">bool</span> bGlobal,
<a name="l00981"></a>00981                     <span class="keywordtype">bool</span> bMerge)
<a name="l00982"></a>00982 {
<a name="l00983"></a>00983   <span class="comment">// is the config object read-only?</span>
<a name="l00984"></a>00984   <span class="keywordflow">if</span> (pConfig-&gt;<a class="code" href="classKConfigBase.html#ae6b73baec1f7a7dec84292924bc5876b" title="Returns the read-only status of the config object.">isReadOnly</a>())
<a name="l00985"></a>00985     <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// pretend we wrote it</span>
<a name="l00986"></a>00986 
<a name="l00987"></a>00987   KEntryMap aTempMap;
<a name="l00988"></a>00988   <a class="codeRef" href="qfile.html">QFile</a> *mergeFile = (bMerge ? <span class="keyword">new</span> <a class="codeRef" href="qfile.html">QFile</a>(filename) : 0);
<a name="l00989"></a>00989   <span class="keywordtype">bool</span> bEntriesLeft = <a class="code" href="classKConfigINIBackEnd.html#a56383d30f1fc972760a44f4de6258b72" title="Get the entry map.">getEntryMap</a>(aTempMap, bGlobal, mergeFile);
<a name="l00990"></a>00990   <span class="keyword">delete</span> mergeFile;
<a name="l00991"></a>00991   <span class="keywordflow">if</span> (bFileImmutable)
<a name="l00992"></a>00992     <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// pretend we wrote it</span>
<a name="l00993"></a>00993 
<a name="l00994"></a>00994   <span class="comment">// OK now the temporary map should be full of ALL entries.</span>
<a name="l00995"></a>00995   <span class="comment">// write it out to disk.</span>
<a name="l00996"></a>00996 
<a name="l00997"></a>00997   <span class="comment">// Check if file exists:</span>
<a name="l00998"></a>00998   <span class="keywordtype">int</span> fileMode = -1;
<a name="l00999"></a>00999   <span class="keywordtype">bool</span> createNew = <span class="keyword">true</span>;
<a name="l01000"></a>01000 
<a name="l01001"></a>01001   KDE_struct_stat buf;
<a name="l01002"></a>01002   <span class="keywordflow">if</span> (KDE_stat(<a class="codeRef" href="qfile.html#encodeName">QFile::encodeName</a>(filename), &amp;buf) == 0)
<a name="l01003"></a>01003   {
<a name="l01004"></a>01004      <span class="keywordflow">if</span> (buf.st_uid == getuid())
<a name="l01005"></a>01005      {
<a name="l01006"></a>01006         <span class="comment">// Preserve file mode if file exists and is owned by user.</span>
<a name="l01007"></a>01007         fileMode = buf.st_mode &amp; 0777;
<a name="l01008"></a>01008      }
<a name="l01009"></a>01009      <span class="keywordflow">else</span>
<a name="l01010"></a>01010      {
<a name="l01011"></a>01011         <span class="comment">// File is not owned by user:</span>
<a name="l01012"></a>01012         <span class="comment">// Don&#39;t create new file but write to existing file instead.</span>
<a name="l01013"></a>01013         createNew = <span class="keyword">false</span>;
<a name="l01014"></a>01014      }
<a name="l01015"></a>01015   }
<a name="l01016"></a>01016 
<a name="l01017"></a>01017   <a class="code" href="classKSaveFile.html" title="The KSaveFile class has been made to write out changes to an existing file atomically.">KSaveFile</a> *pConfigFile = 0;
<a name="l01018"></a>01018   FILE *pStream = 0;
<a name="l01019"></a>01019 
<a name="l01020"></a>01020   <span class="keywordflow">if</span> (createNew)
<a name="l01021"></a>01021   {
<a name="l01022"></a>01022      pConfigFile = <span class="keyword">new</span> <a class="code" href="classKSaveFile.html" title="The KSaveFile class has been made to write out changes to an existing file atomically.">KSaveFile</a>( filename, 0600 );
<a name="l01023"></a>01023 
<a name="l01024"></a>01024      <span class="keywordflow">if</span> (pConfigFile-&gt;<a class="code" href="classKSaveFile.html#aaf62bcd61f3d84b3b1bccc94c9bb27b6" title="Returns the status of the file based on errno.">status</a>() != 0)
<a name="l01025"></a>01025      {
<a name="l01026"></a>01026         <span class="keyword">delete</span> pConfigFile;
<a name="l01027"></a>01027         <span class="keywordflow">return</span> bEntriesLeft;
<a name="l01028"></a>01028      }
<a name="l01029"></a>01029 
<a name="l01030"></a>01030      <span class="keywordflow">if</span> (!bGlobal &amp;&amp; (fileMode == -1))
<a name="l01031"></a>01031         fileMode = mFileMode;
<a name="l01032"></a>01032 
<a name="l01033"></a>01033      <span class="keywordflow">if</span> (fileMode != -1)
<a name="l01034"></a>01034      {
<a name="l01035"></a>01035         fchmod(pConfigFile-&gt;<a class="code" href="classKSaveFile.html#aae8e7a59a3a922caf37555db10c2ba21" title="An integer file descriptor open for writing to the file.">handle</a>(), fileMode);
<a name="l01036"></a>01036      }
<a name="l01037"></a>01037 
<a name="l01038"></a>01038      pStream = pConfigFile-&gt;<a class="code" href="classKSaveFile.html#a367f775fb52921eb3b82949c421a1cae" title="A FILE* stream open for writing to the file.">fstream</a>();
<a name="l01039"></a>01039   }
<a name="l01040"></a>01040   <span class="keywordflow">else</span>
<a name="l01041"></a>01041   {
<a name="l01042"></a>01042      <span class="comment">// Open existing file.</span>
<a name="l01043"></a>01043      <span class="comment">// We use open() to ensure that we call without O_CREAT.</span>
<a name="l01044"></a>01044      <span class="keywordtype">int</span> fd = KDE_open( <a class="codeRef" href="qfile.html#encodeName">QFile::encodeName</a>(filename), O_WRONLY | O_TRUNC );
<a name="l01045"></a>01045      <span class="keywordflow">if</span> (fd &lt; 0)
<a name="l01046"></a>01046      {
<a name="l01047"></a>01047         <span class="keywordflow">return</span> bEntriesLeft;
<a name="l01048"></a>01048      }
<a name="l01049"></a>01049      pStream = KDE_fdopen( fd, <span class="stringliteral">&quot;w&quot;</span>);
<a name="l01050"></a>01050      <span class="keywordflow">if</span> (!pStream)
<a name="l01051"></a>01051      {
<a name="l01052"></a>01052         close(fd);
<a name="l01053"></a>01053         <span class="keywordflow">return</span> bEntriesLeft;
<a name="l01054"></a>01054      }
<a name="l01055"></a>01055   }
<a name="l01056"></a>01056 
<a name="l01057"></a>01057   <a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb" title="Write the entries in aTempMap to the file stream.">writeEntries</a>(pStream, aTempMap);
<a name="l01058"></a>01058 
<a name="l01059"></a>01059   <span class="keywordflow">if</span> (pConfigFile)
<a name="l01060"></a>01060   {
<a name="l01061"></a>01061      <span class="keywordtype">bool</span> bEmptyFile = (ftell(pStream) == 0);
<a name="l01062"></a>01062      <span class="keywordflow">if</span> ( bEmptyFile &amp;&amp; ((fileMode == -1) || (fileMode == 0600)) )
<a name="l01063"></a>01063      {
<a name="l01064"></a>01064         <span class="comment">// File is empty and doesn&#39;t have special permissions: delete it.</span>
<a name="l01065"></a>01065         ::unlink(<a class="codeRef" href="qfile.html#encodeName">QFile::encodeName</a>(filename));
<a name="l01066"></a>01066         pConfigFile-&gt;<a class="code" href="classKSaveFile.html#ae37d3dad68317eb4ba720067b33a0dd1" title="Aborts the write operation and removes any intermediate files This implies a close.">abort</a>();
<a name="l01067"></a>01067      }
<a name="l01068"></a>01068      <span class="keywordflow">else</span>
<a name="l01069"></a>01069      {
<a name="l01070"></a>01070         <span class="comment">// Normal case: Close the file</span>
<a name="l01071"></a>01071         pConfigFile-&gt;<a class="code" href="classKSaveFile.html#aa5c7a2f7dd4037e7c73560817d573923" title="Closes the file and makes the changes definitive.">close</a>();
<a name="l01072"></a>01072      }
<a name="l01073"></a>01073      <span class="keyword">delete</span> pConfigFile;
<a name="l01074"></a>01074   }
<a name="l01075"></a>01075   <span class="keywordflow">else</span>
<a name="l01076"></a>01076   {
<a name="l01077"></a>01077      fclose(pStream);
<a name="l01078"></a>01078   }
<a name="l01079"></a>01079 
<a name="l01080"></a>01080   <span class="keywordflow">return</span> bEntriesLeft;
<a name="l01081"></a>01081 }
<a name="l01082"></a>01082 
<a name="l01083"></a><a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb">01083</a> <span class="keywordtype">void</span> <a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb" title="Write the entries in aTempMap to the file stream.">KConfigINIBackEnd::writeEntries</a>(FILE *pStream, <span class="keyword">const</span> <a class="code" href="structKEntry.html#a7e47f8d4ccee5d45b4b5a23e8a1c08d6">KEntryMap</a> &amp;aTempMap)
<a name="l01084"></a>01084 {
<a name="l01085"></a>01085   <span class="keywordtype">bool</span> firstEntry = <span class="keyword">true</span>;
<a name="l01086"></a>01086 
<a name="l01087"></a>01087   <span class="comment">// Write default group</span><a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb" title="Write the entries in aTempMap to the file stream."></a>
<a name="l01088"></a>01088 <a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb" title="Write the entries in aTempMap to the file stream.">  ::writeEntries</a>(pStream, aTempMap, <span class="keyword">true</span>, firstEntry, localeString);
<a name="l01089"></a>01089 
<a name="l01090"></a>01090   <span class="comment">// Write all other groups</span><a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb" title="Write the entries in aTempMap to the file stream."></a>
<a name="l01091"></a>01091 <a class="code" href="classKConfigINIBackEnd.html#a6cf0d35105be3e2b4f0e100d8dbac4eb" title="Write the entries in aTempMap to the file stream.">  ::writeEntries</a>(pStream, aTempMap, <span class="keyword">false</span>, firstEntry, localeString);
<a name="l01092"></a>01092 }
<a name="l01093"></a>01093 
<a name="l01094"></a>01094 <span class="keywordtype">void</span> KConfigBackEnd::virtual_hook( <span class="keywordtype">int</span>, <span class="keywordtype">void</span>* )
<a name="l01095"></a>01095 { <span class="comment">/*BASE::virtual_hook( id, data );*/</span> }
<a name="l01096"></a>01096 
<a name="l01097"></a>01097 <span class="keywordtype">void</span> KConfigINIBackEnd::virtual_hook( <span class="keywordtype">int</span> <span class="keywordtype">id</span>, <span class="keywordtype">void</span>* data )
<a name="l01098"></a>01098 { KConfigBackEnd::virtual_hook( <span class="keywordtype">id</span>, data ); }
<a name="l01099"></a>01099 
<a name="l01100"></a><a class="code" href="classKConfigBackEnd.html#ae9332f035eaf2006f6f345f2021b941d">01100</a> <span class="keywordtype">bool</span> <a class="code" href="classKConfigBackEnd.html#ae9332f035eaf2006f6f345f2021b941d" title="Check whether the config files are writable.">KConfigBackEnd::checkConfigFilesWritable</a>(<span class="keywordtype">bool</span> warnUser)
<a name="l01101"></a>01101 {
<a name="l01102"></a>01102   <span class="comment">// WARNING: Do NOT use the event loop as it may not exist at this time.</span>
<a name="l01103"></a>01103   <span class="keywordtype">bool</span> allWritable = <span class="keyword">true</span>;
<a name="l01104"></a>01104   <a class="codeRef" href="qstring.html">QString</a> errorMsg;
<a name="l01105"></a>01105   <span class="keywordflow">if</span> ( !mLocalFileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>() &amp;&amp; !bFileImmutable &amp;&amp; !checkAccess(mLocalFileName,W_OK) )
<a name="l01106"></a>01106   {
<a name="l01107"></a>01107     errorMsg = i18n(<span class="stringliteral">&quot;Will not save configuration.\n&quot;</span>);
<a name="l01108"></a>01108     allWritable = <span class="keyword">false</span>;
<a name="l01109"></a>01109     errorMsg += i18n(<span class="stringliteral">&quot;Configuration file \&quot;%1\&quot; not writable.\n&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(mLocalFileName);
<a name="l01110"></a>01110   }
<a name="l01111"></a>01111   <span class="comment">// We do not have an immutability flag for kdeglobals. However, making kdeglobals mutable while making</span>
<a name="l01112"></a>01112   <span class="comment">// the local config file immutable is senseless.</span>
<a name="l01113"></a>01113   <span class="keywordflow">if</span> ( !mGlobalFileName.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>() &amp;&amp; useKDEGlobals &amp;&amp; !bFileImmutable &amp;&amp; !checkAccess(mGlobalFileName,W_OK) )
<a name="l01114"></a>01114   {
<a name="l01115"></a>01115     <span class="keywordflow">if</span> ( errorMsg.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>() )
<a name="l01116"></a>01116       errorMsg = i18n(<span class="stringliteral">&quot;Will not save configuration.\n&quot;</span>);
<a name="l01117"></a>01117     errorMsg += i18n(<span class="stringliteral">&quot;Configuration file \&quot;%1\&quot; not writable.\n&quot;</span>).<a class="codeRef" href="qstring.html#arg">arg</a>(mGlobalFileName);
<a name="l01118"></a>01118     allWritable = <span class="keyword">false</span>;
<a name="l01119"></a>01119   }
<a name="l01120"></a>01120 
<a name="l01121"></a>01121   <span class="keywordflow">if</span> (warnUser &amp;&amp; !allWritable)
<a name="l01122"></a>01122   {
<a name="l01123"></a>01123     <span class="comment">// Note: We don&#39;t ask the user if we should not ask this question again because we can&#39;t save the answer.</span>
<a name="l01124"></a>01124     errorMsg += i18n(<span class="stringliteral">&quot;Please contact your system administrator.&quot;</span>);
<a name="l01125"></a>01125     <a class="codeRef" href="qstring.html">QString</a> cmdToExec = <a class="code" href="classKStandardDirs.html#acff5cb412926a454bcacc6849a4b4a7c" title="Finds the executable in the system path.">KStandardDirs::findExe</a>(<a class="codeRef" href="qstring.html">QString</a>(<span class="stringliteral">&quot;kdialog&quot;</span>));
<a name="l01126"></a>01126     <a class="code" href="classKApplication.html" title="Controls and provides information to all KDE applications.">KApplication</a> *app = kapp;
<a name="l01127"></a>01127     <span class="keywordflow">if</span> (!cmdToExec.<a class="codeRef" href="qstring.html#isEmpty">isEmpty</a>() &amp;&amp; app)
<a name="l01128"></a>01128     {
<a name="l01129"></a>01129       <a class="code" href="classKProcess.html" title="Child process invocation, monitoring and control.">KProcess</a> lprocess;
<a name="l01130"></a>01130       lprocess &lt;&lt; cmdToExec &lt;&lt; <span class="stringliteral">&quot;--title&quot;</span> &lt;&lt; app-&gt;<a class="code" href="classKInstance.html#a6f97644ef0333d52e9a281aaa78d00ca" title="Returns the name of the instance.">instanceName</a>() &lt;&lt; <span class="stringliteral">&quot;--msgbox&quot;</span> &lt;&lt; errorMsg.<a class="codeRef" href="qstring.html#local8Bit">local8Bit</a>();
<a name="l01131"></a>01131       lprocess.<a class="code" href="classKProcess.html#a4720628748fbe8b2373837208ff7b947" title="Starts the process.">start</a>( <a class="code" href="classKProcess.html#a2fbcd413da7eb360ac1a71761f1631b7a4c0c592d5216e0fc288ec95aa76b4f44" title="The application is suspended until the started process is finished.">KProcess::Block</a> );
<a name="l01132"></a>01132     }
<a name="l01133"></a>01133   }
<a name="l01134"></a>01134   <span class="keywordflow">return</span> allWritable;
<a name="l01135"></a>01135 }
</pre></div></div>
</div>
    </div></div>


      </td>
  </tr>
  <tr>
    <td valign="top" id="leftmenu" width="25%">
      <a name="navigation"></a>
      <div class="menu_box"><h2>kdecore</h2>
<div class="nav_list">
<ul><li><a href="index.html">Main Page</a></li><li><a href="modules.html">Modules</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="functions.html">Class Members</a></li><li><a href="pages.html">Related Pages</a></li></ul>
<!--
<h2>Class Picker</h2>
<div style="text-align: center;">
<form name="guideform">
<select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value">
<option value="annotated.html">-- Choose --</option>
  <option value="classKAboutData.html">kaboutdata</option>,  <option value="classKAboutPerson.html">kaboutperson</option>,  <option value="classKAboutTranslator.html">kabouttranslator</option>,  <option value="classKAccel.html">kaccel</option>,  <option value="classKAcceleratorManager.html">kacceleratormanager</option>,  <option value="classKAccelManagerAlgorithm.html">kaccelmanageralgorithm</option>,  <option value="classKAccelShortcutList.html">kaccelshortcutlist</option>,  <option value="classKAccelString.html">kaccelstring</option>,  <option value="classKAddressInfo.html">kaddressinfo</option>,  <option value="classKAppDCOPInterface.html">kappdcopinterface</option>,  <option value="classKApplication.html">kapplication</option>,  <option value="classKAsyncIO.html">kasyncio</option>,  <option value="classKAudioPlayer.html">kaudioplayer</option>,  <option value="classKBufferedIO.html">kbufferedio</option>,  <option value="classKCalendarSystem.html">kcalendarsystem</option>,  <option value="classKCalendarSystemFactory.html">kcalendarsystemfactory</option>,  <option value="classKCalendarSystemJalali.html">kcalendarsystemjalali</option>,  <option value="classKCatalogue.html">kcatalogue</option>,  <option value="classKCharMacroExpander.html">kcharmacroexpander</option>,  <option value="classKCharsets.html">kcharsets</option>,  <option value="classKClipboardSynchronizer.html">kclipboardsynchronizer</option>,  <option value="classKCmdLineArgs.html">kcmdlineargs</option>,  <option value="classKCodecs.html">kcodecs</option>,  <option value="classKCompletion.html">kcompletion</option>,  <option value="classKCompletionBase.html">kcompletionbase</option>,  <option value="classKCompletionMatches.html">kcompletionmatches</option>,  <option value="classKCompTreeNode.html">kcomptreenode</option>,  <option value="classKConfig.html">kconfig</option>,  <option value="classKConfigBackEnd.html">kconfigbackend</option>,  <option value="classKConfigBase.html">kconfigbase</option>,  <option value="classKConfigDialogManager.html">kconfigdialogmanager</option>,  <option value="classKConfigGroup.html">kconfiggroup</option>,  <option value="classKConfigGroupSaver.html">kconfiggroupsaver</option>,  <option value="classKConfigINIBackEnd.html">kconfiginibackend</option>,  <option value="classKConfigSkeleton.html">kconfigskeleton</option>,  <option value="classKConfigSkeleton_1_1ItemBool.html">kconfigskeleton::itembool</option>,  <option value="classKConfigSkeleton_1_1ItemColor.html">kconfigskeleton::itemcolor</option>,  <option value="classKConfigSkeleton_1_1ItemDateTime.html">kconfigskeleton::itemdatetime</option>,  <option value="classKConfigSkeleton_1_1ItemDouble.html">kconfigskeleton::itemdouble</option>,  <option value="classKConfigSkeleton_1_1ItemEnum.html">kconfigskeleton::itemenum</option>,  <option value="classKConfigSkeleton_1_1ItemFont.html">kconfigskeleton::itemfont</option>,  <option value="classKConfigSkeleton_1_1ItemInt.html">kconfigskeleton::itemint</option>,  <option value="classKConfigSkeleton_1_1ItemInt64.html">kconfigskeleton::itemint64</option>,  <option value="classKConfigSkeleton_1_1ItemIntList.html">kconfigskeleton::itemintlist</option>,  <option value="classKConfigSkeleton_1_1ItemLong.html">kconfigskeleton::itemlong</option>,  <option value="classKConfigSkeleton_1_1ItemPassword.html">kconfigskeleton::itempassword</option>,  <option value="classKConfigSkeleton_1_1ItemPath.html">kconfigskeleton::itempath</option>,  <option value="classKConfigSkeleton_1_1ItemPathList.html">kconfigskeleton::itempathlist</option>,  <option value="classKConfigSkeleton_1_1ItemPoint.html">kconfigskeleton::itempoint</option>,  <option value="classKConfigSkeleton_1_1ItemProperty.html">kconfigskeleton::itemproperty</option>,  <option value="classKConfigSkeleton_1_1ItemRect.html">kconfigskeleton::itemrect</option>,  <option value="classKConfigSkeleton_1_1ItemSize.html">kconfigskeleton::itemsize</option>,  <option value="classKConfigSkeleton_1_1ItemString.html">kconfigskeleton::itemstring</option>,  <option value="classKConfigSkeleton_1_1ItemStringList.html">kconfigskeleton::itemstringlist</option>,  <option value="classKConfigSkeleton_1_1ItemUInt.html">kconfigskeleton::itemuint</option>,  <option value="classKConfigSkeleton_1_1ItemUInt64.html">kconfigskeleton::itemuint64</option>,  <option value="classKConfigSkeleton_1_1ItemULong.html">kconfigskeleton::itemulong</option>,  <option value="classKConfigSkeletonItem.html">kconfigskeletonitem</option>,  <option value="classKCrash.html">kcrash</option>,  <option value="classKDCOPPropertyProxy.html">kdcoppropertyproxy</option>,  <option value="classKDebugDCOPIface.html">kdebugdcopiface</option>,  <option value="classKDesktopFile.html">kdesktopfile</option>,  <option value="classKExtendedSocket.html">kextendedsocket</option>,  <option value="classKGenericFactory.html">kgenericfactory</option>,  <option value="classKGenericFactory_3_01KTypeList_3_01Product_00_01ProductListTail_01_4_00_01KTypeList_3_01Pare1ed8d1e5a9847c99711cad3b12c7e96c.html">kgenericfactory< ktypelist< product, productlisttail >, ktypelist< pare1ed8d1e5a9847c99711cad3b12c7e96c</option>,  <option value="classKGenericFactory_3_01KTypeList_3_01Product_00_01ProductListTail_01_4_00_01KTypeList_3_01Paref6a00f76851e0daa2cb662bb8a41fc7f.html">kgenericfactory< ktypelist< product, productlisttail >, ktypelist< paref6a00f76851e0daa2cb662bb8a41fc7f</option>,  <option value="classKGenericFactory_3_01KTypeList_3_01Product_00_01ProductListTail_01_4_00_01QObject_01_4.html">kgenericfactory< ktypelist< product, productlisttail >, qobject ></option>,  <option value="classKGlobal.html">kglobal</option>,  <option value="classKGlobalAccel.html">kglobalaccel</option>,  <option value="classKGlobalSettings.html">kglobalsettings</option>,  <option value="classKIcon.html">kicon</option>,  <option value="classKIconEffect.html">kiconeffect</option>,  <option value="classKIconLoader.html">kiconloader</option>,  <option value="classKIconTheme.html">kicontheme</option>,  <option value="classKInetSocketAddress.html">kinetsocketaddress</option>,  <option value="classKInstance.html">kinstance</option>,  <option value="classKIOBufferBase.html">kiobufferbase</option>,  <option value="classKIPC.html">kipc</option>,  <option value="classKKey.html">kkey</option>,  <option value="classKKeyNative.html">kkeynative</option>,  <option value="classKKeySequence.html">kkeysequence</option>,  <option value="classKLibFactory.html">klibfactory</option>,  <option value="classKLibLoader.html">klibloader</option>,  <option value="classKLibrary.html">klibrary</option>,  <option value="classKLocale.html">klocale</option>,  <option value="classKLockFile.html">klockfile</option>,  <option value="classKMacroExpanderBase.html">kmacroexpanderbase</option>,  <option value="classKMD4.html">kmd4</option>,  <option value="classKMD5.html">kmd5</option>,  <option value="classKMimeSourceFactory.html">kmimesourcefactory</option>,  <option value="classKMountPoint.html">kmountpoint</option>,  <option value="classKMultipleDrag.html">kmultipledrag</option>,  <option value="classKNetwork_1_1KActiveSocketBase.html">knetwork::kactivesocketbase</option>,  <option value="classKNetwork_1_1KBufferedSocket.html">knetwork::kbufferedsocket</option>,  <option value="classKNetwork_1_1KClientSocketBase.html">knetwork::kclientsocketbase</option>,  <option value="classKNetwork_1_1KDatagramPacket.html">knetwork::kdatagrampacket</option>,  <option value="classKNetwork_1_1KDatagramSocket.html">knetwork::kdatagramsocket</option>,  <option value="classKNetwork_1_1KHttpProxySocketDevice.html">knetwork::khttpproxysocketdevice</option>,  <option value="classKNetwork_1_1KInetSocketAddress.html">knetwork::kinetsocketaddress</option>,  <option value="classKNetwork_1_1KIpAddress.html">knetwork::kipaddress</option>,  <option value="classKNetwork_1_1KMulticastSocket.html">knetwork::kmulticastsocket</option>,  <option value="classKNetwork_1_1KMulticastSocketImpl.html">knetwork::kmulticastsocketimpl</option>,  <option value="classKNetwork_1_1KNetworkInterface.html">knetwork::knetworkinterface</option>,  <option value="classKNetwork_1_1KPassiveSocketBase.html">knetwork::kpassivesocketbase</option>,  <option value="classKNetwork_1_1KResolver.html">knetwork::kresolver</option>,  <option value="classKNetwork_1_1KResolverEntry.html">knetwork::kresolverentry</option>,  <option value="classKNetwork_1_1KResolverResults.html">knetwork::kresolverresults</option>,  <option value="classKNetwork_1_1KResolverWorkerBase_1_1ResolverLocker.html">knetwork::kresolverworkerbase::resolverlocker</option>,  <option value="classKNetwork_1_1KReverseResolver.html">knetwork::kreverseresolver</option>,  <option value="classKNetwork_1_1KServerSocket.html">knetwork::kserversocket</option>,  <option value="classKNetwork_1_1KSocketAddress.html">knetwork::ksocketaddress</option>,  <option value="classKNetwork_1_1KSocketBase.html">knetwork::ksocketbase</option>,  <option value="classKNetwork_1_1KSocketDevice.html">knetwork::ksocketdevice</option>,  <option value="classKNetwork_1_1KSocketDeviceFactory.html">knetwork::ksocketdevicefactory</option>,  <option value="classKNetwork_1_1KSocksSocketDevice.html">knetwork::ksockssocketdevice</option>,  <option value="classKNetwork_1_1KStreamSocket.html">knetwork::kstreamsocket</option>,  <option value="classKNetwork_1_1KUnixSocketAddress.html">knetwork::kunixsocketaddress</option>,  <option value="classKNotifyClient_1_1Instance.html">knotifyclient::instance</option>,  <option value="classKPalette.html">kpalette</option>,  <option value="classKPixmapProvider.html">kpixmapprovider</option>,  <option value="classKPopupAccelManager.html">kpopupaccelmanager</option>,  <option value="classKProcess.html">kprocess</option>,  <option value="classKProcessController.html">kprocesscontroller</option>,  <option value="classKProcIO.html">kprocio</option>,  <option value="classKProtocolInfoFactory.html">kprotocolinfofactory</option>,  <option value="classKPty.html">kpty</option>,  <option value="classKRandomSequence.html">krandomsequence</option>,  <option value="classKRegExp.html">kregexp</option>,  <option value="classKRegExpPrivate.html">kregexpprivate</option>,  <option value="classKRFCDate.html">krfcdate</option>,  <option value="classKRootProp.html">krootprop</option>,  <option value="classKSaveFile.html">ksavefile</option>,  <option value="classKServerSocket.html">kserversocket</option>,  <option value="classKSessionManaged.html">ksessionmanaged</option>,  <option value="classKShared.html">kshared</option>,  <option value="classKSharedConfig.html">ksharedconfig</option>,  <option value="classKSharedPtr.html">ksharedptr</option>,  <option value="classKShellProcess.html">kshellprocess</option>,  <option value="classKShortcut.html">kshortcut</option>,  <option value="classKShortcutList.html">kshortcutlist</option>,  <option value="classKSimpleConfig.html">ksimpleconfig</option>,  <option value="classKSocket.html">ksocket</option>,  <option value="classKSocketAddress.html">ksocketaddress</option>,  <option value="classKSocks.html">ksocks</option>,  <option value="classKSortableItem.html">ksortableitem</option>,  <option value="classKSortableValueList.html">ksortablevaluelist</option>,  <option value="classKStandardDirs.html">kstandarddirs</option>,  <option value="classKStaticDeleter.html">kstaticdeleter</option>,  <option value="classKStaticDeleterBase.html">kstaticdeleterbase</option>,  <option value="classKStdAccel_1_1ShortcutList.html">kstdaccel::shortcutlist</option>,  <option value="classKStringHandler.html">kstringhandler</option>,  <option value="classKSycocaEntry.html">ksycocaentry</option>,  <option value="classKSycocaFactoryList.html">ksycocafactorylist</option>,  <option value="classKTempDir.html">ktempdir</option>,  <option value="classKTempFile.html">ktempfile</option>,  <option value="classKTimezone.html">ktimezone</option>,  <option value="classKTimezoneDetails.html">ktimezonedetails</option>,  <option value="classKTimezones.html">ktimezones</option>,  <option value="classKTimezoneSource.html">ktimezonesource</option>,  <option value="classKUniqueApplication.html">kuniqueapplication</option>,  <option value="classKUnixSocketAddress.html">kunixsocketaddress</option>,  <option value="classKURL.html">kurl</option>,  <option value="classKURL_1_1List.html">kurl::list</option>,  <option value="classKURLDrag.html">kurldrag</option>,  <option value="classKUser.html">kuser</option>,  <option value="classKUserGroup.html">kusergroup</option>,  <option value="classKVMAllocator.html">kvmallocator</option>,  <option value="classKWin.html">kwin</option>,  <option value="classKWin_1_1WindowInfo.html">kwin::windowinfo</option>,  <option value="classKWinModule.html">kwinmodule</option>,  <option value="classKWordMacroExpander.html">kwordmacroexpander</option>,  <option value="classKXErrorHandler.html">kxerrorhandler</option>,  <option value="classKZoneAllocator.html">kzoneallocator</option>,  <option value="classNET.html">net</option>,
</select>
</form>
</div>
-->
</div></div>
<div class="menu_box"><h2>API Dox</h2>
<div class="nav_list">
<ul>
<li><a href="../../arts/html/index.html">arts</a></li><li><a href="../../dcop/html/index.html">dcop</a></li><li><a href="../../dnssd/html/index.html">dnssd</a></li><li><a href="../../interfaces/html/index.html">interfaces</a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../../interfaces/kimproxy/interface/html/index.html">interface</a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../../interfaces/kimproxy/library/html/index.html">library</a></li><li>&nbsp;&nbsp;<a href="../../interfaces/kspeech/html/index.html">kspeech</a></li><li>&nbsp;&nbsp;<a href="../../interfaces/ktexteditor/html/index.html">ktexteditor</a></li><li><a href="../../kabc/html/index.html">kabc</a></li><li><a href="../../kate/html/index.html">kate</a></li><li><a href="../../kcmshell/html/index.html">kcmshell</a></li><li><a href="../../kdecore/html/index.html">kdecore</a></li><li><a href="../../kded/html/index.html">kded</a></li><li><a href="../../kdefx/html/index.html">kdefx</a></li><li><a href="../../kdeprint/html/index.html">kdeprint</a></li><li><a href="../../kdesu/html/index.html">kdesu</a></li><li><a href="../../kdeui/html/index.html">kdeui</a></li><li><a href="../../kdoctools/html/index.html">kdoctools</a></li><li><a href="../../khtml/html/index.html">khtml</a></li><li><a href="../../kimgio/html/index.html">kimgio</a></li><li><a href="../../kinit/html/index.html">kinit</a></li><li><a href="../../kio/html/index.html">kio</a></li><li>&nbsp;&nbsp;<a href="../../kio/bookmarks/html/index.html">bookmarks</a></li><li>&nbsp;&nbsp;<a href="../../kio/httpfilter/html/index.html">httpfilter</a></li><li>&nbsp;&nbsp;<a href="../../kio/kfile/html/index.html">kfile</a></li><li>&nbsp;&nbsp;<a href="../../kio/kio/html/index.html">kio</a></li><li>&nbsp;&nbsp;<a href="../../kio/kioexec/html/index.html">kioexec</a></li><li>&nbsp;&nbsp;<a href="../../kio/kpasswdserver/html/index.html">kpasswdserver</a></li><li>&nbsp;&nbsp;<a href="../../kio/kssl/html/index.html">kssl</a></li><li><a href="../../kioslave/html/index.html">kioslave</a></li><li>&nbsp;&nbsp;<a href="../../kioslave/http/html/index.html">http</a></li><li><a href="../../kjs/html/index.html">kjs</a></li><li><a href="../../kmdi/html/index.html">kmdi</a></li><li>&nbsp;&nbsp;<a href="../../kmdi/kmdi/html/index.html">kmdi</a></li><li><a href="../../knewstuff/html/index.html">knewstuff</a></li><li><a href="../../kparts/html/index.html">kparts</a></li><li><a href="../../kresources/html/index.html">kresources</a></li><li><a href="../../kspell2/html/index.html">kspell2</a></li><li><a href="../../kunittest/html/index.html">kunittest</a></li><li><a href="../../kutils/html/index.html">kutils</a></li><li><a href="../../kwallet/html/index.html">kwallet</a></li><li><a href="../../libkmid/html/index.html">libkmid</a></li><li><a href="../../libkscreensaver/html/index.html">libkscreensaver</a></li>
</ul></div></div>


        </td>
</tr>
</table>

<span class="doNotDisplay">
  <a href="http://www.kde.org/" accesskey="8">KDE Home</a> |
  <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> |
  <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a>
</span>


<div style="height: 8px"></div>

<div id="footer">
  <div id="footer_left">
    Maintained by <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;groo&#116;&#64;kde&#46;or&#x67;">Adriaan de Groot</a>
and
<a href="&#109;a&#105;&#108;&#116;&#111;&#58;w&#105;nter&#64;kde&#46;or&#x67">Allen Winter</a>.
<br/>
    KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> |
    <a href="http://www.kde.org/contact/impressum.php">Legal</a>
  </div>
  <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div>
</div>

<!--
WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL
BE BLOCKED INSTANTLY AND PERMANENTLY!
<a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a>
WARNING END
-->

</body>
</html>