From 0bb14e6fe677867ff83cc1128a2b0cc124d9850f Mon Sep 17 00:00:00 2001 From: Kermit Mei Date: Wed, 26 Nov 2008 19:47:42 +0800 Subject: [PATCH] Design Adjust --- doc/Readme | 17 ------- src/Cui.cpp | 85 ++++++++++++++++----------------- src/Cui.h | 8 +--- src/Dict.cpp | 6 ++- src/Dict.h | 8 ++-- src/Makefile | 143 -------------------------------------------------------- src/Manager.cpp | 20 ++++---- src/Manager.h | 19 ++------ src/Reciter.cpp | 8 ++-- src/Reciter.h | 2 +- src/main.cpp | 4 +- 11 files changed, 71 insertions(+), 249 deletions(-) delete mode 100644 doc/Readme delete mode 100644 src/Makefile diff --git a/doc/Readme b/doc/Readme deleted file mode 100644 index 3aea7df..0000000 --- a/doc/Readme +++ /dev/null @@ -1,17 +0,0 @@ - -1.下载源码,进入源码目录: -$ cd src/ - -2.编译程序: -$ make - -3.安装程序: -$ make install - -4.运行程序: -$ FreeRecite - -5.卸载程序: -$ make uninstall - -注意这里有一个文件权限问题,不要直接贴换到超级用户编译、安装程序。直接使用当前用户即可,其中向/usr/bin/拷贝文件使用sudo来完成,如果不成功,用户则需手动把当前目录的FreeRecite,拷贝到/usr/bin/,并修改相应权限。 diff --git a/src/Cui.cpp b/src/Cui.cpp index d986350..3aa429b 100644 --- a/src/Cui.cpp +++ b/src/Cui.cpp @@ -3,6 +3,7 @@ #include #include #include +#include "ConfigHolder.h" #include "Cui.h" #include "Manager.h" #include "Dict.h" @@ -11,17 +12,15 @@ namespace freeRecite { -CUI::CUI(const std::string &dir) +CUI::CUI() { - manager = new Manager; - if(!manager->load(dir)) { - std::cerr << "Can't load the configure file from " << dir << std::endl + if(!manager.load()) { + std::cerr << "Can't load " << configHolder.mgrFile() << std::endl << "The program exit!\n"; exit(EXIT_FAILURE); } - dict = new Dict(dir + "freeRecite.dict"); - if(!dict->loadDict()) { - std::cerr << "Can't load the dic from " << dir << std::endl + if(!dictionary.load()) { + std::cerr << "Can't load " << configHolder.dictFile() << std::endl << "The program exit!\n"; exit(EXIT_FAILURE); } @@ -30,8 +29,6 @@ CUI::CUI(const std::string &dir) CUI::~CUI() { - delete manager; - delete dict; } @@ -112,9 +109,9 @@ void CUI::creatNew() { std::string word, cmd; while(ifs.good()) { std::getline(ifs,word); - if(!dict->lookUp(word) && !word.empty()) { + if(!dictionary.lookUp(word) && !word.empty()) { std::cout << '\"' << word << '\"' - << " can't be fond in your dict"<creatTask(wordSet,cmd.c_str())) { + if(manager.creatTask(wordSet,cmd.c_str())) { std::cout << "Creat a task SUCCESS!" << std::endl; - manager->refresh(); + manager.refresh(); }else std::cerr << "Can't creat a task :}" << std::endl; } @@ -148,8 +145,8 @@ void CUI::testProcess(Reciter &tester) { bool testResult; std::cout << "Step 1: interpretation To key!" << std::endl; while(tester.isValid()) { - if(dict->lookUp(tester.getWord())){ - std::cout<<"[W]: "<word()<word()<< std::endl + <<"* " <phonetics() << "]"<translation() << std::endl + <<"* ["<lookUp(tester.getWord())){ - std::cout<<"[M]: "<translation()<word()<< std::endl + <<"* " <phonetics() << "]"<translation() << std::endl + <<"* ["<getActiveTasks()).size() == 0){ + if((manager.getActiveTasks()).size() == 0){ std::cout << "There's no tasks to review!" << std::endl; return; } unsigned i; std::cout<< "Which do you want to test [ 0 by default]: "; std::cin >> i; - if(i >= (manager->getActiveTasks()).size()) { + if(i >= (manager.getActiveTasks()).size()) { std::cerr<< "Error task!" << std::endl; return; } Reciter tester; - time_t taskID = (manager->getActiveTasks())[i]; + time_t taskID = (manager.getActiveTasks())[i]; - if(!tester.loadWords(taskID,manager->getDir().c_str())) { + if(!tester.loadWords(taskID)) { std::cerr << "error when load words!" << std::endl; return; } testProcess(tester); - if(manager->test(taskID,tester.getScore())) { + if(manager.test(taskID,tester.getScore())) { std::cout<<"Your score is " << tester.getScore() << std::endl; std::cout<<"You passed it!"<getNextTime(taskID); - if(manager->getTaskStep(taskID) == 8) + time_t nextTime = manager.getNextTime(taskID); + if(manager.getTaskStep(taskID) == 8) std::cout << "Congratulations! You have complish this task!" << std::endl; else { struct tm * timeinfo; @@ -308,18 +305,18 @@ void CUI::test() { void CUI::recite() { showActive(); - if((manager->getActiveTasks()).size() == 0) + if((manager.getActiveTasks()).size() == 0) return; unsigned i; std::cout<< "Which do you want to test: "; std::cin >> i; - if(i >= (manager->getActiveTasks()).size()) { + if(i >= (manager.getActiveTasks()).size()) { std::cerr<< "Error task!" << std::endl; return; } Reciter tester; - if(!tester.loadWords((manager->getActiveTasks())[i],manager->getDir().c_str())) { + if(!tester.loadWords((manager.getActiveTasks())[i])) { std::cerr << "error when load words!" << std::endl; return; } @@ -353,7 +350,7 @@ bool CUI::modify(const char *word) { getLine(inputStr); newItem.append("[M]"+inputStr); - if(!dict->modify(newItem)) { + if(!dictionary.modify(newItem)) { std::cout<<"ERROR!" << std::endl; return false; } @@ -380,7 +377,7 @@ bool CUI::modify(const std::string &word) { getLine(inputStr); newItem.append("[M]"+inputStr); - if(!dict->modify(newItem)) { + if(!dictionary.modify(newItem)) { std::cout<<"ERROR!" << std::endl; return false; } @@ -390,18 +387,18 @@ bool CUI::modify(const std::string &word) { void CUI::showActive() { clear(); - if(!manager->refresh()) { + if(!manager.refresh()) { std::cout << "The configure file is broken!" << std::endl; exit(EXIT_FAILURE); } - if(manager->getActiveTaskNum() == 0) { + if(manager.getActiveTaskNum() == 0) { std::cout << "There's no new task should be review,type \"new\" to creat one." << std::endl; - if(manager->getNextTime() != 0) { - time_t nextTime = manager->getNextTime(); + if(manager.getNextTime() != 0) { + time_t nextTime = manager.getNextTime(); struct tm * timeinfo; char buffer[30]; timeinfo = localtime(&nextTime); @@ -413,14 +410,14 @@ void CUI::showActive() { } } else { - std::cout << "There's " << manager->getActiveTaskNum() + std::cout << "There's " << manager.getActiveTaskNum() << " tasks should review." << std::endl; std::cout << "They are:" << std::endl; - for(int i = 0; i < manager->getActiveTaskNum(); ++i) { + for(int i = 0; i < manager.getActiveTaskNum(); ++i) { std::cout << i << ": " - << manager->getTaskName(manager->getActiveTasks()[i]) + << manager.getTaskName(manager.getActiveTasks()[i]) << std::endl; } } diff --git a/src/Cui.h b/src/Cui.h index 57d75ae..df16867 100644 --- a/src/Cui.h +++ b/src/Cui.h @@ -7,15 +7,12 @@ namespace freeRecite { -class Manager; -class Dict; -class Task; class Reciter; class CUI { public: - CUI(const std::string &dir); + CUI(); ~CUI(); void run(); @@ -31,9 +28,6 @@ private: void clear(); void getLine(std::string &input); void help(); - - Manager *manager; - Dict *dict; }; } //Namespace freeRecite end. diff --git a/src/Dict.cpp b/src/Dict.cpp index 9495954..490b597 100644 --- a/src/Dict.cpp +++ b/src/Dict.cpp @@ -2,10 +2,12 @@ #include #include "Dict.h" +#include "ConfigHolder.h" namespace freeRecite { -bool Dict::loadDict() { +bool Dict::load() { + std::string dictName = configHolder.dictFile().c_str(); std::ifstream ifs(dictName.c_str()); if(!ifs.is_open()) return false; @@ -105,5 +107,7 @@ const std::string &Dict::phonetics() const { return __phonetics; } +//This is a global variable. +Dict dictionary; } //namespace freeRecite end diff --git a/src/Dict.h b/src/Dict.h index 85f7b0b..96b38fc 100644 --- a/src/Dict.h +++ b/src/Dict.h @@ -39,16 +39,18 @@ namespace freeRecite { +class Dict; +extern Dict dictionary; + class Dict { public: - Dict(const std::string initDictName) - :dictName(initDictName) + Dict() { /* Do nothing! */ } ~Dict() { /* Do nothing! */ } - bool loadDict(); + bool load(); bool lookUp(const std::string &word); diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index a2ff5ce..0000000 --- a/src/Makefile +++ /dev/null @@ -1,143 +0,0 @@ -############################################################################# -# Makefile for building: FreeRecite -# Author1: Kermit Mei -# Author2: Jianjun Kong -# Template: app -# Target: FreeRecite -############################################################################# - -####### Compiler, tools and options - -CC = gcc -CXX = g++ -CFLAGS = -pipe -O2 -Wall -W $(DEFINES) -CXXFLAGS = -pipe -O2 -Wall -W $(DEFINES) -INCPATH = -I. -LINK = g++ -LFLAGS = -Wl -LIBS = $(SUBLIBS) -AR = ar cqs -TAR = tar -cf -COMPRESS = gzip -9f -COPY = cp -f -SED = sed -COPY_FILE = $(COPY) -COPY_DIR = $(COPY) -r -INSTALL_FILE = install -m 644 -p -INSTALL_DIR = $(COPY_DIR) -INSTALL_PROGRAM = install -m 755 -p -DEL_FILE = rm -f -SYMLINK = ln -sf -DEL_DIR = rm -rf -MOVE = mv -f -CHK_DIR_EXISTS= test -d -MKDIR = mkdir -p - -####### Output directory - -OBJECTS_DIR = ./ - -####### Files - -SOURCES = Cui.cpp \ - Dict.cpp \ - DictItem.cpp \ - ForgetCurve.cpp \ - main.cpp \ - Manager.cpp \ - Reciter.cpp \ - Task.cpp \ - WordList.cpp -OBJECTS = Cui.o \ - Dict.o \ - DictItem.o \ - ForgetCurve.o \ - main.o \ - Manager.o \ - Reciter.o \ - Task.o \ - WordList.o - -TARGET = FreeRecite - -####### Implicit rules - -.SUFFIXES: .o .c .cpp .cc .cxx .C - -.cpp.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.cc.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.cxx.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.C.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.c.o: - $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" - -####### Build rules - -$(TARGET): $(OBJECTS) - $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) - -clean: - -$(DEL_FILE) $(OBJECTS) - -$(DEL_FILE) *~ core *.core $(TARGET) - -####### Compile - -Cui.o: Cui.cpp Cui.h \ - Manager.h \ - Task.h \ - Dict.h \ - DictItem.h \ - Reciter.h \ - WordList.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o Cui.o Cui.cpp - -Dict.o: Dict.cpp Dict.h \ - DictItem.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o Dict.o Dict.cpp - -DictItem.o: DictItem.cpp DictItem.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o DictItem.o DictItem.cpp - -ForgetCurve.o: ForgetCurve.cpp ForgetCurve.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ForgetCurve.o ForgetCurve.cpp - -main.o: main.cpp Cui.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp - -Manager.o: Manager.cpp Manager.h \ - Task.h \ - ForgetCurve.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o Manager.o Manager.cpp - -Reciter.o: Reciter.cpp Reciter.h \ - WordList.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o Reciter.o Reciter.cpp - -Task.o: Task.cpp Task.h \ - ForgetCurve.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o Task.o Task.cpp - -WordList.o: WordList.cpp WordList.h - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o WordList.o WordList.cpp - -####### Install - -install: - $(MKDIR) ~/.FreeRecite/ - $(COPY_DIR) ../dict/FreeRecite/* ~/.FreeRecite/ - $(COPY_DIR) ../doc ~/.FreeRecite/ - sudo $(INSTALL_PROGRAM) ./FreeRecite /usr/bin/ - -uninstall: - $(DEL_DIR) ~/.FreeRecite/ - sudo $(DEL_FILE) /usr/bin/FreeRecite - - diff --git a/src/Manager.cpp b/src/Manager.cpp index 90b73e0..407ce69 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -3,17 +3,15 @@ #include #include +#include "ConfigHolder.h" #include "Manager.h" #include "ForgetCurve.h" #include "Task.h" namespace freeRecite { -static const std::string managerFile = "freeRecite.mgr"; - -bool Manager::load(const std::string &dir) { - std::string mgrFile = dir+freeRecite::managerFile; - std::ifstream ifs(mgrFile.c_str()); +bool Manager::load() { + std::ifstream ifs(configHolder.mgrFile().c_str()); if(!ifs.is_open()) return false; Task tmpTask; @@ -37,14 +35,11 @@ bool Manager::load(const std::string &dir) { if(!activeID.empty()) firstReviewTime = 0; - - mgrDir = dir; return true; } bool Manager::save() { - std::string mgrFile = mgrDir + freeRecite::managerFile; - std::ofstream ofs(mgrFile.c_str()); + std::ofstream ofs(configHolder.mgrFile().c_str()); if(!ofs.is_open()) return false; ofs << static_cast(allTasks.size()) << '\n'; @@ -65,7 +60,7 @@ bool Manager::refresh() { if(save()) { activeID.clear(); allTasks.clear(); - return load(mgrDir); + return load(); }else return false; } @@ -87,7 +82,7 @@ bool Manager::creatTask(const std::set &words, timeinfo = localtime(&curTime); strftime(buffer,20,"%Y%m%d%H%M%S.tkwd",timeinfo); - std::string desFileName = mgrDir + "tasks/" + buffer; + std::string desFileName = configHolder.tasksDir() + buffer; if(words.size()==0) return false; @@ -150,4 +145,7 @@ bool Manager::test(time_t taskID,int mark) { return (refresh() && result); } +//This is a global variable. +Manager manager; + } //namespace freeRecite end diff --git a/src/Manager.h b/src/Manager.h index 79423e5..1ee8719 100644 --- a/src/Manager.h +++ b/src/Manager.h @@ -36,11 +36,14 @@ #include #include #include - +#include "ConfigHolder.h" #include "Task.h" namespace freeRecite { +class Manager; +extern Manager manager; + class Manager { public: @@ -51,7 +54,7 @@ public: //Read the information from freeRecite.mgr file. //If the loadfile can not be read, it returns false. - bool load(const std::string &dir); + bool load(); //Save the information to freeRecite.mgr file. bool save(); @@ -80,9 +83,6 @@ public: //Get the number of the tasks that should be reviewed. int getActiveTaskNum() const; - //Get the default directory. - const std::string &getDir() const; - /** * Get a point to the Task which is active. **/ @@ -118,17 +118,8 @@ private: time_t firstReviewTime; std::map allTasks; std::vector activeID; - std::string mgrDir; - - static const std::string managerFile; }; - -inline -const std::string &Manager::getDir() const { - return mgrDir; -} - inline time_t Manager::getNextTime() const { return firstReviewTime; diff --git a/src/Reciter.cpp b/src/Reciter.cpp index 6e36c17..4fb7532 100644 --- a/src/Reciter.cpp +++ b/src/Reciter.cpp @@ -3,21 +3,19 @@ #include #include #include +#include "ConfigHolder.h" #include "Reciter.h" #include "WordList.h" namespace freeRecite { -bool Reciter::loadWords(time_t taskID,const char *configDir) { +bool Reciter::loadWords(time_t taskID) { struct tm * timeinfo; char buffer[20]; timeinfo = localtime(&taskID); strftime(buffer,20,"%Y%m%d%H%M%S.tkwd",timeinfo); - taskFileName.clear(); - taskFileName.append(configDir); - taskFileName.append("tasks/"); - taskFileName.append(buffer); + taskFileName = configHolder.tasksDir() + buffer; std::ifstream ifs(taskFileName.c_str()); if(!ifs.is_open()) diff --git a/src/Reciter.h b/src/Reciter.h index 961a909..c4207b6 100644 --- a/src/Reciter.h +++ b/src/Reciter.h @@ -52,7 +52,7 @@ public: * Load the words from the file, success return true. * Whenever you want to use this class, you must call it first. **/ - bool loadWords(time_t taskID,const char *configDir); + bool loadWords(time_t taskID); //The amount of the words in this task. unsigned capability() const; diff --git a/src/main.cpp b/src/main.cpp index a7d4ba8..e1506b5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,9 +6,7 @@ using namespace std; int main(void) { - std::string dir(getenv("HOME")); - dir.append("/.FreeRecite/"); - freeRecite::CUI cui(dir); + freeRecite::CUI cui; cui.run(); return 0; } -- 2.11.4.GIT