]>
Commit | Line | Data |
---|---|---|
ce4e8c42 | 1 | #include <GameServ/DataLayer/File/FilePlayerDAO.h>\r |
2 | using GameServ::DataLayer::File::FilePlayerDAO;\r | |
3 | #include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r | |
4 | using GameServ::GameLayer::GameObjects::PlayerGO;\r | |
5 | \r | |
6 | #include <GameServ/DataLayer/DataLayerExceptions.h>\r | |
7 | using GameServ::DataLayer::Exceptions::ResourceException;\r | |
8 | using GameServ::DataLayer::Exceptions::DataLayerException;\r | |
9 | \r | |
f4f0d89d | 10 | #include <GameServ/DataLayer/File/FileId.h>\r |
11 | using GameServ::DataLayer::File::FileId;\r | |
12 | \r | |
ce4e8c42 | 13 | #include <boost/shared_ptr.hpp>\r |
14 | #include <boost/format.hpp>\r | |
15 | #include <boost/algorithm/string.hpp>\r | |
16 | #include <boost/lexical_cast.hpp>\r | |
17 | using boost::shared_ptr;\r | |
18 | using boost::format;\r | |
19 | using boost::str;\r | |
20 | using boost::algorithm::to_upper;\r | |
21 | using boost::lexical_cast;\r | |
22 | #include <boost/tokenizer.hpp>\r | |
23 | typedef boost::tokenizer<boost::char_separator<char> > \r | |
24 | tokenizer;\r | |
25 | \r | |
26 | #include <string>\r | |
27 | using std::string;\r | |
28 | \r | |
29 | #include <fstream>\r | |
30 | using std::ifstream;\r | |
31 | using std::getline;\r | |
f4f0d89d | 32 | using std::ofstream;\r |
33 | using std::endl;\r | |
ce4e8c42 | 34 | \r |
f4f0d89d | 35 | #include <map>\r |
36 | using std::map;\r | |
ce4e8c42 | 37 | \r |
38 | FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r | |
39 | {\r | |
40 | Initialize(GetPlayerFilePath());\r | |
41 | }\r | |
42 | \r | |
43 | FilePlayerDAO::FilePlayerDAO(const string &filename)\r | |
44 | {\r | |
45 | Initialize(filename);\r | |
46 | }\r | |
47 | \r | |
48 | FilePlayerDAO::~FilePlayerDAO()\r | |
49 | {\r | |
50 | }\r | |
51 | \r | |
52 | void FilePlayerDAO::Initialize(const string &filename)\r | |
53 | {\r | |
54 | mFilename = filename;\r | |
f4f0d89d | 55 | LoadPlayerCache();\r |
56 | }\r | |
57 | \r | |
58 | void FilePlayerDAO::LoadPlayerCache()\r | |
59 | {\r | |
60 | assert(!mFilename.empty());\r | |
61 | spPlayerCache.clear();\r | |
62 | ifstream infile;\r | |
63 | infile.open(mFilename.c_str());\r | |
64 | if (infile.fail())\r | |
65 | {\r | |
66 | throw DataLayerException(str(format("Unable to open %1% for loading Players") % mFilename),\r | |
67 | __FILE__, __LINE__);\r | |
68 | }\r | |
69 | while (!infile.eof())\r | |
70 | {\r | |
71 | string line;\r | |
72 | shared_ptr<PlayerGO> spPlayer;\r | |
73 | getline(infile, line);\r | |
74 | spPlayer = CreatePlayerFromLine(line);\r | |
75 | spPlayerCache[spPlayer->Id()] = spPlayer;\r | |
76 | }\r | |
77 | infile.close();\r | |
78 | }\r | |
79 | \r | |
80 | void FilePlayerDAO::WritePlayerCache()\r | |
81 | {\r | |
82 | ofstream outfile;\r | |
83 | outfile.open(mFilename.c_str());\r | |
84 | if (outfile.fail())\r | |
85 | {\r | |
86 | throw DataLayerException(str(format("Unable to open %1% for writing Players") % mFilename),\r | |
87 | __FILE__, __LINE__);\r | |
88 | }\r | |
89 | \r | |
90 | map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r | |
91 | for (iter = spPlayerCache.begin(); iter != spPlayerCache.end(); iter++)\r | |
92 | {\r | |
93 | outfile << CreateLineFromPlayer(iter->second) << endl;\r | |
94 | }\r | |
95 | outfile.close();\r | |
ce4e8c42 | 96 | }\r |
97 | \r | |
98 | string FilePlayerDAO::GetPlayerFilePath() const\r | |
99 | {\r | |
100 | return mFilename;\r | |
101 | }\r | |
102 | \r | |
103 | shared_ptr<PlayerGO> FilePlayerDAO::GetById(const string &Id) const\r | |
104 | {\r | |
105 | string line;\r | |
106 | ifstream infile;\r | |
107 | infile.open(GetPlayerFilePath().c_str());\r | |
108 | \r | |
109 | if (infile.fail())\r | |
110 | {\r | |
111 | throw ResourceException(str(format("Unable to open file %1%") % GetPlayerFilePath()), __FILE__, __LINE__);\r | |
112 | }\r | |
113 | \r | |
114 | \r | |
115 | while (getline(infile, line))\r | |
116 | {\r | |
117 | shared_ptr<PlayerGO> spPlayer = CreatePlayerFromLine(line);\r | |
118 | if (spPlayer->Id() == Id)\r | |
119 | {\r | |
120 | return spPlayer;\r | |
121 | }\r | |
122 | }\r | |
123 | return shared_ptr<PlayerGO>();\r | |
124 | }\r | |
125 | \r | |
126 | shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) const\r | |
127 | {\r | |
f4f0d89d | 128 | assert(!line.empty());\r |
ce4e8c42 | 129 | shared_ptr<PlayerGO> spPlayer;\r |
130 | spPlayer = shared_ptr<PlayerGO>(new PlayerGO());\r | |
2a8a990d | 131 | boost::char_separator<char> sep(" ", 0, boost::keep_empty_tokens);\r |
ce4e8c42 | 132 | tokenizer tokens(line, sep);\r |
133 | tokenizer::iterator tok_iter = tokens.begin();\r | |
134 | \r | |
f4f0d89d | 135 | spPlayer->Name((*tok_iter));\r |
136 | spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r | |
137 | tok_iter++;\r | |
2a8a990d | 138 | spPlayer->Level(lexical_cast<int>((*tok_iter)));\r |
139 | tok_iter++;\r | |
140 | spPlayer->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r | |
141 | tok_iter++;\r | |
142 | spPlayer->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r | |
143 | tok_iter++;\r | |
144 | spPlayer->Bank(lexical_cast<unsigned long int>((*tok_iter)));\r | |
145 | tok_iter++;\r | |
146 | spPlayer->Health(lexical_cast<int>((*tok_iter)));\r | |
147 | tok_iter++;\r | |
148 | spPlayer->MaxHealth(lexical_cast<int>((*tok_iter)));\r | |
149 | tok_iter++;\r | |
150 | spPlayer->Strength(lexical_cast<int>((*tok_iter)));\r | |
151 | tok_iter++;\r | |
152 | spPlayer->Defense(lexical_cast<int>((*tok_iter)));\r | |
153 | tok_iter++;\r | |
154 | spPlayer->ForestFights(lexical_cast<int>((*tok_iter)));\r | |
155 | tok_iter++;\r | |
156 | spPlayer->PlayerFights(lexical_cast<int>((*tok_iter)));\r | |
157 | tok_iter++;\r | |
158 | int flags = lexical_cast<int>((*tok_iter));\r | |
159 | SetFlags(spPlayer, flags);\r | |
160 | tok_iter++;\r | |
161 | spPlayer->Password((*tok_iter));\r | |
ce4e8c42 | 162 | \r |
eec695cf | 163 | // TODO: Add weapons, armor, and items\r |
164 | \r | |
ce4e8c42 | 165 | return spPlayer;\r |
166 | }\r | |
167 | \r | |
f4f0d89d | 168 | string FilePlayerDAO::CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const\r |
169 | {\r | |
170 | string line;\r | |
eec695cf | 171 | // TODO: Add weapons, armor, and items\r |
172 | line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12% %13%") % \r | |
f4f0d89d | 173 | spPlayer->Name() % spPlayer->Level() % spPlayer->Experience() % spPlayer->Gold() %\r |
174 | spPlayer->Bank() % spPlayer->Health() % spPlayer->MaxHealth() % spPlayer->Strength() %\r | |
175 | spPlayer->Defense() % spPlayer->ForestFights() % spPlayer->PlayerFights() %\r | |
176 | GetFlags(spPlayer) % spPlayer->Password());\r | |
177 | return line;\r | |
178 | }\r | |
179 | \r | |
2a8a990d | 180 | void FilePlayerDAO::SetFlags(shared_ptr<PlayerGO> spPlayer, const int &flags) const\r |
181 | {\r | |
eec695cf | 182 | // TODO: Add flags of course\r |
f4f0d89d | 183 | }\r |
ce4e8c42 | 184 | \r |
f4f0d89d | 185 | int FilePlayerDAO::GetFlags(shared_ptr<PlayerGO> spPlayer) const\r |
186 | {\r | |
eec695cf | 187 | // TODO: Return real flags\r |
f4f0d89d | 188 | return 0;\r |
2a8a990d | 189 | }\r |
ce4e8c42 | 190 | \r |
f21affc9 | 191 | void FilePlayerDAO::Update(shared_ptr<PlayerGO> spPlayer)\r |
192 | {\r | |
f4f0d89d | 193 | assert(spPlayer != 0);\r |
194 | assert(!spPlayer->Id().empty());\r | |
195 | assert(!spPlayer->Name().empty());\r | |
196 | \r | |
eec695cf | 197 | // TODO: Lock the file\r |
f4f0d89d | 198 | if (IdExists(spPlayer->Id()))\r |
199 | {\r | |
200 | spPlayerCache[spPlayer->Id()] = spPlayer;\r | |
eec695cf | 201 | WritePlayerCache();\r |
f4f0d89d | 202 | }\r |
203 | else\r | |
204 | {\r | |
205 | throw DataLayerException(str(format("Unable to Update Player %1%: Player does not exist") % \r | |
206 | spPlayer->Name()), __FILE__, __LINE__);\r | |
207 | }\r | |
f21affc9 | 208 | }\r |
209 | \r | |
210 | void FilePlayerDAO::Insert(shared_ptr<PlayerGO> spPlayer)\r | |
211 | {\r | |
f4f0d89d | 212 | assert(spPlayer != 0);\r |
213 | assert(!spPlayer->Name().empty());\r | |
eec695cf | 214 | // TODO: Lock the file\r |
f4f0d89d | 215 | if (!IdExists(FileId::CreatePlayerId(spPlayer->Name())))\r |
216 | {\r | |
217 | spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r | |
218 | spPlayerCache[spPlayer->Id()] = spPlayer;\r | |
eec695cf | 219 | ofstream outfile;\r |
220 | outfile.open(mFilename.c_str(), std::ios::app);\r | |
221 | if (outfile.fail())\r | |
222 | {\r | |
223 | throw ResourceException(str(format("Unable to open %1% for appending.") % mFilename), __FILE__, __LINE__);\r | |
224 | }\r | |
225 | outfile << CreateLineFromPlayer(spPlayer) << endl;\r | |
226 | outfile.close();\r | |
f4f0d89d | 227 | }\r |
228 | else\r | |
229 | {\r | |
230 | throw DataLayerException(str(format("Unable to Insert Player %1%: Player exists") %\r | |
231 | spPlayer->Name()), __FILE__, __LINE__);\r | |
232 | }\r | |
f21affc9 | 233 | }\r |
ce4e8c42 | 234 | \r |
f21affc9 | 235 | bool FilePlayerDAO::IdExists(const string &Id) const\r |
236 | {\r | |
f4f0d89d | 237 | map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r |
238 | iter = spPlayerCache.find(Id);\r | |
239 | return (iter != spPlayerCache.end());\r | |
f21affc9 | 240 | }\r |
241 | \r | |
242 | list<string> FilePlayerDAO::GetIdsByName(const string &Name) const\r | |
243 | {\r | |
f4f0d89d | 244 | list<string> ids;\r |
245 | if (IdExists(FileId::CreatePlayerId(Name)))\r | |
246 | {\r | |
247 | ids.push_back(FileId::CreatePlayerId(Name));\r | |
248 | }\r | |
249 | return ids;\r | |
f21affc9 | 250 | } |