V0.01 beat3
[FreeRecite.git] / Manager.cpp
bloba03bd4c2e0262d1c42ca38415237e37732c95525
1 #include <fstream>
2 #include <set>
3 #include <map>
4 #include <ctime>
6 #include "Manager.h"
7 #include "ForgetCurve.h"
8 #include "Task.h"
10 namespace freeRecite {
12 static const std::string managerFile = "freeRecite.mgr";
14 bool Manager::load(const std::string &dir) {
15 std::string mgrFile = dir+freeRecite::managerFile;
16 std::ifstream ifs(mgrFile.c_str());
17 if(!ifs.is_open())
18 return false;
19 Task tmpTask;
20 unsigned amount;
21 ifs >> amount;
22 ifs.ignore(1,'\n');
23 while(amount > 0 && ifs.good()) {
24 ifs >> tmpTask;
25 allTasks[tmpTask.getID()] = tmpTask;
26 if(tmpTask.shouldReview())
27 activeID.push_back(tmpTask.getID());
28 --amount;
30 mgrDir = dir;
31 return true;
34 bool Manager::save() {
35 std::string mgrFile = mgrDir + freeRecite::managerFile;
36 std::ofstream ofs(mgrFile.c_str());
37 if(!ofs.is_open())
38 return false;
39 ofs << static_cast<unsigned>(allTasks.size()) << '\n';
40 std::map<time_t,Task>::const_iterator itr = allTasks.begin();
41 while(itr != allTasks.end()){
42 if(!ofs.good())
43 return false;
44 else {
45 if((itr->second).isAvailable())
46 ofs << itr->second;
47 ++itr;
50 return true;
53 bool Manager::refresh() {
54 if(save()) {
55 activeID.clear();
56 allTasks.clear();
57 return load(mgrDir);
58 }else
59 return false;
62 bool Manager::hasTask(time_t taskID) {
63 if(allTasks.find(taskID) == allTasks.end())
64 return true;
65 else
66 return false;
69 bool Manager::creatTask(const std::set<std::string> &words,
70 const char *taskName) {
71 time_t curTime;
72 struct tm * timeinfo;
73 char buffer[20];
75 time(&curTime);
76 timeinfo = localtime(&curTime);
77 strftime(buffer,20,"%Y%m%d%H%M%S.tkwd",timeinfo);
79 std::string desFileName = mgrDir + "tasks/" + buffer;
81 if(words.size()==0)
82 return false;
84 /**
85 * If there're some new words, then load them to this
86 * soft ware's standard file. By the way, the desFile
87 * coincide with the task's ID.
88 **/
89 std::ofstream desFile(desFileName.c_str());
90 if(!desFile.is_open())
91 return false;
93 std::set<std::string>::const_iterator itr_words = words.begin();
94 while(itr_words != words.end()) {
95 if(!desFile.good())
96 return false;
97 if(!itr_words->empty())
98 desFile << *itr_words << std::endl;
99 ++itr_words;
102 Task *newTask;
103 //Choose the task's name.
104 if(taskName == 0)
105 newTask = new Task(curTime,buffer);
106 else
107 newTask = new Task(curTime,taskName);
109 allTasks[newTask->getID()] = *newTask;
110 activeID.push_back(newTask->getID());
111 delete newTask;
112 return true;
115 const std::vector<time_t> &Manager::getActiveTasks() const{
116 return activeID;
119 int Manager::getActiveTaskNum() const {
120 return activeID.size();
123 //Get the task's name.
124 const std::string &Manager::getTaskName(time_t taskID)const {
125 return (allTasks.find(taskID)->second).getName();
128 //Get the step of the task.
129 int Manager::getTaskStep(time_t taskID)const {
130 return (allTasks.find(taskID)->second).getStep();
133 bool Manager::test(time_t taskID,int mark) {
134 bool result = (allTasks[taskID]).test(mark);
135 return (refresh() && result);
138 } //namespace freeRecite end