#include "common/pch.h" #include "ConfigUtil.h" #include #include #include "../common/JsonUtil.h" #include "../common/TimeUtil.h" bool fileExists(const std::string& filename) { std::ifstream file(filename); return file.good(); // Èç¹ûÎļþ³É¹¦´ò¿ª£¬Ôò·µ»Ø true } string ConfigUtil::getConfigPath() { wchar_t* appDataPath = nullptr; CString path; // »ñÈ¡APPDataĿ¼·¾¶ if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &appDataPath))) { std::wcout << L"APPDataĿ¼·¾¶: " << appDataPath << std::endl; path.Append(appDataPath); CoTaskMemFree(appDataPath); // ÊÍ·ÅÄÚ´æ } else { std::wcerr << L"ÎÞ·¨»ñÈ¡APPDataĿ¼·¾¶" << std::endl; return "config.cfg"; } path.Append(L"\\¼ÝÊ»²Õ"); // ÅжÏÎļþ¼ÐÊÇ·ñ´æÔÚ DWORD fileAttributes = GetFileAttributesW(path); if (fileAttributes == INVALID_FILE_ATTRIBUTES) { CreateDirectoryW(path, NULL); } string fpath = StringUtil::cstring2String(path); fpath.append("\\config.cfg"); return fpath.c_str(); } void ConfigUtil::readConfig(libconfig::Config& config) { string strConfPath = getConfigPath(); if (!fileExists(strConfPath)) { std::ofstream file(strConfPath); file.is_open(); } //½â¶ÁÅäÖÃÎļþ try { config.readFile(strConfPath.c_str()); } catch (const libconfig::FileIOException& fioex) { std::cerr << "I/O exception while reading the file." << std::endl; } catch (const libconfig::ParseException& pex) { std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine() << " - " << pex.getError() << std::endl; } } void ConfigUtil::writeConfig(libconfig::Config& config) { config.writeFile(getConfigPath().c_str()); } int ConfigUtil::readIntConfig(const char* key) { libconfig::Config mConfig; readConfig(mConfig); libconfig::Setting& root = mConfig.getRoot(); if (root.exists(key)) { int val; root.lookupValue(key, val); return val; } throw string("ÉÐδ»ñÈ¡µ½ÄÚÈÝ"); } string ConfigUtil::readStringConfig(const char* key) { libconfig::Config mConfig; readConfig(mConfig); libconfig::Setting& root = mConfig.getRoot(); if (root.exists(key)) { //string val; const char* val; root.lookupValue(key, val); return string(val); } throw string("ÉÐδ»ñÈ¡µ½ÄÚÈÝ"); } void ConfigUtil::setIntConfig(const char* key, int val) { libconfig::Config mConfig; readConfig(mConfig); libconfig::Setting& root = mConfig.getRoot(); if (root.exists(key)) { root[key] = val; } else { root.add(key, libconfig::Setting::TypeInt) = val; } writeConfig(mConfig); } void ConfigUtil::setStringConfig(const char* key, string val) { libconfig::Config mConfig; readConfig(mConfig); libconfig::Setting& root = mConfig.getRoot(); if (root.exists(key)) { root[key] = val.c_str(); } else { root.add(key, libconfig::Setting::TypeString) = val.c_str(); } writeConfig(mConfig); } list ConfigUtil::getKeys() { libconfig::Config mConfig; readConfig(mConfig); libconfig::Setting& root = mConfig.getRoot(); list keys; for (auto iter = root.begin(); iter != root.end(); ++iter) { keys.push_back(iter->getName()); } return keys; } void ConfigUtil::delKey(string key) { libconfig::Config mConfig; readConfig(mConfig); libconfig::Setting& root = mConfig.getRoot(); root.remove(key.c_str()); writeConfig(mConfig); } void ConfigUtil::setBuildServer(ServerInfo* server) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("ip"); writer.String(server->ip.c_str()); writer.Key("port"); writer.Int(server->port); writer.Key("userName"); writer.String(server->userName.c_str()); writer.Key("pwd"); writer.String(server->pwd.c_str()); writer.EndObject(); const char* json_content = buf.GetString(); setStringConfig("build_server_info", json_content); } ServerInfo* ConfigUtil::getBuildServer() { try { string result = readStringConfig("build_server_info"); auto doc = JsonUtil::parseUTF8(result); ServerInfo* server = new ServerInfo(); server->ip = doc["ip"].GetString(); server->port = doc["port"].GetInt(); server->userName = doc["userName"].GetString(); server->pwd = doc["pwd"].GetString(); return server; } catch (...) { return nullptr; } } void ConfigUtil::setProjectBuildInfo(ProjectBuildInfo* server, int index) { string key = string("project_build_info-").append(to_string(index)); rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("name"); writer.String(server->name.c_str()); writer.Key("dir"); writer.String(server->dir.c_str()); writer.Key("scriptFile"); writer.String(server->scriptFile.c_str()); writer.Key("outputDir"); writer.String(server->outputDir.c_str()); writer.Key("outputFile"); writer.String(server->outputFile.c_str()); writer.Key("targetServer"); writer.StartObject(); writer.Key("ip"); writer.String(server->targetServer.ip.c_str()); writer.Key("port"); writer.Int(server->targetServer.port); writer.Key("userName"); writer.String(server->targetServer.userName.c_str()); writer.Key("pwd"); writer.String(server->targetServer.pwd.c_str()); writer.EndObject(); writer.Key("targetDir"); writer.String(server->targetDir.c_str()); writer.Key("targetAppFile"); writer.String(server->targetAppFile.c_str()); writer.Key("targetAppRestartFile"); writer.String(server->targetAppRestartFile.c_str()); writer.EndObject(); const char* json_content = buf.GetString(); setStringConfig(key.c_str(), json_content); } ProjectBuildInfo* ConfigUtil::getProjectBuildInfo(int index) { try { string key = string("project_build_info-").append(to_string(index)); string result = readStringConfig(key.c_str()); auto doc = JsonUtil::parseUTF8(result); ProjectBuildInfo* server = new ProjectBuildInfo(); if (doc.HasMember("name")) { server->name = doc["name"].GetString(); } server->dir = doc["dir"].GetString(); server->scriptFile = doc["scriptFile"].GetString(); server->outputDir = doc["outputDir"].GetString(); server->outputFile = doc["outputFile"].GetString(); auto targetServer = doc["targetServer"].GetObjectW(); server->targetServer.ip = targetServer["ip"].GetString(); server->targetServer.port = targetServer["port"].GetInt(); server->targetServer.userName = targetServer["userName"].GetString(); server->targetServer.pwd = targetServer["pwd"].GetString(); server->targetDir = doc["targetDir"].GetString(); if (doc.HasMember("targetAppFile")) { server->targetAppFile = doc["targetAppFile"].GetString(); } if (doc.HasMember("targetAppRestartFile")) { server->targetAppRestartFile = doc["targetAppRestartFile"].GetString(); } return server; } catch (...) { return nullptr; } return nullptr; } void ConfigUtil::setLocalCacheDir(string dir) { setStringConfig("local_cache_dir", dir); } string ConfigUtil::getLocalCacheDir() { try { string result = readStringConfig("local_cache_dir"); return result; } catch (...) { return ""; } }