Applied patch [ 872338 ] Minor fixes to forty, fractal and poem demos
[wxWidgets.git] / demos / forty / scorefil.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: scorefil.cpp
3 // Purpose: Forty Thieves patience game
4 // Author: Chris Breeze
5 // Modified by:
6 // Created: 21/07/97
7 // RCS-ID: $Id$
8 // Copyright: (c) 1993-1998 Chris Breeze
9 // Licence: wxWindows licence
10 //---------------------------------------------------------------------------
11 // Last modified: 14th May 1998 - ported to wxWindows 2.0
12 /////////////////////////////////////////////////////////////////////////////
13
14 #ifdef __GNUG__
15 #pragma implementation
16 #pragma interface
17 #endif
18
19 // For compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #ifndef WX_PRECOMP
27 #include "wx/wx.h"
28 #endif
29
30 #ifdef __WXGTK__
31 #include <unistd.h>
32 #include <sys/stat.h>
33 #include <fcntl.h>
34 #endif
35 #include "wx/textfile.h"
36 #include "wx/config.h"
37 #include "wx/fileconf.h"
38
39 #include "scorefil.h"
40
41 ScoreFile::ScoreFile(const wxString& appName)
42 {
43 #if 0
44 wxString filename;
45 m_configFilename << "/usr/local/share/" << appName << ".scores";
46 if (access(m_configFilename, F_OK) == 0)
47 {
48 if (access(m_configFilename, R_OK | W_OK) != 0)
49 {
50 // file is not r/w - use local file instead
51 m_configFilename = wxFileConfig::GetLocalFileName(appName);
52 }
53 }
54 else
55 {
56 int fd = creat(m_configFilename, 0666);
57
58 if (fd < 0)
59 {
60 // failed to create file - use local file instead
61 m_configFilename = wxFileConfig::GetLocalFileName(appName);
62 }
63 else
64 {
65 // ensure created file has rw-rw-rw permissions
66 close(fd);
67 }
68 }
69 #endif
70
71 m_config = new wxConfig(appName, _T("wxWindows"), appName, _T(""),
72 wxCONFIG_USE_LOCAL_FILE); // only local
73 }
74
75 ScoreFile::~ScoreFile()
76 {
77 delete m_config;
78 #ifdef __WXGTK__
79 // ensure score file has rw-rw-rw permissions
80 // (wxFileConfig sets them to rw-------)
81 chmod(m_configFilename, 0666);
82 #endif
83 }
84
85
86 void ScoreFile::GetPlayerList( wxArrayString &list )
87 {
88 m_config->SetPath(_T("/Players"));
89 int length = m_config->GetNumberOfGroups();
90
91 if (length <= 0) return;
92
93 wxString player;
94 long index;
95 if (m_config->GetFirstGroup(player, index))
96 {
97 list.Add( player );
98 while (m_config->GetNextGroup(player, index))
99 {
100 list.Add( player );
101 }
102 }
103 }
104
105
106 // Calculate an encrypted check number to prevent tampering with
107 // score file
108 long ScoreFile::CalcCheck(const wxString& name, int p1, int p2, int p3)
109 {
110 long check = 0;
111 size_t i, max = name.length();
112
113 for(i = 0; i < max; ++i )
114 {
115 check = (check << 1) ^ (long)name[i];
116 check = ((check >> 23) ^ check) & 0xFFFFFF;
117 }
118 check = (check << 1) ^ (long)p1;
119 check = ((check >> 23) ^ check) & 0xFFFFFF;
120 check = (check << 1) ^ (long)p2;
121 check = ((check >> 23) ^ check) & 0xFFFFFF;
122 check = (check << 1) ^ (long)p3;
123 check = ((check >> 23) ^ check) & 0xFFFFFF;
124 return check;
125 }
126
127 wxString ScoreFile::GetPreviousPlayer() const
128 {
129 wxString result;
130 m_config->SetPath(_T("/General"));
131 m_config->Read(_T("LastPlayer"), &result);
132 return result;
133 }
134
135 void ScoreFile::ReadPlayersScore(
136 const wxString& player,
137 int& wins,
138 int& games,
139 int& score)
140 {
141 long check = 0;
142 long myWins = 0, myGames = 0, myScore = 0;
143
144 games = wins = score = 0;
145
146 m_config->SetPath(_T("/Players"));
147 m_config->SetPath(player);
148 if (m_config->Read(_T("Score"), &myScore, 0L) &&
149 m_config->Read(_T("Games"), &myGames, 0L) &&
150 m_config->Read(_T("Wins"), &myWins, 0L) &&
151 m_config->Read(_T("Check"), &check, 0L))
152 {
153 if (check != CalcCheck(player, myGames, myWins, myScore))
154 {
155 wxMessageBox(_T("Score file corrupted"), _T("Warning"),
156 wxOK | wxICON_EXCLAMATION);
157 }
158 else
159 {
160 games = myGames;
161 wins = myWins;
162 score = myScore;
163 }
164 }
165 WritePlayersScore(player, wins, games, score);
166 }
167
168
169 void ScoreFile::WritePlayersScore(const wxString& player, int wins, int games, int score)
170 {
171 if (player)
172 {
173 m_config->SetPath(_T("/General"));
174 m_config->Write(_T("LastPlayer"), wxString(player)); // Without wxString tmp, thinks it's bool in VC++
175
176 m_config->SetPath(_T("/Players"));
177 m_config->SetPath(player);
178 m_config->Write(_T("Score"), (long)score);
179 m_config->Write(_T("Games"), (long)games);
180 m_config->Write(_T("Wins"), (long)wins);
181 m_config->Write(_T("Check"), CalcCheck(player, games, wins, score));
182 }
183 }