#include "sqlitehelper.h" #include #include #include "globalvariables.h" #include "MyButton.h" #include #include #include #include #include #include #include "navbar.h" #include "config.h" #include #include #include #include #include #define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 #ifdef _DEBUG #pragma comment (lib,"Qt5Xmld.lib") #else #pragma comment (lib,"Qt5Xml.lib") #endif #pragma comment (lib,"Shell32.lib") #if _MSC_VER >=1936 #include namespace fs = std::filesystem; #else #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include namespace fs = std::experimental::filesystem; #endif bool getMenu(std::wstring &path_str,QList *paths) { fs::directory_iterator* it = new fs::directory_iterator(path_str); for (auto file : *it) { Record record; if (fs::is_regular_file(file)) { if (file.path().extension().wstring() == L".lnk") { HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { IShellLink* pShellItem; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pShellItem); if (SUCCEEDED(hr)) { IPersistFile* pPersistFile; hr = pShellItem->QueryInterface(IID_IPersistFile, (void**)&pPersistFile); if (SUCCEEDED(hr)) { WCHAR szTargetPath[MAX_PATH]; LPOLESTR pszTargetPath = szTargetPath; hr = pPersistFile->Load(file.path().wstring().c_str(), STGM_READ); if (SUCCEEDED(hr)) { WIN32_FIND_DATA fd; hr = pShellItem->GetPath(szTargetPath, sizeof(szTargetPath), &fd, 0); ; if (SUCCEEDED(hr)) { *paths << QString::fromWCharArray(szTargetPath); } else { pPersistFile->Release(); pShellItem->Release(); CoUninitialize(); return false; } } else { pPersistFile->Release(); pShellItem->Release(); CoUninitialize(); return false; } pPersistFile->Release(); } else { pShellItem->Release(); pShellItem->Release(); CoUninitialize(); return false; } pShellItem->Release(); } else { CoUninitialize(); return false; } CoUninitialize(); } } }else if(fs::is_directory(file)) { getMenu(file.path().wstring(), paths); } } delete it; return true; } SQLiteHelper::SQLiteHelper(QObject *parent) : QObject(parent) { if (QSqlDatabase::contains("mydb")) { db = QSqlDatabase::database("mydb"); } else { db = QSqlDatabase::addDatabase("QSQLITE","mydb"); QString name = QApplication::applicationDirPath() + "/identifier.sqlite"; db.setDatabaseName(name); } if (!db.open()) { QMessageBox::critical(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("无法打开数据库")); exit_manager.exit(1); } } SQLiteHelper::~SQLiteHelper() { db.close(); QSqlDatabase::removeDatabase("mydb"); } bool SQLiteHelper::update_software() { HKEY hKeyUninstall = nullptr; QList* paths = new QList; /*QSqlQuery query; QString sql = "select * from kmd_menu;"; query.exec(sql); while(query.next()) { Record record; record.id = query.value("id").toInt(); record.sort = query.value("sort").toInt(); record.app_id = query.value("app_id").toString(); record.locked = query.value("locked").toBool(); record.type = query.value("type").toString(); record.category_id = query.value("category_id").toString(); record.name = query.value("name").toString(); record.orig_name = query.value("orig_name").toString(); record.version = query.value("version").toString(); record.dev = query.value("dev").toString(); record.create_time = query.value("create_time").toLongLong(); record.use_time = query.value("use_time").toLongLong(); record.op = query.value("op").toString(); record.func = query.value("func").toString(); record.path = query.value("path").toString(); record.url = query.value("url").toString(); QStringList path_list = record.path.split("\\"); path_list.removeLast(); QString path; for(auto str : path_list) { path.append(str); path.append("\\"); } path.remove(path.length() - 1, 1); records.insert(path, record); }*/ //开始菜单中已安装软件列表 /*WCHAR path[MAX_PATH]; HRESULT hr = SHGetFolderPathW(nullptr, CSIDL_COMMON_PROGRAMS, nullptr, 0, path);//获取ProgramData中开始菜单的路径 std::wstring path_str(path); getMenu(path_str, paths); for(int i=0;i reg_records; HKEY hKey; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys = 0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; // Get the class name and the value count. retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time // 枚举该列表下所有子键 for (DWORD i = 0; i public_programs_list; /*for(auto path:*paths) { QStringList path_list = path.split("\\"); path_list.removeLast(); QString path2; for(auto str : path_list) { path2.append(str); path2.append("\\"); } if(reg_records.contains(path2)) { reg_records[path2].path = path; public_programs_list.insert(reg_records[path2].orig_name, reg_records[path2]); } path2.remove(path2.length() - 1, 1); if(reg_records.contains(path2)) { reg_records[path2].path = path; public_programs_list.insert(reg_records[path2].orig_name, reg_records[path2]); } } delete paths;*/ for(auto key :reg_records.keys()) { public_programs_list.insert(reg_records[key].orig_name, reg_records[key]); } //进行网络请求,补全字段 SoftwareRequest software_request; software_request.sendRequest(&public_programs_list); QSqlQuery begin(db); if (!begin.exec("begin;")) { return false; } for(auto key : public_programs_list.keys()) { QString sql_find = "select sort from kmd_menu where orig_name='"; sql_find += key; sql_find += "';"; QSqlQuery query_find(db); if(!query_find.exec(sql_find)) { QSqlQuery rollback(db); rollback.exec("rollback;"); return false; } QString sql; if(query_find.next()) { sql = "update kmd_menu set"; sql += " path='"; sql += public_programs_list[key].path; sql += "'"; sql += " ,op='"; sql += public_programs_list[key].op; sql += "' ,func='"; sql += public_programs_list[key].func; sql += "' ,url='"; sql += public_programs_list[key].url; sql += "' where orig_name='"; sql += key; sql += "';"; } else { sql = "insert into kmd_menu (sort,app_id,locked,type,category_id,name,orig_name,version,dev,create_time,use_time,op,func,path,url,status) values ("; sql += "50"; sql += ",'"; sql += public_programs_list[key].app_id; sql += "',"; sql += QString::number(public_programs_list[key].locked); sql += ",'"; sql += public_programs_list[key].type; sql += "','"; sql += public_programs_list[key].category_id; sql += "','"; sql += public_programs_list[key].name; sql += "','"; sql += public_programs_list[key].orig_name; sql += "','"; sql += public_programs_list[key].version; sql += "','"; sql += public_programs_list[key].dev; sql += "',"; sql += QString::number(public_programs_list[key].create_time); sql += ","; sql += QString::number(public_programs_list[key].use_time); sql += ",'"; sql += public_programs_list[key].op; sql += "','"; sql += public_programs_list[key].func; sql += "','"; sql += public_programs_list[key].path; sql += "','"; sql += public_programs_list[key].url; sql += "','"; sql += public_programs_list[key].status; sql += "');"; } QSqlQuery query(db); if(!query.exec(sql)) { QSqlQuery rollback("rollback;"); rollback.exec(); return false; } } QSqlQuery commit(db); commit.exec("commit;"); return true; } void SetSVGBackColor(QDomElement& elem, QString strtagname, QString strattr, QString strattrval) { if (elem.tagName().compare(strtagname) == 0) { QString before_color = elem.attribute(strattr); elem.setAttribute(strattr, strattrval); QString color = elem.attribute(strattr); } for (int i = 0; i < elem.childNodes().count(); i++) { if (!elem.childNodes().at(i).isElement()) { continue; } SetSVGBackColor(elem.childNodes().at(i).toElement(), strtagname, strattr, strattrval); } } bool SQLiteHelper::get_software(QList* buttons, ConfigResponse* config_response) { QSqlQuery query(db); QString sql = "select * from kmd_menu where type='navbar' order by sort,orig_name asc ;"; if (!query.exec(sql)) { return false; } QByteArray* buffer = new QByteArray; while (query.next()) { QNetworkAccessManager manager; downloadSuccess = true; ButtonStruct button_struct; button_struct.path = query.value("path").toString(); button_struct.text = query.value("name").toString(); button_struct.orig_name = query.value("orig_name").toString(); button_struct.op = query.value("op").toString(); button_struct.func = query.value("func").toString(); button_struct.url = query.value("url").toString(); button_struct.initial_position = query.value("initial_position").toString(); QImage* image = new QImage(200, 200, QImage::Format_ARGB32); QImage* image_cover = new QImage(200, 200, QImage::Format_ARGB32); QString icon = QApplication::applicationDirPath() + query.value("logo").toString(); if(icon.isEmpty()) { icon = QApplication::applicationDirPath() + DEFAULT_IMAGE; } QFile file(icon); if (file.open(QIODevice::ReadOnly)) { QByteArray svg_buffer = file.readAll(); file.close(); QSvgRenderer* render_image = new QSvgRenderer(svg_buffer); QPainter painter_image(image); painter_image.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布 painter_image.fillRect(image->rect(), Qt::transparent); // 填充透明色 painter_image.setCompositionMode(QPainter::CompositionMode_SourceOver); // 恢复默认值 render_image->render(&painter_image); //修改颜色 QDomDocument doc; doc.setContent(svg_buffer); SetSVGBackColor(doc.documentElement(), "path", "fill", config_response->basic.title_cover_color); QSvgRenderer* render_image_cover = new QSvgRenderer(doc.toByteArray()); QPainter painter_image_cover(image_cover); painter_image_cover.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布 painter_image_cover.fillRect(image_cover->rect(), Qt::transparent); // 填充透明色 painter_image_cover.setCompositionMode(QPainter::CompositionMode_SourceOver); // 恢复默认值 render_image_cover->render(&painter_image_cover); delete render_image; delete render_image_cover; }else { icon = QApplication::applicationDirPath() + "/images/icon/default.svg"; QFile file(icon); if (file.open(QIODevice::ReadOnly)) { QByteArray svg_buffer = file.readAll(); file.close(); QSvgRenderer* render_image = new QSvgRenderer(svg_buffer); QPainter painter_image(image); painter_image.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布 painter_image.fillRect(image->rect(), Qt::transparent); // 填充透明色 painter_image.setCompositionMode(QPainter::CompositionMode_SourceOver); // 恢复默认值 render_image->render(&painter_image); //修改颜色 QDomDocument doc; doc.setContent(svg_buffer); SetSVGBackColor(doc.documentElement(), "path", "fill", config_response->basic.title_cover_color); QSvgRenderer* render_image_cover = new QSvgRenderer(doc.toByteArray()); QPainter painter_image_cover(image_cover); painter_image_cover.setCompositionMode(QPainter::CompositionMode_Clear); // 清除画布 painter_image_cover.fillRect(image_cover->rect(), Qt::transparent); // 填充透明色 painter_image_cover.setCompositionMode(QPainter::CompositionMode_SourceOver); // 恢复默认值 render_image_cover->render(&painter_image_cover); delete render_image; delete render_image_cover; } } button_struct.image = image; button_struct.image_cover = image_cover; button_struct.background_color = config_response->basic.backgroud_color; button_struct.text_color = QColor(config_response->basic.title_color); button_struct.text_cover_color = QColor(config_response->basic.title_cover_color); *buttons << button_struct; } return true; } void SQLiteHelper::cancelDownload() { disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); eventLoop.quit(); reply->abort(); downloadSuccess = false; } bool SQLiteHelper::update_app() { QString app_path = QApplication::applicationDirPath()+"/app"; for(auto dir: fs::directory_iterator(fs::path(app_path.toStdString()))) { if(fs::is_directory(dir)) { QString config_path = QString::fromWCharArray(dir.path().wstring().c_str())+"/kmd_config.json"; config_path.replace("/", "\\"); QFile config_file(config_path); if(!config_file.open(QIODevice::Text|QIODevice::ReadOnly)) { continue; } QByteArray buffer = config_file.readAll(); config_file.close(); QJsonDocument document = QJsonDocument::fromJson(buffer); if(!document.isObject()) { continue; } QJsonObject obj_root = document.object(); QSqlQuery query_sel(db); QString sql_sel = "select sort from kmd_menu where orig_name = '"; sql_sel += obj_root.value("orig_name").toString(); sql_sel += "';"; query_sel.exec(sql_sel); if(!query_sel.next()){ QSqlQuery query(db); time_t create_time; time(&create_time); QString sql = "insert into kmd_menu " "(sort, app_id, locked, type, category_id, name, orig_name," " version, dev, create_time, op, func, path, url, " "logo, initial_position,status) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; query.prepare(sql); query.addBindValue(50); query.addBindValue(obj_root.value("app_id").toString()); query.addBindValue(obj_root.value("locked").toBool()); query.addBindValue(obj_root.value("type").toString()); query.addBindValue(obj_root.value("category_id").toString()); query.addBindValue(obj_root.value("name").toString()); query.addBindValue(obj_root.value("orig_name").toString()); query.addBindValue(obj_root.value("version").toString()); query.addBindValue(obj_root.value("dev").toString()); query.addBindValue(create_time); query.addBindValue(obj_root.value("op").toString()); query.addBindValue(obj_root.value("func").toString()); query.addBindValue(obj_root.value("path").toString()); query.addBindValue(obj_root.value("url").toString()); query.addBindValue(obj_root.value("logo").toString()); query.addBindValue(obj_root.value("initial_position").toString()); query.addBindValue(obj_root.value("status").toBool()); query.exec(); } } } return true; }