diff options
author | Alex Borisov <b0ric.alex@gmail.com> | 2012-01-21 17:43:02 +0200 |
---|---|---|
committer | Alex Borisov <b0ric.alex@gmail.com> | 2012-01-21 17:43:02 +0200 |
commit | 128c2dd624a78ef1e218871a4e4729625be56c04 (patch) | |
tree | 1cdd5e6fb619d15909116fe345ed15a841b5e4ec | |
parent | 6f8e7cae703145cd6eb103c08681045ced28f5e5 (diff) |
Restart Proxifier to apply new configuration
-rw-r--r-- | client/Dialog.cpp | 15 | ||||
-rw-r--r-- | client/Dialog.h | 3 | ||||
-rw-r--r-- | client/Proxifier.cpp | 60 | ||||
-rw-r--r-- | client/Proxifier.h | 5 | ||||
-rw-r--r-- | client/main.cpp | 3 |
5 files changed, 82 insertions, 4 deletions
diff --git a/client/Dialog.cpp b/client/Dialog.cpp index b08213a..ab3f66e 100644 --- a/client/Dialog.cpp +++ b/client/Dialog.cpp @@ -22,6 +22,8 @@ ProxyDialog::ProxyDialog(QWidget *parent): QDialog(parent) return; } + connect(this, SIGNAL(finished(int)), this, SLOT(Closed(int))); + /* generic proxy panel */ topLabel = new QLabel(QString::fromLocal8Bit(cfg->TopPanelText.c_str())); topLabel->setObjectName("topLabel"); @@ -111,6 +113,19 @@ ProxyDialog::ProxyDialog(QWidget *parent): QDialog(parent) setLayout(mainLayout); } +void ProxyDialog::Closed(int i) +{ + Logger::Trace("Dialog closed\n"); + Proxifier *proxifier = Proxifier::GetInstance(); + if (!proxifier->IsValid()) + { + Logger::Fatal("No valid proxifier configuration file found!\n"); + } + if (!proxifier->Restart()) + { + Logger::Error("Unable to restart Proxifier process!\n"); + } +} void ProxyDialog::ProxyToggled(bool on) { diff --git a/client/Dialog.h b/client/Dialog.h index a6b5ecd..78d273b 100644 --- a/client/Dialog.h +++ b/client/Dialog.h @@ -26,12 +26,13 @@ public: ProxyDialog(QWidget *parent = 0); private slots: + void Closed(int i); void ProxyToggled(bool on); void StaticProxyToggled(bool on); void CountryActivated(int index); void StateActivated(int index); void CityActivated(int index); - + private: QButtonGroup *genericProxyGroup; QButtonGroup *staticProxyGroup; diff --git a/client/Proxifier.cpp b/client/Proxifier.cpp index 28964af..46e4339 100644 --- a/client/Proxifier.cpp +++ b/client/Proxifier.cpp @@ -1,6 +1,8 @@ #include <algorithm> #ifdef WIN32 + #include <windows.h> + #include <tlhelp32.h> #include <shlobj.h> #endif #include <QtCore> @@ -74,7 +76,7 @@ Proxifier::Proxifier(): valid(false) QString file = str; file += pathSlash + folderName + pathSlash + fileName; QFileInfo filePathInfo(file); - Logger::Info("Checking path: %s\n",file.toStdString().c_str()); + Logger::Info("Checking path: %s\n", file.toStdString().c_str()); if (filePathInfo.exists()) { filePath = filePathInfo.absoluteFilePath(); @@ -97,6 +99,62 @@ Proxifier::Proxifier(): valid(false) #endif } +bool Proxifier::Restart() +{ + char execName[] = "Proxifier.exe"; + Logger::Info("Restarting Proxifier process\n"); +#ifdef WIN32 + HANDLE hProcessSnap; + HANDLE hProcess; + PROCESSENTRY32 pe32; + + // Takes a snapshot of all the processes + hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hProcessSnap == INVALID_HANDLE_VALUE) + { + return false; + } + + // interate snapshot and find all process to be killed + pe32.dwSize = sizeof(PROCESSENTRY32); + if (!Process32First(hProcessSnap, &pe32)) + { + CloseHandle(hProcessSnap); + return false; + } + do + { + QString procName = QString::fromWCharArray(pe32.szExeFile); + if (QString::compare(procName, QString::fromLocal8Bit(execName)) == 0) + { + Logger::Trace("Killing Proxifier process\n"); + hProcess = OpenProcess(PROCESS_TERMINATE, 0, pe32.th32ProcessID); + TerminateProcess(hProcess, 0); + CloseHandle(hProcess); + } + } + while (Process32Next(hProcessSnap, &pe32)); + + // start over again + QString folderName = "Proxifier"; + QString pathSlash = "\\"; + TCHAR programFiles[MAX_PATH]; + if (SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, programFiles) != S_FALSE) + { + // check in %ProgramFiles(x86)% + char *str = wstrdup(programFiles); + QString program = str; + program += pathSlash + folderName + pathSlash + execName; + program.prepend("\""); + program.append("\""); + Logger::Trace("Starting process: %s\n", program.toStdString().c_str()); + + return QProcess::startDetached(program); + } +#endif + return false; +} + bool Proxifier::IsValid() { return valid; diff --git a/client/Proxifier.h b/client/Proxifier.h index a6862db..8751ca9 100644 --- a/client/Proxifier.h +++ b/client/Proxifier.h @@ -30,6 +30,11 @@ public: */ static Proxifier* GetInstance(); /** + * @brief restart Proxifier.exe process + * @return true on success or false otherwise + */ + bool Restart(); + /** * @brief Chack if the current config is valid * @return true if the config is valid or false otherwise * @note you may wish to try ReadConfig() before but if it doesn't help diff --git a/client/main.cpp b/client/main.cpp index 7c8be32..e561b15 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -32,8 +32,7 @@ int main(int argc, char *argv[]) dir = QString::fromStdString(path.substr(0, p)); } - // check if client should be update - fprintf(stderr, "%s\n", dir.toStdString().c_str()); + // check if the client should be updated QFileInfo newClient(dir + PathSlash + "client.bin.latest"); if (newClient.exists()) { |