summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Borisov <b0ric.alex@gmail.com>2012-01-21 17:43:02 +0200
committerAlex Borisov <b0ric.alex@gmail.com>2012-01-21 17:43:02 +0200
commit128c2dd624a78ef1e218871a4e4729625be56c04 (patch)
tree1cdd5e6fb619d15909116fe345ed15a841b5e4ec
parent6f8e7cae703145cd6eb103c08681045ced28f5e5 (diff)
Restart Proxifier to apply new configuration
-rw-r--r--client/Dialog.cpp15
-rw-r--r--client/Dialog.h3
-rw-r--r--client/Proxifier.cpp60
-rw-r--r--client/Proxifier.h5
-rw-r--r--client/main.cpp3
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())
{