Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > media > main-release > by-pkgid > ea24284f03fd4a8a4b64047514d93f64 > files > 283

lib64kdegames1-devel-3.5.9-2mdv2008.1.x86_64.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>libkdegames: kexthighscore_internal.cpp Source File (libkdegames)</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=".">libkdegames</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.5.5 -->
<h1>kexthighscore_internal.cpp</h1><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 games library</span>
<a name="l00003"></a>00003 <span class="comment">    Copyright (C) 2001-2004 Nicolas Hadacek (hadacek@kde.org)</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment">    This library is free software; you can redistribute it and/or</span>
<a name="l00006"></a>00006 <span class="comment">    modify it under the terms of the GNU Library General Public</span>
<a name="l00007"></a>00007 <span class="comment">    License version 2 as published by the Free Software Foundation.</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment">    This library is distributed in the hope that it will be useful,</span>
<a name="l00010"></a>00010 <span class="comment">    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00011"></a>00011 <span class="comment">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00012"></a>00012 <span class="comment">    Library General Public License for more details.</span>
<a name="l00013"></a>00013 <span class="comment"></span>
<a name="l00014"></a>00014 <span class="comment">    You should have received a copy of the GNU Library General Public License</span>
<a name="l00015"></a>00015 <span class="comment">    along with this library; see the file COPYING.LIB.  If not, write to</span>
<a name="l00016"></a>00016 <span class="comment">    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span>
<a name="l00017"></a>00017 <span class="comment">    Boston, MA 02110-1301, USA.</span>
<a name="l00018"></a>00018 <span class="comment">*/</span>
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="preprocessor">#include "kexthighscore_internal.h"</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;pwd.h&gt;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00025"></a>00025 
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;qfile.h&gt;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;qlayout.h&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;qdom.h&gt;</span>
<a name="l00029"></a>00029 
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;kglobal.h&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;kio/netaccess.h&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;kio/job.h&gt;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;kmessagebox.h&gt;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;kmdcodec.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;kdebug.h&gt;</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="preprocessor">#include "config.h"</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include "kexthighscore.h"</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include "kexthighscore_gui.h"</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include "kemailsettings.h"</span>
<a name="l00041"></a>00041 
<a name="l00042"></a>00042 
<a name="l00043"></a>00043 <span class="keyword">namespace </span>KExtHighscore
<a name="l00044"></a>00044 {
<a name="l00045"></a>00045 
<a name="l00046"></a>00046 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00047"></a>00047 <span class="keyword">const</span> <span class="keywordtype">char</span> ItemContainer::ANONYMOUS[] = <span class="stringliteral">"_"</span>;
<a name="l00048"></a>00048 <span class="keyword">const</span> <span class="keywordtype">char</span> ItemContainer::ANONYMOUS_LABEL[] = I18N_NOOP(<span class="stringliteral">"anonymous"</span>);
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 ItemContainer::ItemContainer()
<a name="l00051"></a>00051     : _item(0)
<a name="l00052"></a>00052 {}
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 ItemContainer::~ItemContainer()
<a name="l00055"></a>00055 {
<a name="l00056"></a>00056     <span class="keyword">delete</span> _item;
<a name="l00057"></a>00057 }
<a name="l00058"></a>00058 
<a name="l00059"></a>00059 <span class="keywordtype">void</span> ItemContainer::setItem(Item *item)
<a name="l00060"></a>00060 {
<a name="l00061"></a>00061     <span class="keyword">delete</span> _item;
<a name="l00062"></a>00062     _item = item;
<a name="l00063"></a>00063 }
<a name="l00064"></a>00064 
<a name="l00065"></a>00065 QString ItemContainer::entryName()<span class="keyword"> const</span>
<a name="l00066"></a>00066 <span class="keyword"></span>{
<a name="l00067"></a>00067     <span class="keywordflow">if</span> ( _subGroup.isEmpty() ) <span class="keywordflow">return</span> _name;
<a name="l00068"></a>00068     <span class="keywordflow">return</span> _name + <span class="stringliteral">"_"</span> + _subGroup;
<a name="l00069"></a>00069 }
<a name="l00070"></a>00070 
<a name="l00071"></a>00071 QVariant ItemContainer::read(uint i)<span class="keyword"> const</span>
<a name="l00072"></a>00072 <span class="keyword"></span>{
<a name="l00073"></a>00073     Q_ASSERT(_item);
<a name="l00074"></a>00074 
<a name="l00075"></a>00075     QVariant v = _item-&gt;defaultValue();
<a name="l00076"></a>00076     <span class="keywordflow">if</span> ( isStored() ) {
<a name="l00077"></a>00077         <span class="keyword">internal</span>-&gt;hsConfig().setHighscoreGroup(_group);
<a name="l00078"></a>00078         v = <span class="keyword">internal</span>-&gt;hsConfig().readPropertyEntry(i+1, entryName(), v);
<a name="l00079"></a>00079     }
<a name="l00080"></a>00080     <span class="keywordflow">return</span> _item-&gt;read(i, v);
<a name="l00081"></a>00081 }
<a name="l00082"></a>00082 
<a name="l00083"></a>00083 QString ItemContainer::pretty(uint i)<span class="keyword"> const</span>
<a name="l00084"></a>00084 <span class="keyword"></span>{
<a name="l00085"></a>00085     Q_ASSERT(_item);
<a name="l00086"></a>00086     <span class="keywordflow">return</span> _item-&gt;pretty(i, read(i));
<a name="l00087"></a>00087 }
<a name="l00088"></a>00088 
<a name="l00089"></a>00089 <span class="keywordtype">void</span> ItemContainer::write(uint i, <span class="keyword">const</span> QVariant &amp;value)<span class="keyword"> const</span>
<a name="l00090"></a>00090 <span class="keyword"></span>{
<a name="l00091"></a>00091     Q_ASSERT( isStored() );
<a name="l00092"></a>00092     Q_ASSERT( internal-&gt;hsConfig().isLocked() );
<a name="l00093"></a>00093     <span class="keyword">internal</span>-&gt;hsConfig().setHighscoreGroup(_group);
<a name="l00094"></a>00094     <span class="keyword">internal</span>-&gt;hsConfig().writeEntry(i+1, entryName(), value);
<a name="l00095"></a>00095 }
<a name="l00096"></a>00096 
<a name="l00097"></a>00097 uint ItemContainer::increment(uint i)<span class="keyword"> const</span>
<a name="l00098"></a>00098 <span class="keyword"></span>{
<a name="l00099"></a>00099     uint v = read(i).toUInt() + 1;
<a name="l00100"></a>00100     write(i, v);
<a name="l00101"></a>00101     <span class="keywordflow">return</span> v;
<a name="l00102"></a>00102 }
<a name="l00103"></a>00103 
<a name="l00104"></a>00104 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00105"></a>00105 ItemArray::ItemArray()
<a name="l00106"></a>00106     : _group(<span class="stringliteral">""</span>), _subGroup(<span class="stringliteral">""</span>) <span class="comment">// no null groups</span>
<a name="l00107"></a>00107 {}
<a name="l00108"></a>00108 
<a name="l00109"></a>00109 ItemArray::~ItemArray()
<a name="l00110"></a>00110 {
<a name="l00111"></a>00111     <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++) <span class="keyword">delete</span> at(i);
<a name="l00112"></a>00112 }
<a name="l00113"></a>00113 
<a name="l00114"></a>00114 <span class="keywordtype">int</span> ItemArray::findIndex(<span class="keyword">const</span> QString &amp;name)<span class="keyword"> const</span>
<a name="l00115"></a>00115 <span class="keyword"></span>{
<a name="l00116"></a>00116     <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++)
<a name="l00117"></a>00117         <span class="keywordflow">if</span> ( at(i)-&gt;name()==name ) <span class="keywordflow">return</span> i;
<a name="l00118"></a>00118     <span class="keywordflow">return</span> -1;
<a name="l00119"></a>00119 }
<a name="l00120"></a>00120 
<a name="l00121"></a>00121 <span class="keyword">const</span> ItemContainer *ItemArray::item(<span class="keyword">const</span> QString &amp;name)<span class="keyword"> const</span>
<a name="l00122"></a>00122 <span class="keyword"></span>{
<a name="l00123"></a>00123     <span class="keywordtype">int</span> i = findIndex(name);
<a name="l00124"></a>00124     <span class="keywordflow">if</span> ( i==-1 ) kdError(11002) &lt;&lt; k_funcinfo &lt;&lt; <span class="stringliteral">"no item named \""</span> &lt;&lt; name
<a name="l00125"></a>00125                                 &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; endl;
<a name="l00126"></a>00126     <span class="keywordflow">return</span> at(i);
<a name="l00127"></a>00127 }
<a name="l00128"></a>00128 
<a name="l00129"></a>00129 ItemContainer *ItemArray::item(<span class="keyword">const</span> QString &amp;name)
<a name="l00130"></a>00130 {
<a name="l00131"></a>00131     <span class="keywordtype">int</span> i = findIndex(name);
<a name="l00132"></a>00132     <span class="keywordflow">if</span> ( i==-1 ) kdError(11002) &lt;&lt; k_funcinfo &lt;&lt; <span class="stringliteral">"no item named \""</span> &lt;&lt; name
<a name="l00133"></a>00133                                 &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; endl;
<a name="l00134"></a>00134     <span class="keywordflow">return</span> at(i);
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136 
<a name="l00137"></a>00137 <span class="keywordtype">void</span> ItemArray::setItem(<span class="keyword">const</span> QString &amp;name, Item *item)
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139     <span class="keywordtype">int</span> i = findIndex(name);
<a name="l00140"></a>00140     <span class="keywordflow">if</span> ( i==-1 ) kdError(11002) &lt;&lt; k_funcinfo &lt;&lt; <span class="stringliteral">"no item named \""</span> &lt;&lt; name
<a name="l00141"></a>00141                                 &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; endl;
<a name="l00142"></a>00142     <span class="keywordtype">bool</span> stored = at(i)-&gt;isStored();
<a name="l00143"></a>00143     <span class="keywordtype">bool</span> canHaveSubGroup = at(i)-&gt;canHaveSubGroup();
<a name="l00144"></a>00144     _setItem(i, name, item, stored, canHaveSubGroup);
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 
<a name="l00147"></a>00147 <span class="keywordtype">void</span> ItemArray::addItem(<span class="keyword">const</span> QString &amp;name, Item *item,
<a name="l00148"></a>00148                         <span class="keywordtype">bool</span> stored, <span class="keywordtype">bool</span> canHaveSubGroup)
<a name="l00149"></a>00149 {
<a name="l00150"></a>00150     <span class="keywordflow">if</span> ( findIndex(name)!=-1 )
<a name="l00151"></a>00151         kdError(11002) &lt;&lt; <span class="stringliteral">"item already exists \""</span> &lt;&lt; name &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; endl;
<a name="l00152"></a>00152     uint i = size();
<a name="l00153"></a>00153     resize(i+1);
<a name="l00154"></a>00154     at(i) = <span class="keyword">new</span> ItemContainer;
<a name="l00155"></a>00155     _setItem(i, name, item, stored, canHaveSubGroup);
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157 
<a name="l00158"></a>00158 <span class="keywordtype">void</span> ItemArray::_setItem(uint i, <span class="keyword">const</span> QString &amp;name, Item *item,
<a name="l00159"></a>00159                          <span class="keywordtype">bool</span> stored, <span class="keywordtype">bool</span> canHaveSubGroup)
<a name="l00160"></a>00160 {
<a name="l00161"></a>00161     at(i)-&gt;setItem(item);
<a name="l00162"></a>00162     at(i)-&gt;setName(name);
<a name="l00163"></a>00163     at(i)-&gt;setGroup(stored ? _group : QString::null);
<a name="l00164"></a>00164     at(i)-&gt;setSubGroup(canHaveSubGroup ? _subGroup : QString::null);
<a name="l00165"></a>00165 }
<a name="l00166"></a>00166 
<a name="l00167"></a>00167 <span class="keywordtype">void</span> ItemArray::setGroup(<span class="keyword">const</span> QString &amp;group)
<a name="l00168"></a>00168 {
<a name="l00169"></a>00169     Q_ASSERT( !group.isNull() );
<a name="l00170"></a>00170     _group = group;
<a name="l00171"></a>00171     <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++)
<a name="l00172"></a>00172         <span class="keywordflow">if</span> ( at(i)-&gt;isStored() ) at(i)-&gt;setGroup(group);
<a name="l00173"></a>00173 }
<a name="l00174"></a>00174 
<a name="l00175"></a>00175 <span class="keywordtype">void</span> ItemArray::setSubGroup(<span class="keyword">const</span> QString &amp;subGroup)
<a name="l00176"></a>00176 {
<a name="l00177"></a>00177     Q_ASSERT( !subGroup.isNull() );
<a name="l00178"></a>00178     _subGroup = subGroup;
<a name="l00179"></a>00179     <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++)
<a name="l00180"></a>00180         <span class="keywordflow">if</span> ( at(i)-&gt;canHaveSubGroup() ) at(i)-&gt;setSubGroup(subGroup);
<a name="l00181"></a>00181 }
<a name="l00182"></a>00182 
<a name="l00183"></a>00183 <span class="keywordtype">void</span> ItemArray::read(uint k, Score &amp;data)<span class="keyword"> const</span>
<a name="l00184"></a>00184 <span class="keyword"></span>{
<a name="l00185"></a>00185     <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++) {
<a name="l00186"></a>00186         <span class="keywordflow">if</span> ( !at(i)-&gt;isStored() ) <span class="keywordflow">continue</span>;
<a name="l00187"></a>00187         data.setData(at(i)-&gt;name(), at(i)-&gt;read(k));
<a name="l00188"></a>00188     }
<a name="l00189"></a>00189 }
<a name="l00190"></a>00190 
<a name="l00191"></a>00191 <span class="keywordtype">void</span> ItemArray::write(uint k, <span class="keyword">const</span> Score &amp;data, uint nb)<span class="keyword"> const</span>
<a name="l00192"></a>00192 <span class="keyword"></span>{
<a name="l00193"></a>00193     <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++) {
<a name="l00194"></a>00194         <span class="keywordflow">if</span> ( !at(i)-&gt;isStored() ) <span class="keywordflow">continue</span>;
<a name="l00195"></a>00195         <span class="keywordflow">for</span> (uint j=nb-1; j&gt;k; j--)  at(i)-&gt;write(j, at(i)-&gt;read(j-1));
<a name="l00196"></a>00196         at(i)-&gt;write(k, data.data(at(i)-&gt;name()));
<a name="l00197"></a>00197     }
<a name="l00198"></a>00198 }
<a name="l00199"></a>00199 
<a name="l00200"></a>00200 <span class="keywordtype">void</span> ItemArray::exportToText(QTextStream &amp;s)<span class="keyword"> const</span>
<a name="l00201"></a>00201 <span class="keyword"></span>{
<a name="l00202"></a>00202     <span class="keywordflow">for</span> (uint k=0; k&lt;nbEntries()+1; k++) {
<a name="l00203"></a>00203         <span class="keywordflow">for</span> (uint i=0; i&lt;size(); i++) {
<a name="l00204"></a>00204             <span class="keyword">const</span> Item *item = at(i)-&gt;item();
<a name="l00205"></a>00205             <span class="keywordflow">if</span> ( item-&gt;isVisible() ) {
<a name="l00206"></a>00206                 <span class="keywordflow">if</span> ( i!=0 ) s &lt;&lt; <span class="charliteral">'\t'</span>;
<a name="l00207"></a>00207                 <span class="keywordflow">if</span> ( k==0 ) s &lt;&lt; item-&gt;label();
<a name="l00208"></a>00208                 <span class="keywordflow">else</span> s &lt;&lt; at(i)-&gt;pretty(k-1);
<a name="l00209"></a>00209             }
<a name="l00210"></a>00210         }
<a name="l00211"></a>00211         s &lt;&lt; endl;
<a name="l00212"></a>00212     }
<a name="l00213"></a>00213 }
<a name="l00214"></a>00214 
<a name="l00215"></a>00215 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00216"></a>00216 <span class="keyword">class </span>ScoreNameItem : <span class="keyword">public</span> NameItem
<a name="l00217"></a>00217 {
<a name="l00218"></a>00218  <span class="keyword">public</span>:
<a name="l00219"></a>00219     ScoreNameItem(<span class="keyword">const</span> ScoreInfos &amp;score, <span class="keyword">const</span> PlayerInfos &amp;infos)
<a name="l00220"></a>00220         : _score(score), _infos(infos) {}
<a name="l00221"></a>00221 
<a name="l00222"></a>00222     QString pretty(uint i, <span class="keyword">const</span> QVariant &amp;v)<span class="keyword"> const </span>{
<a name="l00223"></a>00223         uint <span class="keywordtype">id</span> = _score.item(<span class="stringliteral">"id"</span>)-&gt;read(i).toUInt();
<a name="l00224"></a>00224         <span class="keywordflow">if</span> ( <span class="keywordtype">id</span>==0 ) <span class="keywordflow">return</span> NameItem::pretty(i, v);
<a name="l00225"></a>00225         <span class="keywordflow">return</span> _infos.prettyName(<span class="keywordtype">id</span>-1);
<a name="l00226"></a>00226     }
<a name="l00227"></a>00227 
<a name="l00228"></a>00228  <span class="keyword">private</span>:
<a name="l00229"></a>00229     <span class="keyword">const</span> ScoreInfos  &amp;_score;
<a name="l00230"></a>00230     <span class="keyword">const</span> PlayerInfos &amp;_infos;
<a name="l00231"></a>00231 };
<a name="l00232"></a>00232 
<a name="l00233"></a>00233 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00234"></a>00234 ScoreInfos::ScoreInfos(uint maxNbEntries, <span class="keyword">const</span> PlayerInfos &amp;infos)
<a name="l00235"></a>00235     : _maxNbEntries(maxNbEntries)
<a name="l00236"></a>00236 {
<a name="l00237"></a>00237     addItem(<span class="stringliteral">"id"</span>, <span class="keyword">new</span> Item((uint)0));
<a name="l00238"></a>00238     addItem(<span class="stringliteral">"rank"</span>, <span class="keyword">new</span> RankItem, <span class="keyword">false</span>);
<a name="l00239"></a>00239     addItem(<span class="stringliteral">"name"</span>, <span class="keyword">new</span> ScoreNameItem(*<span class="keyword">this</span>, infos));
<a name="l00240"></a>00240     addItem(<span class="stringliteral">"score"</span>, <a class="code" href="classKExtHighscore_1_1Manager.html#733e38793f9a34229138fce4dcfdb482" title="Create a predefined item.">Manager::createItem</a>(Manager::ScoreDefault));
<a name="l00241"></a>00241     addItem(<span class="stringliteral">"date"</span>, <span class="keyword">new</span> DateItem);
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243 
<a name="l00244"></a>00244 uint ScoreInfos::nbEntries()<span class="keyword"> const</span>
<a name="l00245"></a>00245 <span class="keyword"></span>{
<a name="l00246"></a>00246     uint i = 0;
<a name="l00247"></a>00247     <span class="keywordflow">for</span> (; i&lt;_maxNbEntries; i++)
<a name="l00248"></a>00248         <span class="keywordflow">if</span> ( item(<span class="stringliteral">"score"</span>)-&gt;read(i)==item(<span class="stringliteral">"score"</span>)-&gt;item()-&gt;defaultValue() )
<a name="l00249"></a>00249             <span class="keywordflow">break</span>;
<a name="l00250"></a>00250     <span class="keywordflow">return</span> i;
<a name="l00251"></a>00251 }
<a name="l00252"></a>00252 
<a name="l00253"></a>00253 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00254"></a>00254 <span class="keyword">const</span> <span class="keywordtype">char</span> *HS_ID              = <span class="stringliteral">"player id"</span>;
<a name="l00255"></a>00255 <span class="keyword">const</span> <span class="keywordtype">char</span> *HS_REGISTERED_NAME = <span class="stringliteral">"registered name"</span>;
<a name="l00256"></a>00256 <span class="keyword">const</span> <span class="keywordtype">char</span> *HS_KEY             = <span class="stringliteral">"player key"</span>;
<a name="l00257"></a>00257 <span class="keyword">const</span> <span class="keywordtype">char</span> *HS_WW_ENABLED      = <span class="stringliteral">"ww hs enabled"</span>;
<a name="l00258"></a>00258 
<a name="l00259"></a>00259 PlayerInfos::PlayerInfos()
<a name="l00260"></a>00260 {
<a name="l00261"></a>00261     setGroup(<span class="stringliteral">"players"</span>);
<a name="l00262"></a>00262 
<a name="l00263"></a>00263     <span class="comment">// standard items</span>
<a name="l00264"></a>00264     addItem(<span class="stringliteral">"name"</span>, <span class="keyword">new</span> NameItem);
<a name="l00265"></a>00265     Item *it = <span class="keyword">new</span> Item((uint)0, i18n(<span class="stringliteral">"Games Count"</span>),Qt::AlignRight);
<a name="l00266"></a>00266     addItem(<span class="stringliteral">"nb games"</span>, it, <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00267"></a>00267     it = <a class="code" href="classKExtHighscore_1_1Manager.html#733e38793f9a34229138fce4dcfdb482" title="Create a predefined item.">Manager::createItem</a>(Manager::MeanScoreDefault);
<a name="l00268"></a>00268     addItem(<span class="stringliteral">"mean score"</span>, it, <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00269"></a>00269     it = <a class="code" href="classKExtHighscore_1_1Manager.html#733e38793f9a34229138fce4dcfdb482" title="Create a predefined item.">Manager::createItem</a>(Manager::BestScoreDefault);
<a name="l00270"></a>00270     addItem(<span class="stringliteral">"best score"</span>, it, <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00271"></a>00271     addItem(<span class="stringliteral">"date"</span>, <span class="keyword">new</span> DateItem, <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00272"></a>00272     it = <span class="keyword">new</span> Item(QString::null, i18n(<span class="stringliteral">"Comment"</span>), Qt::AlignLeft);
<a name="l00273"></a>00273     addItem(<span class="stringliteral">"comment"</span>, it);
<a name="l00274"></a>00274 
<a name="l00275"></a>00275     <span class="comment">// statistics items</span>
<a name="l00276"></a>00276     addItem(<span class="stringliteral">"nb black marks"</span>, <span class="keyword">new</span> Item((uint)0), <span class="keyword">true</span>, <span class="keyword">true</span>); <span class="comment">// legacy</span>
<a name="l00277"></a>00277     addItem(<span class="stringliteral">"nb lost games"</span>, <span class="keyword">new</span> Item((uint)0), <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00278"></a>00278     addItem(<span class="stringliteral">"nb draw games"</span>, <span class="keyword">new</span> Item((uint)0), <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00279"></a>00279     addItem(<span class="stringliteral">"current trend"</span>, <span class="keyword">new</span> Item((<span class="keywordtype">int</span>)0), <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00280"></a>00280     addItem(<span class="stringliteral">"max lost trend"</span>, <span class="keyword">new</span> Item((uint)0), <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00281"></a>00281     addItem(<span class="stringliteral">"max won trend"</span>, <span class="keyword">new</span> Item((uint)0), <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00282"></a>00282 
<a name="l00283"></a>00283     <span class="keyword">struct </span>passwd *pwd = getpwuid(getuid());
<a name="l00284"></a>00284     QString username = pwd-&gt;pw_name;
<a name="l00285"></a>00285 <span class="preprocessor">#ifdef HIGHSCORE_DIRECTORY</span>
<a name="l00286"></a>00286 <span class="preprocessor"></span>    <span class="keyword">internal</span>-&gt;hsConfig().setHighscoreGroup(<span class="stringliteral">"players"</span>);
<a name="l00287"></a>00287     <span class="keywordflow">for</span> (uint i=0; ;i++) {
<a name="l00288"></a>00288         <span class="keywordflow">if</span> ( !internal-&gt;hsConfig().hasEntry(i+1, <span class="stringliteral">"username"</span>) ) {
<a name="l00289"></a>00289             _newPlayer = <span class="keyword">true</span>;
<a name="l00290"></a>00290             _id = i;
<a name="l00291"></a>00291             <span class="keywordflow">break</span>;
<a name="l00292"></a>00292         }
<a name="l00293"></a>00293         <span class="keywordflow">if</span> ( internal-&gt;hsConfig().readEntry(i+1, <span class="stringliteral">"username"</span>)==username ) {
<a name="l00294"></a>00294             _newPlayer = <span class="keyword">false</span>;
<a name="l00295"></a>00295             _id = i;
<a name="l00296"></a>00296             <span class="keywordflow">return</span>;
<a name="l00297"></a>00297         }
<a name="l00298"></a>00298     }
<a name="l00299"></a>00299 <span class="preprocessor">#endif</span>
<a name="l00300"></a>00300 <span class="preprocessor"></span>    <span class="keyword">internal</span>-&gt;hsConfig().lockForWriting();
<a name="l00301"></a>00301     KEMailSettings emailConfig;
<a name="l00302"></a>00302     emailConfig.setProfile(emailConfig.defaultProfileName());
<a name="l00303"></a>00303     QString name = emailConfig.getSetting(KEMailSettings::RealName);
<a name="l00304"></a>00304     <span class="keywordflow">if</span> ( name.isEmpty() || isNameUsed(name) ) name = username;
<a name="l00305"></a>00305     <span class="keywordflow">if</span> ( isNameUsed(name) ) name= QString(ItemContainer::ANONYMOUS);
<a name="l00306"></a>00306 <span class="preprocessor">#ifdef HIGHSCORE_DIRECTORY</span>
<a name="l00307"></a>00307 <span class="preprocessor"></span>    <span class="keyword">internal</span>-&gt;hsConfig().writeEntry(_id+1, <span class="stringliteral">"username"</span>, username);
<a name="l00308"></a>00308     item(<span class="stringliteral">"name"</span>)-&gt;write(_id, name);
<a name="l00309"></a>00309 <span class="preprocessor">#endif</span>
<a name="l00310"></a>00310 <span class="preprocessor"></span>
<a name="l00311"></a>00311     ConfigGroup cg;
<a name="l00312"></a>00312     _oldLocalPlayer = cg.config()-&gt;hasKey(HS_ID);
<a name="l00313"></a>00313     _oldLocalId = cg.config()-&gt;readUnsignedNumEntry(HS_ID);
<a name="l00314"></a>00314 <span class="preprocessor">#ifdef HIGHSCORE_DIRECTORY</span>
<a name="l00315"></a>00315 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (_oldLocalPlayer) { <span class="comment">// player already exists in local config file</span>
<a name="l00316"></a>00316         <span class="comment">// copy player data</span>
<a name="l00317"></a>00317         QString prefix = QString(<span class="stringliteral">"%1_"</span>).arg(_oldLocalId+1);
<a name="l00318"></a>00318         QMap&lt;QString, QString&gt; entries =
<a name="l00319"></a>00319             cg.config()-&gt;entryMap(<span class="stringliteral">"KHighscore_players"</span>);
<a name="l00320"></a>00320         QMap&lt;QString, QString&gt;::const_iterator it;
<a name="l00321"></a>00321         <span class="keywordflow">for</span> (it=entries.begin(); it!=entries.end(); ++it) {
<a name="l00322"></a>00322             QString key = it.key();
<a name="l00323"></a>00323             <span class="keywordflow">if</span> ( key.find(prefix)==0 ) {
<a name="l00324"></a>00324                 QString name = key.right(key.length()-prefix.length());
<a name="l00325"></a>00325                 <span class="keywordflow">if</span> ( name!=<span class="stringliteral">"name"</span> || !isNameUsed(it.data()) )
<a name="l00326"></a>00326                     <span class="keyword">internal</span>-&gt;hsConfig().writeEntry(_id+1, name, it.data());
<a name="l00327"></a>00327             }
<a name="l00328"></a>00328         }
<a name="l00329"></a>00329     }
<a name="l00330"></a>00330 <span class="preprocessor">#else</span>
<a name="l00331"></a>00331 <span class="preprocessor"></span>    _newPlayer = !_oldLocalPlayer;
<a name="l00332"></a>00332     <span class="keywordflow">if</span> (_oldLocalPlayer) _id = _oldLocalId;
<a name="l00333"></a>00333     <span class="keywordflow">else</span> {
<a name="l00334"></a>00334         _id = nbEntries();
<a name="l00335"></a>00335         cg.config()-&gt;writeEntry(HS_ID, _id);
<a name="l00336"></a>00336         item(<span class="stringliteral">"name"</span>)-&gt;write(_id, name);
<a name="l00337"></a>00337     }
<a name="l00338"></a>00338 <span class="preprocessor">#endif</span>
<a name="l00339"></a>00339 <span class="preprocessor"></span>    _bound = <span class="keyword">true</span>;
<a name="l00340"></a>00340     <span class="keyword">internal</span>-&gt;hsConfig().writeAndUnlock();
<a name="l00341"></a>00341 }
<a name="l00342"></a>00342 
<a name="l00343"></a>00343 <span class="keywordtype">void</span> PlayerInfos::createHistoItems(<span class="keyword">const</span> QMemArray&lt;uint&gt; &amp;scores, <span class="keywordtype">bool</span> bound)
<a name="l00344"></a>00344 {
<a name="l00345"></a>00345     Q_ASSERT( _histogram.size()==0 );
<a name="l00346"></a>00346     _bound = bound;
<a name="l00347"></a>00347     _histogram = scores;
<a name="l00348"></a>00348     <span class="keywordflow">for</span> (uint i=1; i&lt;histoSize(); i++)
<a name="l00349"></a>00349         addItem(histoName(i), <span class="keyword">new</span> Item((uint)0), <span class="keyword">true</span>, <span class="keyword">true</span>);
<a name="l00350"></a>00350 }
<a name="l00351"></a>00351 
<a name="l00352"></a>00352 <span class="keywordtype">bool</span> PlayerInfos::isAnonymous()<span class="keyword"> const</span>
<a name="l00353"></a>00353 <span class="keyword"></span>{
<a name="l00354"></a>00354     <span class="keywordflow">return</span> ( name()==ItemContainer::ANONYMOUS );
<a name="l00355"></a>00355 }
<a name="l00356"></a>00356 
<a name="l00357"></a>00357 uint PlayerInfos::nbEntries()<span class="keyword"> const</span>
<a name="l00358"></a>00358 <span class="keyword"></span>{
<a name="l00359"></a>00359     <span class="keyword">internal</span>-&gt;hsConfig().setHighscoreGroup(<span class="stringliteral">"players"</span>);
<a name="l00360"></a>00360     QStringList list = <span class="keyword">internal</span>-&gt;hsConfig().readList(<span class="stringliteral">"name"</span>, -1);
<a name="l00361"></a>00361     <span class="keywordflow">return</span> list.count();
<a name="l00362"></a>00362 }
<a name="l00363"></a>00363 
<a name="l00364"></a>00364 QString PlayerInfos::key()<span class="keyword"> const</span>
<a name="l00365"></a>00365 <span class="keyword"></span>{
<a name="l00366"></a>00366     ConfigGroup cg;
<a name="l00367"></a>00367     <span class="keywordflow">return</span> cg.config()-&gt;readEntry(HS_KEY, QString::null);
<a name="l00368"></a>00368 }
<a name="l00369"></a>00369 
<a name="l00370"></a>00370 <span class="keywordtype">bool</span> PlayerInfos::isWWEnabled()<span class="keyword"> const</span>
<a name="l00371"></a>00371 <span class="keyword"></span>{
<a name="l00372"></a>00372     ConfigGroup cg;
<a name="l00373"></a>00373     <span class="keywordflow">return</span> cg.config()-&gt;readBoolEntry(HS_WW_ENABLED, <span class="keyword">false</span>);
<a name="l00374"></a>00374 }
<a name="l00375"></a>00375 
<a name="l00376"></a>00376 QString PlayerInfos::histoName(uint i)<span class="keyword"> const</span>
<a name="l00377"></a>00377 <span class="keyword"></span>{
<a name="l00378"></a>00378     <span class="keyword">const</span> QMemArray&lt;uint&gt; &amp;sh = _histogram;
<a name="l00379"></a>00379     Q_ASSERT( i&lt;sh.size() || (_bound || i==sh.size()) );
<a name="l00380"></a>00380     <span class="keywordflow">if</span> ( i==sh.size() )
<a name="l00381"></a>00381         <span class="keywordflow">return</span> QString(<span class="stringliteral">"nb scores greater than %1"</span>).arg(sh[sh.size()-1]);
<a name="l00382"></a>00382     <span class="keywordflow">return</span> QString(<span class="stringliteral">"nb scores less than %1"</span>).arg(sh[i]);
<a name="l00383"></a>00383 }
<a name="l00384"></a>00384 
<a name="l00385"></a>00385 uint PlayerInfos::histoSize()<span class="keyword"> const</span>
<a name="l00386"></a>00386 <span class="keyword"></span>{
<a name="l00387"></a>00387      <span class="keywordflow">return</span> _histogram.size() + (_bound ? 0 : 1);
<a name="l00388"></a>00388 }
<a name="l00389"></a>00389 
<a name="l00390"></a>00390 <span class="keywordtype">void</span> PlayerInfos::submitScore(<span class="keyword">const</span> Score &amp;score)<span class="keyword"> const</span>
<a name="l00391"></a>00391 <span class="keyword"></span>{
<a name="l00392"></a>00392     <span class="comment">// update counts</span>
<a name="l00393"></a>00393     uint nbGames = item(<span class="stringliteral">"nb games"</span>)-&gt;increment(_id);
<a name="l00394"></a>00394     <span class="keywordflow">switch</span> (score.type()) {
<a name="l00395"></a>00395     <span class="keywordflow">case</span> Lost:
<a name="l00396"></a>00396         item(<span class="stringliteral">"nb lost games"</span>)-&gt;increment(_id);
<a name="l00397"></a>00397         <span class="keywordflow">break</span>;
<a name="l00398"></a>00398     <span class="keywordflow">case</span> Won: <span class="keywordflow">break</span>;
<a name="l00399"></a>00399     <span class="keywordflow">case</span> Draw:
<a name="l00400"></a>00400         item(<span class="stringliteral">"nb draw games"</span>)-&gt;increment(_id);
<a name="l00401"></a>00401         <span class="keywordflow">break</span>;
<a name="l00402"></a>00402     };
<a name="l00403"></a>00403 
<a name="l00404"></a>00404     <span class="comment">// update mean</span>
<a name="l00405"></a>00405     <span class="keywordflow">if</span> ( score.type()==Won ) {
<a name="l00406"></a>00406         uint nbWonGames = nbGames - item(<span class="stringliteral">"nb lost games"</span>)-&gt;read(_id).toUInt()
<a name="l00407"></a>00407                         - item(<span class="stringliteral">"nb draw games"</span>)-&gt;read(_id).toUInt()
<a name="l00408"></a>00408                         - item(<span class="stringliteral">"nb black marks"</span>)-&gt;read(_id).toUInt(); <span class="comment">// legacy</span>
<a name="l00409"></a>00409         <span class="keywordtype">double</span> mean = (nbWonGames==1 ? 0.0
<a name="l00410"></a>00410                        : item(<span class="stringliteral">"mean score"</span>)-&gt;read(_id).toDouble());
<a name="l00411"></a>00411         mean += (double(score.score()) - mean) / nbWonGames;
<a name="l00412"></a>00412         item(<span class="stringliteral">"mean score"</span>)-&gt;write(_id, mean);
<a name="l00413"></a>00413     }
<a name="l00414"></a>00414 
<a name="l00415"></a>00415     <span class="comment">// update best score</span>
<a name="l00416"></a>00416     Score best = score; <span class="comment">// copy optionnal fields (there are not taken into account here)</span>
<a name="l00417"></a>00417     best.setScore( item(<span class="stringliteral">"best score"</span>)-&gt;read(_id).toUInt() );
<a name="l00418"></a>00418     <span class="keywordflow">if</span> ( best&lt;score ) {
<a name="l00419"></a>00419         item(<span class="stringliteral">"best score"</span>)-&gt;write(_id, score.score());
<a name="l00420"></a>00420         item(<span class="stringliteral">"date"</span>)-&gt;write(_id, score.data(<span class="stringliteral">"date"</span>).toDateTime());
<a name="l00421"></a>00421     }
<a name="l00422"></a>00422 
<a name="l00423"></a>00423     <span class="comment">// update trends</span>
<a name="l00424"></a>00424     <span class="keywordtype">int</span> current = item(<span class="stringliteral">"current trend"</span>)-&gt;read(_id).toInt();
<a name="l00425"></a>00425     <span class="keywordflow">switch</span> (score.type()) {
<a name="l00426"></a>00426     <span class="keywordflow">case</span> Won: {
<a name="l00427"></a>00427         <span class="keywordflow">if</span> ( current&lt;0 ) current = 0;
<a name="l00428"></a>00428         current++;
<a name="l00429"></a>00429         uint won = item(<span class="stringliteral">"max won trend"</span>)-&gt;read(_id).toUInt();
<a name="l00430"></a>00430         <span class="keywordflow">if</span> ( (uint)current&gt;won ) item(<span class="stringliteral">"max won trend"</span>)-&gt;write(_id, current);
<a name="l00431"></a>00431         <span class="keywordflow">break</span>;
<a name="l00432"></a>00432     }
<a name="l00433"></a>00433     <span class="keywordflow">case</span> Lost: {
<a name="l00434"></a>00434         <span class="keywordflow">if</span> ( current&gt;0 ) current = 0;
<a name="l00435"></a>00435         current--;
<a name="l00436"></a>00436         uint lost = item(<span class="stringliteral">"max lost trend"</span>)-&gt;read(_id).toUInt();
<a name="l00437"></a>00437         uint clost = -current;
<a name="l00438"></a>00438         <span class="keywordflow">if</span> ( clost&gt;lost ) item(<span class="stringliteral">"max lost trend"</span>)-&gt;write(_id, clost);
<a name="l00439"></a>00439         <span class="keywordflow">break</span>;
<a name="l00440"></a>00440     }
<a name="l00441"></a>00441     <span class="keywordflow">case</span> Draw:
<a name="l00442"></a>00442         current = 0;
<a name="l00443"></a>00443         <span class="keywordflow">break</span>;
<a name="l00444"></a>00444     }
<a name="l00445"></a>00445     item(<span class="stringliteral">"current trend"</span>)-&gt;write(_id, current);
<a name="l00446"></a>00446 
<a name="l00447"></a>00447     <span class="comment">// update histogram</span>
<a name="l00448"></a>00448     <span class="keywordflow">if</span> ( score.type()==Won ) {
<a name="l00449"></a>00449         <span class="keyword">const</span> QMemArray&lt;uint&gt; &amp;sh = _histogram;
<a name="l00450"></a>00450         <span class="keywordflow">for</span> (uint i=1; i&lt;histoSize(); i++)
<a name="l00451"></a>00451             <span class="keywordflow">if</span> ( i==sh.size() || score.score()&lt;sh[i] ) {
<a name="l00452"></a>00452                 item(histoName(i))-&gt;increment(_id);
<a name="l00453"></a>00453                 <span class="keywordflow">break</span>;
<a name="l00454"></a>00454             }
<a name="l00455"></a>00455     }
<a name="l00456"></a>00456 }
<a name="l00457"></a>00457 
<a name="l00458"></a>00458 <span class="keywordtype">bool</span> PlayerInfos::isNameUsed(<span class="keyword">const</span> QString &amp;newName)<span class="keyword"> const</span>
<a name="l00459"></a>00459 <span class="keyword"></span>{
<a name="l00460"></a>00460     <span class="keywordflow">if</span> ( newName==name() ) <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// own name...</span>
<a name="l00461"></a>00461     <span class="keywordflow">for</span> (uint i=0; i&lt;nbEntries(); i++)
<a name="l00462"></a>00462         <span class="keywordflow">if</span> ( newName.lower()==item(<span class="stringliteral">"name"</span>)-&gt;read(i).toString().lower() ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00463"></a>00463     <span class="keywordflow">if</span> ( newName==i18n(ItemContainer::ANONYMOUS_LABEL) ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00464"></a>00464     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00465"></a>00465 }
<a name="l00466"></a>00466 
<a name="l00467"></a>00467 <span class="keywordtype">void</span> PlayerInfos::modifyName(<span class="keyword">const</span> QString &amp;newName)<span class="keyword"> const</span>
<a name="l00468"></a>00468 <span class="keyword"></span>{
<a name="l00469"></a>00469     item(<span class="stringliteral">"name"</span>)-&gt;write(_id, newName);
<a name="l00470"></a>00470 }
<a name="l00471"></a>00471 
<a name="l00472"></a>00472 <span class="keywordtype">void</span> PlayerInfos::modifySettings(<span class="keyword">const</span> QString &amp;newName,
<a name="l00473"></a>00473                                  <span class="keyword">const</span> QString &amp;comment, <span class="keywordtype">bool</span> WWEnabled,
<a name="l00474"></a>00474                                  <span class="keyword">const</span> QString &amp;newKey)<span class="keyword"> const</span>
<a name="l00475"></a>00475 <span class="keyword"></span>{
<a name="l00476"></a>00476     modifyName(newName);
<a name="l00477"></a>00477     item(<span class="stringliteral">"comment"</span>)-&gt;write(_id, comment);
<a name="l00478"></a>00478     ConfigGroup cg;
<a name="l00479"></a>00479     cg.config()-&gt;writeEntry(HS_WW_ENABLED, WWEnabled);
<a name="l00480"></a>00480     <span class="keywordflow">if</span> ( !newKey.isEmpty() ) cg.config()-&gt;writeEntry(HS_KEY, newKey);
<a name="l00481"></a>00481     <span class="keywordflow">if</span> (WWEnabled) cg.config()-&gt;writeEntry(HS_REGISTERED_NAME, newName);
<a name="l00482"></a>00482 }
<a name="l00483"></a>00483 
<a name="l00484"></a>00484 QString PlayerInfos::registeredName()<span class="keyword"> const</span>
<a name="l00485"></a>00485 <span class="keyword"></span>{
<a name="l00486"></a>00486     ConfigGroup cg;
<a name="l00487"></a>00487     <span class="keywordflow">return</span> cg.config()-&gt;readEntry(HS_REGISTERED_NAME, QString::null);
<a name="l00488"></a>00488 }
<a name="l00489"></a>00489 
<a name="l00490"></a>00490 <span class="keywordtype">void</span> PlayerInfos::removeKey()
<a name="l00491"></a>00491 {
<a name="l00492"></a>00492     ConfigGroup cg;
<a name="l00493"></a>00493 
<a name="l00494"></a>00494     <span class="comment">// save old key/nickname</span>
<a name="l00495"></a>00495     uint i = 0;
<a name="l00496"></a>00496     QString str = <span class="stringliteral">"%1 old #%2"</span>;
<a name="l00497"></a>00497     QString sk;
<a name="l00498"></a>00498     <span class="keywordflow">do</span> {
<a name="l00499"></a>00499         i++;
<a name="l00500"></a>00500         sk = str.arg(HS_KEY).arg(i);
<a name="l00501"></a>00501     } <span class="keywordflow">while</span> ( !cg.config()-&gt;readEntry(sk, QString::null).isEmpty() );
<a name="l00502"></a>00502     cg.config()-&gt;writeEntry(sk, key());
<a name="l00503"></a>00503     cg.config()-&gt;writeEntry(str.arg(HS_REGISTERED_NAME).arg(i),
<a name="l00504"></a>00504                             registeredName());
<a name="l00505"></a>00505 
<a name="l00506"></a>00506     <span class="comment">// clear current key/nickname</span>
<a name="l00507"></a>00507     cg.config()-&gt;deleteEntry(HS_KEY);
<a name="l00508"></a>00508     cg.config()-&gt;deleteEntry(HS_REGISTERED_NAME);
<a name="l00509"></a>00509     cg.config()-&gt;writeEntry(HS_WW_ENABLED, <span class="keyword">false</span>);
<a name="l00510"></a>00510 }
<a name="l00511"></a>00511 
<a name="l00512"></a>00512 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00513"></a>00513 ManagerPrivate::ManagerPrivate(uint nbGameTypes, <a class="code" href="classKExtHighscore_1_1Manager.html#86053e282fdf37c985ad185f17735410" title="Constructor.">Manager</a> &amp;m)
<a name="l00514"></a>00514     : manager(m), <a class="code" href="classKExtHighscore_1_1Manager.html#b1fdcd66331e08b9bc0f22e2cf8bc262">showStatistics</a>(false), showDrawGames(false),
<a name="l00515"></a>00515       trackLostGames(false), trackDrawGames(false), 
<a name="l00516"></a>00516       showMode(<a class="code" href="classKExtHighscore_1_1Manager.html#86053e282fdf37c985ad185f17735410" title="Constructor.">Manager</a>::<a class="code" href="classKExtHighscore_1_1Manager.html#2e8f06f94b46f2579ca7c5bd5b46ce47fca4e24893ceb2f91c1d3b973a2a3fe1" title="Show if score has improved.">ShowForHigherScore</a>),
<a name="l00517"></a>00517       _first(true), _nbGameTypes(nbGameTypes), _gameType(0)
<a name="l00518"></a>00518 {}
<a name="l00519"></a>00519 
<a name="l00520"></a>00520 <span class="keywordtype">void</span> ManagerPrivate::init(uint maxNbEntries)
<a name="l00521"></a>00521 {
<a name="l00522"></a>00522     _hsConfig = <span class="keyword">new</span> <a class="code" href="classKHighscore.html" title="Class for managing highscore tables.">KHighscore</a>(<span class="keyword">false</span>, 0);
<a name="l00523"></a>00523     _playerInfos = <span class="keyword">new</span> PlayerInfos;
<a name="l00524"></a>00524     _scoreInfos = <span class="keyword">new</span> ScoreInfos(maxNbEntries, *_playerInfos);
<a name="l00525"></a>00525 }
<a name="l00526"></a>00526 
<a name="l00527"></a>00527 ManagerPrivate::~ManagerPrivate()
<a name="l00528"></a>00528 {
<a name="l00529"></a>00529     <span class="keyword">delete</span> _scoreInfos;
<a name="l00530"></a>00530     <span class="keyword">delete</span> _playerInfos;
<a name="l00531"></a>00531     <span class="keyword">delete</span> _hsConfig;
<a name="l00532"></a>00532 }
<a name="l00533"></a>00533 
<a name="l00534"></a>00534 KURL ManagerPrivate::queryURL(QueryType type, <span class="keyword">const</span> QString &amp;newName)<span class="keyword"> const</span>
<a name="l00535"></a>00535 <span class="keyword"></span>{
<a name="l00536"></a>00536     KURL url = serverURL;
<a name="l00537"></a>00537     QString nameItem = <span class="stringliteral">"nickname"</span>;
<a name="l00538"></a>00538     QString name = _playerInfos-&gt;registeredName();
<a name="l00539"></a>00539     <span class="keywordtype">bool</span> withVersion = <span class="keyword">true</span>;
<a name="l00540"></a>00540     <span class="keywordtype">bool</span> key = <span class="keyword">false</span>;
<a name="l00541"></a>00541     <span class="keywordtype">bool</span> level = <span class="keyword">false</span>;
<a name="l00542"></a>00542 
<a name="l00543"></a>00543     <span class="keywordflow">switch</span> (type) {
<a name="l00544"></a>00544         <span class="keywordflow">case</span> Submit:
<a name="l00545"></a>00545             url.addPath(<span class="stringliteral">"submit.php"</span>);
<a name="l00546"></a>00546             level = <span class="keyword">true</span>;
<a name="l00547"></a>00547             key = <span class="keyword">true</span>;
<a name="l00548"></a>00548             <span class="keywordflow">break</span>;
<a name="l00549"></a>00549         <span class="keywordflow">case</span> Register:
<a name="l00550"></a>00550             url.addPath(<span class="stringliteral">"register.php"</span>);
<a name="l00551"></a>00551             name = newName;
<a name="l00552"></a>00552             <span class="keywordflow">break</span>;
<a name="l00553"></a>00553         <span class="keywordflow">case</span> Change:
<a name="l00554"></a>00554             url.addPath(<span class="stringliteral">"change.php"</span>);
<a name="l00555"></a>00555             key = <span class="keyword">true</span>;
<a name="l00556"></a>00556             <span class="keywordflow">if</span> ( newName!=name )
<a name="l00557"></a>00557                 <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"new_nickname"</span>, newName);
<a name="l00558"></a>00558             <span class="keywordflow">break</span>;
<a name="l00559"></a>00559         <span class="keywordflow">case</span> Players:
<a name="l00560"></a>00560             url.addPath(<span class="stringliteral">"players.php"</span>);
<a name="l00561"></a>00561             nameItem = <span class="stringliteral">"highlight"</span>;
<a name="l00562"></a>00562             withVersion = <span class="keyword">false</span>;
<a name="l00563"></a>00563             <span class="keywordflow">break</span>;
<a name="l00564"></a>00564         <span class="keywordflow">case</span> Scores:
<a name="l00565"></a>00565             url.addPath(<span class="stringliteral">"highscores.php"</span>);
<a name="l00566"></a>00566             withVersion = <span class="keyword">false</span>;
<a name="l00567"></a>00567             <span class="keywordflow">if</span> ( _nbGameTypes&gt;1 ) level = <span class="keyword">true</span>;
<a name="l00568"></a>00568             <span class="keywordflow">break</span>;
<a name="l00569"></a>00569     }
<a name="l00570"></a>00570 
<a name="l00571"></a>00571     <span class="keywordflow">if</span> (withVersion) <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"version"</span>, version);
<a name="l00572"></a>00572     <span class="keywordflow">if</span> ( !name.isEmpty() ) <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, nameItem, name);
<a name="l00573"></a>00573     <span class="keywordflow">if</span> (key) <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"key"</span>, _playerInfos-&gt;key());
<a name="l00574"></a>00574     <span class="keywordflow">if</span> (level) {
<a name="l00575"></a>00575         QString label = manager.gameTypeLabel(_gameType, Manager::WW);
<a name="l00576"></a>00576         <span class="keywordflow">if</span> ( !label.isEmpty() ) <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"level"</span>, label);
<a name="l00577"></a>00577     }
<a name="l00578"></a>00578 
<a name="l00579"></a>00579     <span class="keywordflow">return</span> url;
<a name="l00580"></a>00580 }
<a name="l00581"></a>00581 
<a name="l00582"></a>00582 <span class="comment">// strings that needs to be translated (coming from the highscores server)</span>
<a name="l00583"></a>00583 <span class="keyword">const</span> <span class="keywordtype">char</span> *DUMMY_STRINGS[] = {
<a name="l00584"></a>00584     I18N_NOOP(<span class="stringliteral">"Undefined error."</span>),
<a name="l00585"></a>00585     I18N_NOOP(<span class="stringliteral">"Missing argument(s)."</span>),
<a name="l00586"></a>00586     I18N_NOOP(<span class="stringliteral">"Invalid argument(s)."</span>),
<a name="l00587"></a>00587 
<a name="l00588"></a>00588     I18N_NOOP(<span class="stringliteral">"Unable to connect to MySQL server."</span>),
<a name="l00589"></a>00589     I18N_NOOP(<span class="stringliteral">"Unable to select database."</span>),
<a name="l00590"></a>00590     I18N_NOOP(<span class="stringliteral">"Error on database query."</span>),
<a name="l00591"></a>00591     I18N_NOOP(<span class="stringliteral">"Error on database insert."</span>),
<a name="l00592"></a>00592 
<a name="l00593"></a>00593     I18N_NOOP(<span class="stringliteral">"Nickname already registered."</span>),
<a name="l00594"></a>00594     I18N_NOOP(<span class="stringliteral">"Nickname not registered."</span>),
<a name="l00595"></a>00595     I18N_NOOP(<span class="stringliteral">"Invalid key."</span>),
<a name="l00596"></a>00596     I18N_NOOP(<span class="stringliteral">"Invalid submit key."</span>),
<a name="l00597"></a>00597 
<a name="l00598"></a>00598     I18N_NOOP(<span class="stringliteral">"Invalid level."</span>),
<a name="l00599"></a>00599     I18N_NOOP(<span class="stringliteral">"Invalid score."</span>)
<a name="l00600"></a>00600 };
<a name="l00601"></a>00601 
<a name="l00602"></a>00602 <span class="keyword">const</span> <span class="keywordtype">char</span> *UNABLE_TO_CONTACT =
<a name="l00603"></a>00603     I18N_NOOP(<span class="stringliteral">"Unable to contact world-wide highscore server"</span>);
<a name="l00604"></a>00604 
<a name="l00605"></a>00605 <span class="keywordtype">bool</span> ManagerPrivate::doQuery(<span class="keyword">const</span> KURL &amp;url, QWidget *parent,
<a name="l00606"></a>00606                                 QDomNamedNodeMap *map)
<a name="l00607"></a>00607 {
<a name="l00608"></a>00608     KIO::http_update_cache(url, <span class="keyword">true</span>, 0); <span class="comment">// remove cache !</span>
<a name="l00609"></a>00609 
<a name="l00610"></a>00610     QString tmpFile;
<a name="l00611"></a>00611     <span class="keywordflow">if</span> ( !KIO::NetAccess::download(url, tmpFile, parent) ) {
<a name="l00612"></a>00612         QString details = i18n(<span class="stringliteral">"Server URL: %1"</span>).arg(url.host());
<a name="l00613"></a>00613         KMessageBox::detailedSorry(parent, i18n(UNABLE_TO_CONTACT), details);
<a name="l00614"></a>00614         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00615"></a>00615     }
<a name="l00616"></a>00616 
<a name="l00617"></a>00617     QFile file(tmpFile);
<a name="l00618"></a>00618     <span class="keywordflow">if</span> ( !file.open(IO_ReadOnly) ) {
<a name="l00619"></a>00619         KIO::NetAccess::removeTempFile(tmpFile);
<a name="l00620"></a>00620         QString details = i18n(<span class="stringliteral">"Unable to open temporary file."</span>);
<a name="l00621"></a>00621         KMessageBox::detailedSorry(parent, i18n(UNABLE_TO_CONTACT), details);
<a name="l00622"></a>00622         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00623"></a>00623     }
<a name="l00624"></a>00624 
<a name="l00625"></a>00625     QTextStream t(&amp;file);
<a name="l00626"></a>00626     QString content = t.read().stripWhiteSpace();
<a name="l00627"></a>00627     file.close();
<a name="l00628"></a>00628     KIO::NetAccess::removeTempFile(tmpFile);
<a name="l00629"></a>00629 
<a name="l00630"></a>00630     QDomDocument doc;
<a name="l00631"></a>00631     <span class="keywordflow">if</span> ( doc.setContent(content) ) {
<a name="l00632"></a>00632         QDomElement root = doc.documentElement();
<a name="l00633"></a>00633         QDomElement element = root.firstChild().toElement();
<a name="l00634"></a>00634         <span class="keywordflow">if</span> ( element.tagName()==<span class="stringliteral">"success"</span> ) {
<a name="l00635"></a>00635             <span class="keywordflow">if</span> (map) *map = element.attributes();
<a name="l00636"></a>00636             <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00637"></a>00637         }
<a name="l00638"></a>00638         <span class="keywordflow">if</span> ( element.tagName()==<span class="stringliteral">"error"</span> ) {
<a name="l00639"></a>00639             QDomAttr attr = element.attributes().namedItem(<span class="stringliteral">"label"</span>).toAttr();
<a name="l00640"></a>00640             <span class="keywordflow">if</span> ( !attr.isNull() ) {
<a name="l00641"></a>00641                 QString msg = i18n(attr.value().latin1());
<a name="l00642"></a>00642                 QString caption = i18n(<span class="stringliteral">"Message from world-wide highscores "</span>
<a name="l00643"></a>00643                                        <span class="stringliteral">"server"</span>);
<a name="l00644"></a>00644                 KMessageBox::sorry(parent, msg, caption);
<a name="l00645"></a>00645                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00646"></a>00646             }
<a name="l00647"></a>00647         }
<a name="l00648"></a>00648     }
<a name="l00649"></a>00649     QString msg = i18n(<span class="stringliteral">"Invalid answer from world-wide highscores server."</span>);
<a name="l00650"></a>00650     QString details = i18n(<span class="stringliteral">"Raw message: %1"</span>).arg(content);
<a name="l00651"></a>00651     KMessageBox::detailedSorry(parent, msg, details);
<a name="l00652"></a>00652     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00653"></a>00653 }
<a name="l00654"></a>00654 
<a name="l00655"></a>00655 <span class="keywordtype">bool</span> ManagerPrivate::getFromQuery(<span class="keyword">const</span> QDomNamedNodeMap &amp;map,
<a name="l00656"></a>00656                                   <span class="keyword">const</span> QString &amp;name, QString &amp;value,
<a name="l00657"></a>00657                                   QWidget *parent)
<a name="l00658"></a>00658 {
<a name="l00659"></a>00659     QDomAttr attr = map.namedItem(name).toAttr();
<a name="l00660"></a>00660     <span class="keywordflow">if</span> ( attr.isNull() ) {
<a name="l00661"></a>00661         KMessageBox::sorry(parent,
<a name="l00662"></a>00662                i18n(<span class="stringliteral">"Invalid answer from world-wide "</span>
<a name="l00663"></a>00663                     <span class="stringliteral">"highscores server (missing item: %1)."</span>).arg(name));
<a name="l00664"></a>00664         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00665"></a>00665     }
<a name="l00666"></a>00666     value = attr.value();
<a name="l00667"></a>00667     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00668"></a>00668 }
<a name="l00669"></a>00669 
<a name="l00670"></a>00670 Score ManagerPrivate::readScore(uint i)<span class="keyword"> const</span>
<a name="l00671"></a>00671 <span class="keyword"></span>{
<a name="l00672"></a>00672     Score score(Won);
<a name="l00673"></a>00673     _scoreInfos-&gt;read(i, score);
<a name="l00674"></a>00674     <span class="keywordflow">return</span> score;
<a name="l00675"></a>00675 }
<a name="l00676"></a>00676 
<a name="l00677"></a>00677 <span class="keywordtype">int</span> ManagerPrivate::rank(<span class="keyword">const</span> Score &amp;score)<span class="keyword"> const</span>
<a name="l00678"></a>00678 <span class="keyword"></span>{
<a name="l00679"></a>00679     uint nb = _scoreInfos-&gt;nbEntries();
<a name="l00680"></a>00680     uint i = 0;
<a name="l00681"></a>00681     <span class="keywordflow">for</span> (; i&lt;nb; i++)
<a name="l00682"></a>00682         <span class="keywordflow">if</span> ( readScore(i)&lt;score ) <span class="keywordflow">break</span>;
<a name="l00683"></a>00683     <span class="keywordflow">return</span> (i&lt;_scoreInfos-&gt;maxNbEntries() ? (<span class="keywordtype">int</span>)i : -1);
<a name="l00684"></a>00684 }
<a name="l00685"></a>00685 
<a name="l00686"></a>00686 <span class="keywordtype">bool</span> ManagerPrivate::modifySettings(<span class="keyword">const</span> QString &amp;newName,
<a name="l00687"></a>00687                                     <span class="keyword">const</span> QString &amp;comment, <span class="keywordtype">bool</span> WWEnabled,
<a name="l00688"></a>00688                                     QWidget *widget)
<a name="l00689"></a>00689 {
<a name="l00690"></a>00690     QString newKey;
<a name="l00691"></a>00691     <span class="keywordtype">bool</span> newPlayer = <span class="keyword">false</span>;
<a name="l00692"></a>00692 
<a name="l00693"></a>00693     <span class="keywordflow">if</span> (WWEnabled) {
<a name="l00694"></a>00694         newPlayer = _playerInfos-&gt;key().isEmpty()
<a name="l00695"></a>00695                     || _playerInfos-&gt;registeredName().isEmpty();
<a name="l00696"></a>00696         KURL url = queryURL((newPlayer ? Register : Change), newName);
<a name="l00697"></a>00697         <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"comment"</span>, comment);
<a name="l00698"></a>00698 
<a name="l00699"></a>00699         QDomNamedNodeMap map;
<a name="l00700"></a>00700         <span class="keywordtype">bool</span> ok = doQuery(url, widget, &amp;map);
<a name="l00701"></a>00701         <span class="keywordflow">if</span> ( !ok || (newPlayer &amp;&amp; !getFromQuery(map, <span class="stringliteral">"key"</span>, newKey, widget)) )
<a name="l00702"></a>00702             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00703"></a>00703     }
<a name="l00704"></a>00704 
<a name="l00705"></a>00705     <span class="keywordtype">bool</span> ok = _hsConfig-&gt;lockForWriting(widget); <span class="comment">// no GUI when locking</span>
<a name="l00706"></a>00706     <span class="keywordflow">if</span> (ok) {
<a name="l00707"></a>00707         <span class="comment">// check again name in case the config file has been changed...</span>
<a name="l00708"></a>00708         <span class="comment">// if it has, it is unfortunate because the WWW name is already</span>
<a name="l00709"></a>00709         <span class="comment">// committed but should be very rare and not really problematic</span>
<a name="l00710"></a>00710         ok = ( !_playerInfos-&gt;isNameUsed(newName) );
<a name="l00711"></a>00711         <span class="keywordflow">if</span> (ok)
<a name="l00712"></a>00712             _playerInfos-&gt;modifySettings(newName, comment, WWEnabled, newKey);
<a name="l00713"></a>00713         _hsConfig-&gt;writeAndUnlock();
<a name="l00714"></a>00714     }
<a name="l00715"></a>00715     <span class="keywordflow">return</span> ok;
<a name="l00716"></a>00716 }
<a name="l00717"></a>00717 
<a name="l00718"></a>00718 <span class="keywordtype">void</span> ManagerPrivate::convertToGlobal()
<a name="l00719"></a>00719 {
<a name="l00720"></a>00720     <span class="comment">// read old highscores</span>
<a name="l00721"></a>00721     <a class="code" href="classKHighscore.html" title="Class for managing highscore tables.">KHighscore</a> *tmp = _hsConfig;
<a name="l00722"></a>00722     _hsConfig = <span class="keyword">new</span> <a class="code" href="classKHighscore.html" title="Class for managing highscore tables.">KHighscore</a>(<span class="keyword">true</span>, 0);
<a name="l00723"></a>00723     QValueVector&lt;Score&gt; scores(_scoreInfos-&gt;nbEntries());
<a name="l00724"></a>00724     <span class="keywordflow">for</span> (uint i=0; i&lt;scores.count(); i++)
<a name="l00725"></a>00725         scores[i] = readScore(i);
<a name="l00726"></a>00726 
<a name="l00727"></a>00727     <span class="comment">// commit them</span>
<a name="l00728"></a>00728     <span class="keyword">delete</span> _hsConfig;
<a name="l00729"></a>00729     _hsConfig = tmp;
<a name="l00730"></a>00730     _hsConfig-&gt;<a class="code" href="classKHighscore.html#3feb80922bfe449584c8627272170669">lockForWriting</a>();
<a name="l00731"></a>00731     <span class="keywordflow">for</span> (uint i=0; i&lt;scores.count(); i++)
<a name="l00732"></a>00732         <span class="keywordflow">if</span> ( scores[i].data(<span class="stringliteral">"id"</span>).toUInt()==_playerInfos-&gt;oldLocalId()+1 )
<a name="l00733"></a>00733             submitLocal(scores[i]);
<a name="l00734"></a>00734     _hsConfig-&gt;writeAndUnlock();
<a name="l00735"></a>00735 }
<a name="l00736"></a>00736 
<a name="l00737"></a>00737 <span class="keywordtype">void</span> ManagerPrivate::setGameType(uint type)
<a name="l00738"></a>00738 {
<a name="l00739"></a>00739     <span class="keywordflow">if</span> (_first) {
<a name="l00740"></a>00740         _first = <span class="keyword">false</span>;
<a name="l00741"></a>00741         <span class="keywordflow">if</span> ( _playerInfos-&gt;isNewPlayer() ) {
<a name="l00742"></a>00742             <span class="comment">// convert legacy highscores</span>
<a name="l00743"></a>00743             <span class="keywordflow">for</span> (uint i=0; i&lt;_nbGameTypes; i++) {
<a name="l00744"></a>00744                 setGameType(i);
<a name="l00745"></a>00745                 manager.convertLegacy(i);
<a name="l00746"></a>00746             }
<a name="l00747"></a>00747 
<a name="l00748"></a>00748 <span class="preprocessor">#ifdef HIGHSCORE_DIRECTORY</span>
<a name="l00749"></a>00749 <span class="preprocessor"></span>            <span class="keywordflow">if</span> ( _playerInfos-&gt;isOldLocalPlayer() ) {
<a name="l00750"></a>00750                 <span class="comment">// convert local to global highscores</span>
<a name="l00751"></a>00751                 <span class="keywordflow">for</span> (uint i=0; i&lt;_nbGameTypes; i++) {
<a name="l00752"></a>00752                     setGameType(i);
<a name="l00753"></a>00753                     convertToGlobal();
<a name="l00754"></a>00754                 }
<a name="l00755"></a>00755             }
<a name="l00756"></a>00756 <span class="preprocessor">#endif</span>
<a name="l00757"></a>00757 <span class="preprocessor"></span>        }
<a name="l00758"></a>00758     }
<a name="l00759"></a>00759 
<a name="l00760"></a>00760     Q_ASSERT( type&lt;_nbGameTypes );
<a name="l00761"></a>00761     _gameType = kMin(type, _nbGameTypes-1);
<a name="l00762"></a>00762     QString str = <span class="stringliteral">"scores"</span>;
<a name="l00763"></a>00763     QString lab = manager.gameTypeLabel(_gameType, Manager::Standard);
<a name="l00764"></a>00764     <span class="keywordflow">if</span> ( !lab.isEmpty() ) {
<a name="l00765"></a>00765         _playerInfos-&gt;setSubGroup(lab);
<a name="l00766"></a>00766         str += <span class="stringliteral">"_"</span> + lab;
<a name="l00767"></a>00767     }
<a name="l00768"></a>00768     _scoreInfos-&gt;setGroup(str);
<a name="l00769"></a>00769 }
<a name="l00770"></a>00770 
<a name="l00771"></a>00771 <span class="keywordtype">void</span> ManagerPrivate::checkFirst()
<a name="l00772"></a>00772 {
<a name="l00773"></a>00773     <span class="keywordflow">if</span> (_first) setGameType(0);
<a name="l00774"></a>00774 }
<a name="l00775"></a>00775 
<a name="l00776"></a>00776 <span class="keywordtype">int</span> ManagerPrivate::submitScore(<span class="keyword">const</span> Score &amp;ascore,
<a name="l00777"></a>00777                                 QWidget *widget, <span class="keywordtype">bool</span> askIfAnonymous)
<a name="l00778"></a>00778 {
<a name="l00779"></a>00779     checkFirst();
<a name="l00780"></a>00780 
<a name="l00781"></a>00781     Score score = ascore;
<a name="l00782"></a>00782     score.setData(<span class="stringliteral">"id"</span>, _playerInfos-&gt;id() + 1);
<a name="l00783"></a>00783     score.setData(<span class="stringliteral">"date"</span>, QDateTime::currentDateTime());
<a name="l00784"></a>00784 
<a name="l00785"></a>00785     <span class="comment">// ask new name if anonymous and winner</span>
<a name="l00786"></a>00786     <span class="keyword">const</span> <span class="keywordtype">char</span> *dontAskAgainName = <span class="stringliteral">"highscore_ask_name_dialog"</span>;
<a name="l00787"></a>00787     QString newName;
<a name="l00788"></a>00788     KMessageBox::ButtonCode dummy;
<a name="l00789"></a>00789     <span class="keywordflow">if</span> ( score.type()==Won &amp;&amp; askIfAnonymous &amp;&amp; _playerInfos-&gt;isAnonymous()
<a name="l00790"></a>00790      &amp;&amp; KMessageBox::shouldBeShownYesNo(dontAskAgainName, dummy) ) {
<a name="l00791"></a>00791          AskNameDialog d(widget);
<a name="l00792"></a>00792          <span class="keywordflow">if</span> ( d.exec()==QDialog::Accepted ) newName = d.name();
<a name="l00793"></a>00793          <span class="keywordflow">if</span> ( d.dontAskAgain() )
<a name="l00794"></a>00794              KMessageBox::saveDontShowAgainYesNo(dontAskAgainName,
<a name="l00795"></a>00795                                                  KMessageBox::No);
<a name="l00796"></a>00796     }
<a name="l00797"></a>00797 
<a name="l00798"></a>00798     <span class="keywordtype">int</span> rank = -1;
<a name="l00799"></a>00799     <span class="keywordflow">if</span> ( _hsConfig-&gt;lockForWriting(widget) ) { <span class="comment">// no GUI when locking</span>
<a name="l00800"></a>00800         <span class="comment">// check again new name in case the config file has been changed...</span>
<a name="l00801"></a>00801         <span class="keywordflow">if</span> ( !newName.isEmpty() &amp;&amp; !_playerInfos-&gt;isNameUsed(newName) )
<a name="l00802"></a>00802              _playerInfos-&gt;modifyName(newName);
<a name="l00803"></a>00803 
<a name="l00804"></a>00804         <span class="comment">// commit locally</span>
<a name="l00805"></a>00805         _playerInfos-&gt;submitScore(score);
<a name="l00806"></a>00806         <span class="keywordflow">if</span> ( score.type()==Won ) rank = submitLocal(score);
<a name="l00807"></a>00807         _hsConfig-&gt;writeAndUnlock();
<a name="l00808"></a>00808     }
<a name="l00809"></a>00809 
<a name="l00810"></a>00810     <span class="keywordflow">if</span> ( _playerInfos-&gt;isWWEnabled() )
<a name="l00811"></a>00811         submitWorldWide(score, widget);
<a name="l00812"></a>00812 
<a name="l00813"></a>00813     <span class="keywordflow">return</span> rank;
<a name="l00814"></a>00814 }
<a name="l00815"></a>00815 
<a name="l00816"></a>00816 <span class="keywordtype">int</span> ManagerPrivate::submitLocal(<span class="keyword">const</span> Score &amp;score)
<a name="l00817"></a>00817 {
<a name="l00818"></a>00818     <span class="keywordtype">int</span> r = rank(score);
<a name="l00819"></a>00819     <span class="keywordflow">if</span> ( r!=-1 ) {
<a name="l00820"></a>00820         uint nb = _scoreInfos-&gt;nbEntries();
<a name="l00821"></a>00821         <span class="keywordflow">if</span> ( nb&lt;_scoreInfos-&gt;maxNbEntries() ) nb++;
<a name="l00822"></a>00822         _scoreInfos-&gt;write(r, score, nb);
<a name="l00823"></a>00823     }
<a name="l00824"></a>00824     <span class="keywordflow">return</span> r;
<a name="l00825"></a>00825 }
<a name="l00826"></a>00826 
<a name="l00827"></a>00827 <span class="keywordtype">bool</span> ManagerPrivate::submitWorldWide(<span class="keyword">const</span> Score &amp;score,
<a name="l00828"></a>00828                                      QWidget *widget)<span class="keyword"> const</span>
<a name="l00829"></a>00829 <span class="keyword"></span>{
<a name="l00830"></a>00830     <span class="keywordflow">if</span> ( score.type()==Lost &amp;&amp; !trackLostGames ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00831"></a>00831     <span class="keywordflow">if</span> ( score.type()==Draw &amp;&amp; !trackDrawGames ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00832"></a>00832 
<a name="l00833"></a>00833     KURL url = queryURL(Submit);
<a name="l00834"></a>00834     manager.additionalQueryItems(url, score);
<a name="l00835"></a>00835     <span class="keywordtype">int</span> s = (score.type()==Won ? score.score() : (int)score.type());
<a name="l00836"></a>00836     QString str =  QString::number(s);
<a name="l00837"></a>00837     <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"score"</span>, str);
<a name="l00838"></a>00838     KMD5 context(QString(_playerInfos-&gt;registeredName() + str).latin1());
<a name="l00839"></a>00839     <a class="code" href="classKExtHighscore_1_1Manager.html#152d482f6323acb632bc2884bf5f65c0" title="Add an entry to the url to be submitted (.">Manager::addToQueryURL</a>(url, <span class="stringliteral">"check"</span>, context.hexDigest());
<a name="l00840"></a>00840 
<a name="l00841"></a>00841     <span class="keywordflow">return</span> doQuery(url, widget);
<a name="l00842"></a>00842 }
<a name="l00843"></a>00843 
<a name="l00844"></a>00844 <span class="keywordtype">void</span> ManagerPrivate::exportHighscores(QTextStream &amp;s)
<a name="l00845"></a>00845 {
<a name="l00846"></a>00846     uint tmp = _gameType;
<a name="l00847"></a>00847 
<a name="l00848"></a>00848     <span class="keywordflow">for</span> (uint i=0; i&lt;_nbGameTypes; i++) {
<a name="l00849"></a>00849         setGameType(i);
<a name="l00850"></a>00850         <span class="keywordflow">if</span> ( _nbGameTypes&gt;1 ) {
<a name="l00851"></a>00851             <span class="keywordflow">if</span> ( i!=0 ) s &lt;&lt; endl;
<a name="l00852"></a>00852             s &lt;&lt; <span class="stringliteral">"--------------------------------"</span> &lt;&lt; endl;
<a name="l00853"></a>00853             s &lt;&lt; <span class="stringliteral">"Game type: "</span>
<a name="l00854"></a>00854               &lt;&lt; manager.gameTypeLabel(_gameType, Manager::I18N)
<a name="l00855"></a>00855               &lt;&lt; endl;
<a name="l00856"></a>00856             s &lt;&lt; endl;
<a name="l00857"></a>00857         }
<a name="l00858"></a>00858         s &lt;&lt; <span class="stringliteral">"Players list:"</span> &lt;&lt; endl;
<a name="l00859"></a>00859         _playerInfos-&gt;exportToText(s);
<a name="l00860"></a>00860         s &lt;&lt; endl;
<a name="l00861"></a>00861         s &lt;&lt; <span class="stringliteral">"Highscores list:"</span> &lt;&lt; endl;
<a name="l00862"></a>00862         _scoreInfos-&gt;exportToText(s);
<a name="l00863"></a>00863     }
<a name="l00864"></a>00864 
<a name="l00865"></a>00865     setGameType(tmp);
<a name="l00866"></a>00866 }
<a name="l00867"></a>00867 
<a name="l00868"></a>00868 } <span class="comment">// namespace</span>
</pre></div></div>
    </div></div>


      </td>
  </tr>
  <tr>
    <td valign="top" id="leftmenu" width="25%">
      <a name="navigation"></a>
      <div class="menu_box"><h2>libkdegames</h2>
<div class="nav_list">
<ul><li><a href="index.html">Main Page</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="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="classKCanvasRootPixmap.html">kcanvasrootpixmap</option>,  <option value="classKCardDialog.html">kcarddialog</option>,  <option value="classKChat.html">kchat</option>,  <option value="classKChatBase.html">kchatbase</option>,  <option value="classKChatBaseText.html">kchatbasetext</option>,  <option value="classKExtHighscore_1_1Item.html">kexthighscore::item</option>,  <option value="classKExtHighscore_1_1ItemArray.html">kexthighscore::itemarray</option>,  <option value="classKExtHighscore_1_1Manager.html">kexthighscore::manager</option>,  <option value="classKExtHighscore_1_1MultiplayerScores.html">kexthighscore::multiplayerscores</option>,  <option value="classKExtHighscore_1_1Score.html">kexthighscore::score</option>,  <option value="classKGame.html">kgame</option>,  <option value="classKGameChat.html">kgamechat</option>,  <option value="classKGameComputerIO.html">kgamecomputerio</option>,  <option value="classKGameConnectDialog.html">kgameconnectdialog</option>,  <option value="classKGameDialog.html">kgamedialog</option>,  <option value="classKGameDialogChatConfig.html">kgamedialogchatconfig</option>,  <option value="classKGameDialogConfig.html">kgamedialogconfig</option>,  <option value="classKGameErrorDialog.html">kgameerrordialog</option>,  <option value="classKGameErrorMessageDialog.html">kgameerrormessagedialog</option>,  <option value="classKGameIO.html">kgameio</option>,  <option value="classKGameKeyIO.html">kgamekeyio</option>,  <option value="classKGameLCD.html">kgamelcd</option>,  <option value="classKGameLCDClock.html">kgamelcdclock</option>,  <option value="classKGameLCDList.html">kgamelcdlist</option>,  <option value="classKGameMisc.html">kgamemisc</option>,  <option value="classKGameMouseIO.html">kgamemouseio</option>,  <option value="classKGameNetwork.html">kgamenetwork</option>,  <option value="classKGameProcess.html">kgameprocess</option>,  <option value="classKGameProcessIO.html">kgameprocessio</option>,  <option value="classKGameProgress.html">kgameprogress</option>,  <option value="classKGameProperty.html">kgameproperty</option>,  <option value="classKGamePropertyBase.html">kgamepropertybase</option>,  <option value="classKGamePropertyHandler.html">kgamepropertyhandler</option>,  <option value="classKGameSequence.html">kgamesequence</option>,  <option value="classKGrid2D_1_1Generic.html">kgrid2d::generic</option>,  <option value="classKGrid2D_1_1Hexagonal.html">kgrid2d::hexagonal</option>,  <option value="classKGrid2D_1_1HexagonalBase.html">kgrid2d::hexagonalbase</option>,  <option value="classKGrid2D_1_1Square.html">kgrid2d::square</option>,  <option value="classKGrid2D_1_1SquareBase.html">kgrid2d::squarebase</option>,  <option value="classKHighscore.html">khighscore</option>,  <option value="classKMessageClient.html">kmessageclient</option>,  <option value="classKMessageDirect.html">kmessagedirect</option>,  <option value="classKMessageIO.html">kmessageio</option>,  <option value="classKMessageServer.html">kmessageserver</option>,  <option value="classKMessageServerSocket.html">kmessageserversocket</option>,  <option value="classKMessageSocket.html">kmessagesocket</option>,  <option value="classKPlayer.html">kplayer</option>,  <option value="classKScoreDialog.html">kscoredialog</option>,  <option value="classKStdGameAction.html">kstdgameaction</option>,
</select>
</form>
</div>
-->
</div></div>
<div class="menu_box"><h2>API Dox</h2>
<div class="nav_list">
<ul>
<li><a href="../../libkdegames/html/index.html">libkdegames</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>