00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "SaveManager.hpp"
00019
00020 #include <cstdio>
00021 #include <cstring>
00022 #include <boost/filesystem.hpp>
00023
00024 CSaveManager::CSaveManager()
00025 {}
00026
00027 CSaveManager::~CSaveManager()
00028 {
00029 CleanUp();
00030 }
00031
00032 void CSaveManager::CleanUp()
00033 {
00034 for(std::size_t CurSave = 0; CurSave < m_SaveData.size(); CurSave++)
00035 {
00036 delete m_SaveData[CurSave];
00037 }
00038 m_SaveData.clear();
00039 }
00040
00041 void CSaveManager::SaveFile(std::string File, std::string Campaign, int Mission, int Lives)
00042 {
00043 FILE* Save = std::fopen(File.c_str(),"wb");
00044 if(Save == NULL)
00045 {
00046 return;
00047 }
00048
00049 char Zero = '\0';
00050
00051 std::fwrite(Campaign.c_str(),Campaign.length(),1,Save);
00052 std::fwrite(&Zero,sizeof(char),1,Save);
00053 std::fwrite(&Mission,sizeof(int),1,Save);
00054 std::fwrite(&Lives,sizeof(int),1,Save);
00055
00056 std::fclose(Save);
00057 }
00058
00059 void CSaveManager::Save(std::string Folder, std::string Campaign, int Mission, int Lives)
00060 {
00061 ReadSavesFromFolder(Folder);
00062
00063 char FileName[100];
00064 std::sprintf(FileName,"/%d.sav",m_SaveData.size());
00065
00066 m_SaveData.clear();
00067
00068 std::string TempFile = Folder + FileName;
00069
00070 SaveFile(TempFile, Campaign, Mission, Lives);
00071 }
00072
00073 void CSaveManager::ReadSavesFromFolder(std::string Folder)
00074 {
00075 CleanUp();
00076
00077 boost::filesystem::directory_iterator end;
00078
00079 const long MaxLength = 200;
00080 std::string SaveName;
00081
00082 char Direction[MaxLength*3];
00083 char DataFile[MaxLength*3];
00084 std::memset(Direction,'\0',MaxLength*3);
00085 std::memset(DataFile,'\0',MaxLength*3);
00086
00087 std::string TempFolder = Folder + "/*.sav";
00088 std::strcpy(Direction,TempFolder.c_str());
00089
00090 for ( boost::filesystem::directory_iterator it =
00091 boost::filesystem::directory_iterator(boost::filesystem::path(Folder) );
00092 it != end; it++)
00093 {
00094 if (it->path().string().find(".sav") == std::string::npos)
00095 continue;
00096
00097 ReadSave(it->path().string());
00098 }
00099 }
00100
00101 SaveData* CSaveManager::ReadSave(std::string FileName)
00102 {
00103 FILE* Save = std::fopen(FileName.c_str(),"rb");
00104
00105 if(Save == NULL)
00106 {
00107 return NULL;
00108 }
00109
00110 std::string Name = "";
00111 char FileChar;
00112
00113 while(1)
00114 {
00115 std::fread(&FileChar,1,1,Save);
00116
00117 if((int)FileChar == 0)
00118 {
00119 break;
00120 }
00121
00122 Name += FileChar;
00123 }
00124
00125 int Mission;
00126 std::fread(&Mission,sizeof(int),1,Save);
00127 int Lives;
00128 std::fread(&Lives,sizeof(int),1,Save);
00129
00130 std::fclose(Save);
00131
00132 std::string ListName = "";
00133 std::size_t ListPos = Name.find("/",0);
00134 if(ListPos != std::string::npos)
00135 {
00136 ListName = Name.substr(ListPos + 1);
00137 ListName.erase(ListName.length() - 4,4);
00138
00139 ListName += ", Mission: ";
00140
00141 char strBuf[10];
00142 std::sprintf(strBuf,"%d",Mission + 1);
00143 ListName += strBuf;
00144 }
00145
00146 SaveData* Data = new SaveData;
00147 Data->SaveFile = FileName;
00148 Data->KampagneName = Name;
00149 Data->Mission = Mission;
00150 Data->ListName = ListName;
00151 Data->Lives = Lives;
00152
00153 m_SaveData.push_back(Data);
00154
00155 return Data;
00156 }