00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "FSServer.h"
00027
00028 #include "Packet.h"
00029
00030 #ifdef _DEBUG
00031 #define new DEBUG_NEW
00032 #endif
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 Message::~Message()
00098 {
00099 for (unsigned int i = 0; i < mItems.size(); ++i) {
00100 delete mItems[i];
00101 }
00102
00103 mItems.erase(mItems.begin(), mItems.end());
00104 }
00105
00106 MessItem::~MessItem()
00107 {
00108 }
00109
00110 void MessItem::AddDesc(TiXmlElement * node) const
00111 {
00112 if (node != NULL && !mDesc.empty())
00113 node->SetAttribute("Description", mDesc.c_str());
00114 }
00115
00116 string MessItem::ToString() const
00117 {
00118 string m;
00119 if (!mDesc.empty()) {
00120 m = "Desc: ";
00121 m += mDesc;
00122 m += " ";
00123 }
00124
00125 return m;
00126 }
00127
00128 MessItem * MessItem::ParseNode(const TiXmlNode * node)
00129 {
00130 if (node == NULL)
00131 return NULL;
00132
00133 MessItem * mi;
00134 if (stricmp(node->Value(), "Player") == 0)
00135 mi = MessPlayer::ParseNode(node);
00136 else if (stricmp(node->Value(), "Number") == 0)
00137 mi = MessNumber::ParseNode(node);
00138 else if (stricmp(node->Value(), "Float") == 0)
00139 mi = MessFloat::ParseNode(node);
00140 else if (stricmp(node->Value(), "String") == 0)
00141 mi = MessString::ParseNode(node);
00142 else
00143 mi = MessLoc::ParseNode(node);
00144
00145 if (mi != NULL) {
00146 const TiXmlElement * tie = node->ToElement();
00147 if (tie != NULL && tie->Attribute("Description"))
00148 mi->mDesc = tie->Attribute("Description");
00149 }
00150
00151 return mi;
00152 }
00153
00154 MessLoc::~MessLoc()
00155 {
00156 if (mDWD)
00157 delete mLoc;
00158 }
00159
00160 void MessLoc::WriteNode(TiXmlNode * node) const
00161 {
00162 const Planet * planet = dynamic_cast<const Planet *>(mLoc);
00163 if (planet != NULL) {
00164 TiXmlElement * pNode = new TiXmlElement("Planet");
00165 AddDesc(pNode);
00166 pNode->SetAttribute("IDNumber", planet->GetID());
00167 AddString(pNode, "Name", planet->GetName().c_str());
00168 node->LinkEndChild(pNode);
00169 return;
00170 }
00171
00172 const Fleet * fleet = dynamic_cast<const Fleet *>(mLoc);
00173 if (fleet != NULL) {
00174 TiXmlElement * fNode = new TiXmlElement("Fleet");
00175 AddDesc(fNode);
00176 fNode->SetAttribute("IDNumber", fleet->GetID());
00177 AddLong(fNode, "Owner", fleet->GetOwner()->GetID());
00178 if (fleet->IsEmpty())
00179 fleet->WriteLocation(fNode);
00180 node->LinkEndChild(fNode);
00181 return;
00182 }
00183
00184 const Packet * packet = dynamic_cast<const Packet *>(mLoc);
00185 if (packet != NULL) {
00186 TiXmlElement * pNode = new TiXmlElement("Packet");
00187 AddDesc(pNode);
00188 pNode->SetAttribute("IDNumber", packet->GetID());
00189 if (packet->IsEmpty())
00190 packet->WriteLocation(pNode);
00191 node->LinkEndChild(pNode);
00192 return;
00193 }
00194
00195 const MineField * minef = dynamic_cast<const MineField *>(mLoc);
00196 if (minef != NULL) {
00197 TiXmlElement * mNode = new TiXmlElement("MineField");
00198 AddDesc(mNode);
00199 mNode->SetAttribute("IDNumber", minef->GetID());
00200 if (minef->IsEmpty())
00201 minef->WriteLocation(mNode);
00202 node->LinkEndChild(mNode);
00203 return;
00204 }
00205
00206 const Salvage * scrap = dynamic_cast<const Salvage *>(mLoc);
00207 if (scrap != NULL) {
00208 TiXmlElement * sNode = new TiXmlElement("Salvage");
00209 AddDesc(sNode);
00210 sNode->SetAttribute("IDNumber", scrap->GetID());
00211 if (scrap->IsEmpty())
00212 scrap->WriteLocation(sNode);
00213 node->LinkEndChild(sNode);
00214 return;
00215 }
00216
00217 TiXmlNode * lNode = mLoc->WriteLocation(node);
00218 AddDesc(lNode->ToElement());
00219 }
00220
00221 MessLoc * MessLoc::ParseNode(const TiXmlNode * node)
00222 {
00223 MessLoc * mi = NULL;
00224 const TiXmlElement * tie;
00225 if (stricmp(node->Value(), "Planet") == 0) {
00226 tie = node->ToElement();
00227 if (tie != NULL) {
00228 int pnum;
00229 tie->Attribute("IDNumber", &pnum);
00230 const Planet * p = TheGalaxy->GetPlanet(pnum);
00231 if (p != NULL)
00232 mi = new MessLoc("", p);
00233 }
00234 } else if (stricmp(node->Value(), "Fleet") == 0) {
00235 const Player * p = TheGame->GetPlayer(GetLong(node->FirstChild("Owner")));
00236 if (p != NULL) {
00237 int fNum;
00238 tie = node->ToElement();
00239 if (tie != NULL) {
00240 tie->Attribute("IDNumber", &fNum);
00241 const Fleet * f = p->GetFleet(fNum);
00242 if (f != NULL)
00243 mi = new MessLoc("", f);
00244 }
00245 }
00246 } else if (stricmp(node->Value(), "Packet") == 0) {
00247 } else if (stricmp(node->Value(), "MineField") == 0) {
00248 } else if (stricmp(node->Value(), "Salvage") == 0) {
00249 } else if (stricmp(node->Value(), "Location") == 0) {
00250 Location * loc = new Location();
00251 loc->ParseNode(node);
00252 mi = new MessLoc("", loc, true);
00253 }
00254
00255 return mi;
00256 }
00257
00258 bool MessLoc::StoreMessageLocation(const Location * loc)
00259 {
00260 if (mLoc != loc)
00261 return false;
00262
00263 assert(mDWD == false);
00264 mLoc = new Location(*loc);
00265 mDWD = true;
00266 return true;
00267 }
00268
00269 string MessLoc::ToString() const
00270 {
00271 string m = MessItem::ToString() + "Location(";
00272 m += Long2String(mLoc->GetPosX());
00273 m += ", ";
00274 m += Long2String(mLoc->GetPosY());
00275 m += ") : ";
00276
00277 const Planet * planet = dynamic_cast<const Planet *>(mLoc);
00278 if (planet != NULL)
00279 {
00280 m += "Planet-> " + planet->GetName();
00281 return m;
00282 }
00283
00284 const Fleet * fleet = dynamic_cast<const Fleet *>(mLoc);
00285 if (fleet != NULL)
00286 {
00287 m += "Fleet-> Owner(";
00288 m += Long2String(fleet->GetOwner()->GetID());
00289 m += ") IDNumber(";
00290 m += Long2String(fleet->GetID());
00291 m += ")";
00292 return m;
00293 }
00294
00295 const Packet * packet = dynamic_cast<const Packet *>(mLoc);
00296 if (packet != NULL)
00297 {
00298 m += "Packet-> IDNumber(" ;
00299 m += Long2String(packet->GetID());
00300 m += ")";
00301 return m;
00302 }
00303
00304 const MineField * minef = dynamic_cast<const MineField *>(mLoc);
00305 if (minef != NULL)
00306 {
00307 m += "MneField->";
00308
00309 return m;
00310 }
00311
00312 const Salvage * scrap = dynamic_cast<const Salvage *>(mLoc);
00313 if (scrap != NULL) {
00314 m += "Salvage-> IDNumber(";
00315 m += Long2String(scrap->GetID());
00316 m += ")";
00317 return m;
00318 }
00319
00320 return m;
00321 }
00322
00323 MessPlayer::~MessPlayer()
00324 {
00325 }
00326
00327 void MessPlayer::WriteNode(TiXmlNode * node) const
00328 {
00329 AddDesc(AddLong(node, "Player", mPlayer->GetID()));
00330 }
00331
00332 MessPlayer * MessPlayer::ParseNode(const TiXmlNode * node)
00333 {
00334 const Player * p = TheGame->GetPlayer(GetLong(node));
00335 if (p != NULL)
00336 return new MessPlayer("", p);
00337 else
00338 return NULL;
00339 }
00340
00341 string MessPlayer::ToString() const
00342 {
00343 return MessItem::ToString() + string("Player: ") + Long2String(mPlayer->GetID());
00344 }
00345
00346 MessNumber::~MessNumber()
00347 {
00348 }
00349
00350 void MessNumber::WriteNode(TiXmlNode * node) const
00351 {
00352 AddDesc(AddLong(node, "Number", mNumber));
00353 }
00354
00355 MessNumber * MessNumber::ParseNode(const TiXmlNode * node)
00356 {
00357 return new MessNumber("", GetLong(node));
00358 }
00359
00360 string MessNumber::ToString() const
00361 {
00362 return MessItem::ToString() + string("Number: ") + Long2String(mNumber);
00363 }
00364
00365 MessFloat::~MessFloat()
00366 {
00367 }
00368
00369 void MessFloat::WriteNode(TiXmlNode * node) const
00370 {
00371 AddDesc(AddDouble(node, "Float", mNumber));
00372 }
00373
00374 MessFloat * MessFloat::ParseNode(const TiXmlNode * node)
00375 {
00376 return new MessFloat("", GetDouble(node));
00377 }
00378
00379 string MessFloat::ToString() const
00380 {
00381 return MessItem::ToString() + string("Number: ") + Float2String(mNumber);
00382 }
00383
00384 MessString::~MessString()
00385 {
00386 }
00387
00388 void MessString::WriteNode(TiXmlNode * node) const
00389 {
00390 AddDesc(AddString(node, "String", mStr.c_str()));
00391 }
00392
00393 MessString * MessString::ParseNode(const TiXmlNode * node)
00394 {
00395 return new MessString("", GetString(node));
00396 }
00397
00398 string MessString::ToString() const
00399 {
00400 string m = MessItem::ToString() + "String: " + mStr;
00401 return m;
00402 }
00403
00404
00405 void Message::AddItem(MessItem * mi)
00406 {
00407 mItems.push_back(mi);
00408 }
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422 void Message::WriteNode(TiXmlNode * node) const
00423 {
00424 TiXmlElement * mNode = new TiXmlElement("Message");
00425 mNode->SetAttribute("Type", mType);
00426
00427 for (unsigned int i = 0; i < mItems.size(); ++i)
00428 mItems[i]->WriteNode(mNode);
00429
00430 node->LinkEndChild(mNode);
00431 }
00432
00433 bool Message::ParseNode(const TiXmlNode * node)
00434 {
00435 if (node == NULL)
00436 return false;
00437
00438 const TiXmlElement * tie = node->ToElement();
00439 if (tie == NULL)
00440 return false;
00441
00442 mType = tie->Attribute("Type");
00443 if (mType.empty())
00444 return false;
00445
00446 const TiXmlNode * child;
00447 MessItem * mi;
00448 for (child = node->FirstChild(); child != NULL; child = child->NextSibling()) {
00449 mi = MessItem::ParseNode(child);
00450 if (mi != NULL)
00451 AddItem(mi);
00452 }
00453
00454 return true;
00455 }
00456
00457 string Message::ToString() const
00458 {
00459 string m = "Message (" + mType + ") :";
00460 for (unsigned int i = 0; i < mItems.size(); ++i)
00461 m += "\n\t" + mItems[i]->ToString();
00462
00463 return m;
00464 }
00465
00466 void Message::StoreMessageLocation(const Location * loc, const Player * player)
00467 {
00468 for (int i = 0; i < mItems.size(); ++i) {
00469 MessLoc * ml = dynamic_cast<MessLoc *>(mItems[i]);
00470 if (ml != NULL) {
00471 if (ml->StoreMessageLocation(loc))
00472 AddItem("Deleted location", loc->GetName(player));
00473 }
00474 }
00475 }