]>
git.saurik.com Git - wxWidgets.git/blob - demos/forty/scorefil.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Forty Thieves patience game
4 // Author: Chris Breeze
8 // Copyright: (c) 1993-1998 Chris Breeze
9 // Licence: wxWindows licence
10 //---------------------------------------------------------------------------
11 // Last modified: 14th May 1998 - ported to wxWindows 2.0
12 /////////////////////////////////////////////////////////////////////////////
15 #pragma implementation
19 // For compilers that support precompilation, includes "wx/wx.h".
20 #include "wx/wxprec.h"
35 #include "wx/textfile.h"
36 #include "wx/config.h"
37 #include "wx/fileconf.h"
41 ScoreFile::ScoreFile(const char* appName
)
45 m_configFilename
<< "/usr/local/share/" << appName
<< ".scores";
46 if (access(m_configFilename
, F_OK
) == 0)
48 if (access(m_configFilename
, R_OK
| W_OK
) != 0)
50 // file is not r/w - use local file instead
51 m_configFilename
= wxFileConfig::GetLocalFileName(appName
);
56 int fd
= creat(m_configFilename
, 0666);
60 // failed to create file - use local file instead
61 m_configFilename
= wxFileConfig::GetLocalFileName(appName
);
65 // ensure created file has rw-rw-rw permissions
71 m_config
= new wxConfig(appName
, "wxWindows", appName
, "", wxCONFIG_USE_LOCAL_FILE
); // only local
74 ScoreFile::~ScoreFile()
78 // ensure score file has rw-rw-rw permissions
79 // (wxFileConfig sets them to rw-------)
80 chmod(m_configFilename
, 0666);
85 void ScoreFile::GetPlayerList( wxArrayString
&list
)
87 m_config
->SetPath("/Players");
88 int length
= m_config
->GetNumberOfGroups();
90 if (length
<= 0) return;
94 if (m_config
->GetFirstGroup(player
, index
))
98 while (m_config
->GetNextGroup(player
, index
))
107 // Calculate an encrypted check number to prevent tampering with
109 long ScoreFile::CalcCheck(const char* name
, int p1
, int p2
, int p3
)
114 check
= (check
<< 1) ^ (long)*name
++;
115 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
117 check
= (check
<< 1) ^ (long)p1
;
118 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
119 check
= (check
<< 1) ^ (long)p2
;
120 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
121 check
= (check
<< 1) ^ (long)p3
;
122 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
126 wxString
ScoreFile::GetPreviousPlayer() const
129 m_config
->SetPath("/General");
130 m_config
->Read("LastPlayer", &result
);
134 void ScoreFile::ReadPlayersScore(
141 long myWins
= 0, myGames
= 0, myScore
= 0;
143 games
= wins
= score
= 0;
145 m_config
->SetPath("/Players");
146 m_config
->SetPath(player
);
147 if (m_config
->Read("Score", &myScore
, 0L) &&
148 m_config
->Read("Games", &myGames
, 0L) &&
149 m_config
->Read("Wins", &myWins
, 0L) &&
150 m_config
->Read("Check", &check
, 0L))
152 if (check
!= CalcCheck(player
, myGames
, myWins
, myScore
))
154 wxMessageBox("Score file corrupted", "Warning",
155 wxOK
| wxICON_EXCLAMATION
);
164 WritePlayersScore(player
, wins
, games
, score
);
168 void ScoreFile::WritePlayersScore(const char* player
, int wins
, int games
, int score
)
172 m_config
->SetPath("/General");
173 m_config
->Write("LastPlayer", wxString(player
)); // Without wxString tmp, thinks it's bool in VC++
175 m_config
->SetPath("/Players");
176 m_config
->SetPath(player
);
177 m_config
->Write("Score", (long)score
);
178 m_config
->Write("Games", (long)games
);
179 m_config
->Write("Wins", (long)wins
);
180 m_config
->Write("Check", CalcCheck(player
, games
, wins
, score
));