From 4d20cb679ac6ca7efd23bc9ad99d33fc8794f693 Mon Sep 17 00:00:00 2001 From: Alexander Gluzsky Date: Fri, 8 Feb 2013 14:27:01 +0000 Subject: "boosted" process management misc process management optimizations (should be little faster now) git-svn-id: http://svn.miranda-ng.org/main/trunk@3479 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/New_GPG/src/utilities.cpp | 286 ++++++++++++-------------------------- 1 file changed, 86 insertions(+), 200 deletions(-) (limited to 'plugins/New_GPG/src/utilities.cpp') diff --git a/plugins/New_GPG/src/utilities.cpp b/plugins/New_GPG/src/utilities.cpp index 558e7f6875..8e56388172 100755 --- a/plugins/New_GPG/src/utilities.cpp +++ b/plugins/New_GPG/src/utilities.cpp @@ -330,7 +330,8 @@ int onProtoAck(WPARAM w, LPARAM l) string out; DWORD code; pxResult result; - wstring cmd = _T(" -o "); + std::vector cmd; + cmd.push_back(L"-o"); wstring file = filename; wstring::size_type p1 = file.rfind(_T(".gpg")); file.erase(p1, _tcslen(_T(".gpg"))); @@ -339,10 +340,8 @@ int onProtoAck(WPARAM w, LPARAM l) if(MessageBox(0, TranslateT("Target file exists, do you want to replace it ?"), TranslateT("Warning"), MB_YESNO) == IDNO) return 0; } + cmd.push_back(file); boost::filesystem::remove(file); - file.insert(0, _T("\"")); - file.insert(file.length(), _T("\" ")); - cmd += file; extern TCHAR *password; { // password TCHAR *pass = NULL; @@ -364,42 +363,29 @@ int onProtoAck(WPARAM w, LPARAM l) } if(_tcslen(pass) > 0) { - cmd += _T("--passphrase \""); - cmd += pass; - cmd += _T("\" "); + cmd.push_back(L"--passphrase"); + cmd.push_back(pass); } else if(password) { if(bDebugLog) debuglog<hContact, GCDNF_TCHAR))+" with password"); - cmd += _T("--passphrase \""); - cmd += password; - cmd += _T("\" "); + cmd.push_back(L"--passphrase"); + cmd.push_back(password); } else if (bDebugLog) debuglog<hContact, GCDNF_TCHAR))+" with out password"); mir_free(pass); mir_free(keyid); } - cmd += _T(" -d \""); - cmd += filename; - cmd += _T("\""); - gpg_execution_params params; - params.cmd = &cmd; - params.useless = ""; + cmd.push_back(L"-d"); + cmd.push_back(filename); + gpg_execution_params params(cmd); params.out = &out; params.code = &code; params.result = &result; - boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); - if(!gpg_thread->timed_join(boost::posix_time::minutes(15))) - { - delete gpg_thread; - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog<hContact; ShowLoadKeyPasswordWindow(); - wstring cmd2 = cmd; + std::vector cmd2 = cmd; if(password) { if(bDebugLog) debuglog<hContact, GCDNF_TCHAR))); - wstring tmp = _T("--passphrase \""); - tmp += password; - tmp += _T("\" "); - cmd2.insert(0, tmp); + std::vector tmp; + tmp.push_back(L"--passphrase"); + tmp.push_back(password); + cmd2.insert(cmd2.begin(), tmp.begin(), tmp.end()); } out.clear(); - gpg_execution_params params; + gpg_execution_params params(cmd2); //pxResult result; - params.cmd = &cmd2; - params.useless = ""; params.out = &out; params.code = &code; params.result = &result; - gpg_thread = gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); - if(!gpg_thread->timed_join(boost::posix_time::seconds(15))) + if(!gpg_launcher(params, boost::posix_time::seconds(15))) { - delete gpg_thread; - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog< cmd; + cmd.push_back(L"--batch"); + cmd.push_back(L"--tes"); + cmd.push_back(L"-r"); char *keyid = UniGetContactSettingUtf(hcnt, szGPGModuleName, "KeyID", ""); TCHAR *szKeyid = mir_a2t(keyid); TCHAR *name = _tcsrchr(filename,_T('\\')); @@ -508,58 +489,42 @@ std::wstring encrypt_file(HANDLE hContact, TCHAR *filename) name++; TCHAR *file_out = new TCHAR [_tcslen(filename)+4]; mir_sntprintf(file_out, _tcslen(name)+7, _T("%s.gpg"), name); - cmd += szKeyid; + cmd.push_back(szKeyid); if(DBGetContactSettingByte(hcnt, szGPGModuleName, "bAlwaysTrust", 0)) - cmd += _T(" --trust-model always "); + { + cmd.push_back(L"--trust-model"); + cmd.push_back(L"always"); + } mir_free(szKeyid); mir_free(keyid); - cmd += _T(" -o \""); + cmd.push_back(L"-o"); TCHAR *temp = _tgetenv(_T("TEMP")); - cmd += temp; - cmd += _T("\\"); - cmd += file_out; + cmd.push_back(wstring(temp) + L"\\" + file_out); wstring path_out = temp; path_out += _T("\\"); path_out += file_out; boost::filesystem::remove(path_out); - cmd += _T("\" "); - cmd += _T(" -e \""); - cmd += filename; - cmd += _T("\" "); - gpg_execution_params params; - params.cmd = &cmd; - params.useless = ""; + cmd.push_back(L"-e"); + cmd.push_back(filename); + gpg_execution_params params(cmd); params.out = &out; params.code = &code; params.result = &result; delete [] file_out; - boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); - if(!gpg_thread->timed_join(boost::posix_time::seconds(180))) - { - delete gpg_thread; - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog<timed_join(boost::posix_time::seconds(180))) - { - delete gpg_thread; - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog< tmp; + tmp.push_back(L"--trust-model"); + tmp.push_back(L"always"); + cmd.insert(cmd.begin(), tmp.begin(), tmp.end()); + if(!gpg_launcher(params, boost::posix_time::minutes(3))) return 0; - } } else return 0; @@ -672,23 +637,6 @@ int onSendFile(WPARAM w, LPARAM l) return CallService(MS_PROTO_CHAINSEND, w, l); } -void storeOutput(HANDLE ahandle, string *output) -{ - BOOL success; - char *readbuffer = NULL; - unsigned long transfered, available; - - do { - PeekNamedPipe(ahandle,NULL,0,NULL,&available,NULL); - if (!available) - continue; - readbuffer = (char*)mir_alloc(available); - success=ReadFile(ahandle,readbuffer,available,&transfered,NULL); - if (success && transfered) - output->append(readbuffer, available); - mir_free(readbuffer); - } while (available>0); -} void HistoryLog(HANDLE hContact, db_event evt) { @@ -832,7 +780,7 @@ static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pU extern TCHAR *password; string out; DWORD code; - wstring cmd; + std::vector cmd; { char *inkeyid; { @@ -865,48 +813,37 @@ static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pU } if(pass[0]) { - cmd += _T("--passphrase \""); - cmd += pass; - cmd += _T("\" "); + cmd.push_back(L"--passphrase"); + cmd.push_back(pass); } else if(password) { if(bDebugLog) debuglog< cmd; + cmd.push_back(L"--verify"); + cmd.push_back(L"-a"); + cmd.push_back(path_out); + cmd.push_back(status_file_out); + gpg_execution_params params(cmd); pxResult result; - params.cmd = &cmd; - params.useless = ""; params.out = &out; params.code = &code; params.result = &result; - boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); - if(!gpg_thread.timed_join(boost::posix_time::seconds(15))) + if(!gpg_launcher(params, boost::posix_time::seconds(15))) { - gpg_thread.~thread(); - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog< cmd; + cmd.push_back(L"--version"); + gpg_execution_params params(cmd); pxResult result; - params.cmd = &cmd; - params.useless = ""; params.out = &out; params.code = &code; params.result = &result; gpg_valid = true; - boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); - if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) - { - gpg_thread.~thread(); - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog< cmd; + cmd.push_back(L"--batch"); + cmd.push_back(L"-export-secret-keys"); + cmd.push_back(L"-a"); + gpg_execution_params params(cmd); params.out = &out; params.code = &code; params.result = &result; - boost::thread gpg_thread(boost::bind(&pxEexcute_thread, ¶ms)); - if(!gpg_thread.timed_join(boost::posix_time::seconds(10))) - { - gpg_thread.~thread(); - TerminateProcess(params.hProcess, 1); - params.hProcess = NULL; - if(bDebugLog) - debuglog< cmd; TCHAR *ptmp; string output; DWORD exitcode; @@ -1874,28 +1783,17 @@ INT_PTR ImportGpGKeys(WPARAM w, LPARAM l) wfstream f(path, std::ios::out); f< cmd; TCHAR tmp2[MAX_PATH] = {0}; TCHAR *ptmp; string output; @@ -1996,28 +1894,17 @@ INT_PTR ImportGpGKeys(WPARAM w, LPARAM l) wfstream f(tmp2, std::ios::out); f<