]> git.saurik.com Git - wxWidgets.git/blob - samples/forty/scorefil.cpp
Removed /install/gtk/configure from cvs
[wxWidgets.git] / samples / 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
42 ScoreFile::ScoreFile(const char* appName)
43 {
44 #ifdef 0
45 wxString filename;
46 m_configFilename << "/usr/local/share/" << appName << ".scores";
47 if (access(m_configFilename, F_OK) == 0)
48 {
49 if (access(m_configFilename, R_OK | W_OK) != 0)
50 {
51 // file is not r/w - use local file instead
52 m_configFilename = wxFileConfig::GetLocalFileName(appName);
53 }
54 }
55 else
56 {
57 int fd = creat(m_configFilename, 0666);
58
59 if (fd < 0)
60 {
61 // failed to create file - use local file instead
62 m_configFilename = wxFileConfig::GetLocalFileName(appName);
63 }
64 else
65 {
66 // ensure created file has rw-rw-rw permissions
67 close(fd);
68 }
69 }
70 #endif
71
72 #ifdef __UNIX__
73 m_config = new wxFileConfig( appName, "" ); // only local
74 #else
75 m_config = new wxFileConfig( "",appName ); // only global
76 #endif
77 }
78
79 ScoreFile::~ScoreFile()
80 {
81 delete m_config;
82 #ifdef __WXGTK__
83 // ensure score file has rw-rw-rw permissions
84 // (wxFileConfig sets them to rw-------)
85 chmod(m_configFilename, 0666);
86 #endif
87 }
88
89
90 void ScoreFile::GetPlayerList( wxArrayString &list )
91 {
92 m_config->SetPath("/Players");
93 int length = m_config->GetNumberOfGroups();
94
95 if (length <= 0) return;
96
97 wxString player;
98 long index, i = 0;
99 if (m_config->GetFirstGroup(player, index))
100 {
101 list.Add( player );
102 i++;
103 while (m_config->GetNextGroup(player, index))
104 {
105 list.Add( player );
106 i++;
107 }
108 }
109 }
110
111
112 // Calculate an encrypted check number to prevent tampering with
113 // score file
114 long ScoreFile::CalcCheck(const char* name, int p1, int p2, int p3)
115 {
116 long check = 0;
117 while (*name)
118 {
119 check = (check << 1) ^ (long)*name++;
120 check = ((check >> 23) ^ check) & 0xFFFFFF;
121 }
122 check = (check << 1) ^ (long)p1;
123 check = ((check >> 23) ^ check) & 0xFFFFFF;
124 check = (check << 1) ^ (long)p2;
125 check = ((check >> 23) ^ check) & 0xFFFFFF;
126 check = (check << 1) ^ (long)p3;
127 check = ((check >> 23) ^ check) & 0xFFFFFF;
128 return check;
129 }
130
131 wxString ScoreFile::GetPreviousPlayer() const
132 {
133 wxString result;
134 m_config->SetPath("/General");
135 m_config->Read(&result, "LastPlayer");
136 return result;
137 }
138
139 void ScoreFile::ReadPlayersScore(
140 const char* player,
141 int& wins,
142 int& games,
143 int& score)
144 {
145 long check;
146 long myWins, myGames, myScore;
147
148 games = wins = score = 0;
149
150 m_config->SetPath("/Players");
151 m_config->SetPath(player);
152 if (m_config->Read(&myScore, "Score") &&
153 m_config->Read(&myGames, "Games") &&
154 m_config->Read(&myWins, "Wins") &&
155 m_config->Read(&check, "Check"))
156 {
157 if (check != CalcCheck(player, myGames, myWins, myScore))
158 {
159 wxMessageBox("Score file corrupted", "Warning",
160 wxOK | wxICON_EXCLAMATION);
161 }
162 else
163 {
164 games = myGames;
165 wins = myWins;
166 score = myScore;
167 }
168 }
169 WritePlayersScore(player, wins, games, score);
170 }
171
172
173 void ScoreFile::WritePlayersScore(const char* player, int wins, int games, int score)
174 {
175 if (player)
176 {
177 m_config->SetPath("/General");
178 m_config->Write("LastPlayer", player);
179
180 m_config->SetPath("/Players");
181 m_config->SetPath(player);
182 m_config->Write("Score", score);
183 m_config->Write("Games", games);
184 m_config->Write("Wins", wins);
185 m_config->Write("Check", CalcCheck(player, games, wins, score));
186 }
187 }