]>
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 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation
17 // For compilers that support precompilation, includes "wx/wx.h".
18 #include "wx/wxprec.h"
33 #include "wx/textfile.h"
34 #include "wx/config.h"
35 #include "wx/fileconf.h"
39 ScoreFile::ScoreFile(const wxString
& appName
)
43 m_configFilename
<< "/usr/local/share/" << appName
<< ".scores";
44 if (access(m_configFilename
, F_OK
) == 0)
46 if (access(m_configFilename
, R_OK
| W_OK
) != 0)
48 // file is not r/w - use local file instead
49 m_configFilename
= wxFileConfig::GetLocalFileName(appName
);
54 int fd
= creat(m_configFilename
, 0666);
58 // failed to create file - use local file instead
59 m_configFilename
= wxFileConfig::GetLocalFileName(appName
);
63 // ensure created file has rw-rw-rw permissions
69 m_config
= new wxConfig(appName
, _T("wxWidgets"), appName
, wxEmptyString
,
70 wxCONFIG_USE_LOCAL_FILE
); // only local
73 ScoreFile::~ScoreFile()
77 // ensure score file has rw-rw-rw permissions
78 // (wxFileConfig sets them to rw-------)
79 chmod(m_configFilename
, 0666);
84 void ScoreFile::GetPlayerList( wxArrayString
&list
)
86 m_config
->SetPath(_T("/Players"));
87 int length
= m_config
->GetNumberOfGroups();
89 if (length
<= 0) return;
93 if (m_config
->GetFirstGroup(player
, index
))
96 while (m_config
->GetNextGroup(player
, index
))
104 // Calculate an encrypted check number to prevent tampering with
106 long ScoreFile::CalcCheck(const wxString
& name
, int p1
, int p2
, int p3
)
109 size_t i
, max
= name
.length();
111 for(i
= 0; i
< max
; ++i
)
113 check
= (check
<< 1) ^ (long)name
[i
];
114 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
116 check
= (check
<< 1) ^ (long)p1
;
117 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
118 check
= (check
<< 1) ^ (long)p2
;
119 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
120 check
= (check
<< 1) ^ (long)p3
;
121 check
= ((check
>> 23) ^ check
) & 0xFFFFFF;
125 wxString
ScoreFile::GetPreviousPlayer() const
128 m_config
->SetPath(_T("/General"));
129 m_config
->Read(_T("LastPlayer"), &result
);
133 void ScoreFile::ReadPlayersScore(
134 const wxString
& player
,
140 long myWins
= 0, myGames
= 0, myScore
= 0;
142 games
= wins
= score
= 0;
144 m_config
->SetPath(_T("/Players"));
145 m_config
->SetPath(player
);
146 if (m_config
->Read(_T("Score"), &myScore
, 0L) &&
147 m_config
->Read(_T("Games"), &myGames
, 0L) &&
148 m_config
->Read(_T("Wins"), &myWins
, 0L) &&
149 m_config
->Read(_T("Check"), &check
, 0L))
151 if (check
!= CalcCheck(player
, myGames
, myWins
, myScore
))
153 wxMessageBox(_T("Score file corrupted"), _T("Warning"),
154 wxOK
| wxICON_EXCLAMATION
);
163 WritePlayersScore(player
, wins
, games
, score
);
167 void ScoreFile::WritePlayersScore(const wxString
& player
, int wins
, int games
, int score
)
171 m_config
->SetPath(_T("/General"));
172 m_config
->Write(_T("LastPlayer"), wxString(player
)); // Without wxString tmp, thinks it's bool in VC++
174 m_config
->SetPath(_T("/Players"));
175 m_config
->SetPath(player
);
176 m_config
->Write(_T("Score"), (long)score
);
177 m_config
->Write(_T("Games"), (long)games
);
178 m_config
->Write(_T("Wins"), (long)wins
);
179 m_config
->Write(_T("Check"), CalcCheck(player
, games
, wins
, score
));