summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2013-03-05 00:09:18 +0200
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2013-03-05 00:09:18 +0200
commit3ad5e6b61974c2d71f4afaefeab7c2ed8804176c (patch)
tree940dd58a2346b57dcc2da23be56fdc51368d978b
parentdd4c07b6f71dc074dabef6b27e5dd4c49d882bb2 (diff)
merged with miranda_ng main repo
-rwxr-xr-xgpg_wrapper.cpp37
-rwxr-xr-xmain.cpp12
-rwxr-xr-xutilities.cpp10
3 files changed, 43 insertions, 16 deletions
diff --git a/gpg_wrapper.cpp b/gpg_wrapper.cpp
index 5f9df7d..813c3f2 100755
--- a/gpg_wrapper.cpp
+++ b/gpg_wrapper.cpp
@@ -70,21 +70,22 @@ pxResult pxExecute(std::vector<std::wstring> &aargv, string *aoutput, LPDWORD ae
pipe pout = create_pipe();
+ pipe perr = create_pipe();
+ child *c = nullptr;
{
file_descriptor_sink sout(pout.sink, close_handle);
+ file_descriptor_sink serr(perr.sink, close_handle);
char *mir_path = new char [MAX_PATH];
CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)mir_path);
- child c = execute(set_args(argv), bind_stdout(sout), /*bind_stdin(sin),*/ show_window(SW_HIDE), hide_console(), inherit_env(), set_env(env), start_in_dir(toUTF16(mir_path)));
- _child = &c;
+ c = new child(execute(set_args(argv), bind_stdout(sout), bind_stderr(serr), close_stdin(),/*bind_stdin(sin),*/ show_window(SW_HIDE), hide_console(), inherit_env(), set_env(env), start_in_dir(toUTF16(mir_path))));
+ _child = c;
delete [] mir_path;
- auto ec = wait_for_exit(*_child);
- *aexitcode = ec;
- _child = nullptr;
}
-
+
+
file_descriptor_source source(pout.source, close_handle);
stream<file_descriptor_source> is(source);
@@ -102,11 +103,35 @@ pxResult pxExecute(std::vector<std::wstring> &aargv, string *aoutput, LPDWORD ae
if(bDebugLog)
debuglog<<std::string(time_str()+": failed to read from stream with error: " + e.what() + "\n\tSuccesfully read : " + *aoutput);
}
+
+ file_descriptor_source source2(perr.source, close_handle);
+
+ stream<file_descriptor_source> is2(source2);
+
+ try{
+ std::string s;
+ while(std::getline(is2, s))
+ {
+ aoutput->append(s);
+ aoutput->append("\n");
+ }
+ }
+ catch(const std::exception &e)
+ {
+ if(bDebugLog)
+ debuglog<<std::string(time_str()+": failed to read from stream with error: " + e.what() + "\n\tSuccesfully read : " + *aoutput);
+ }
+
fix_line_term(*aoutput);
if(bDebugLog)
debuglog<<std::string(time_str()+": gpg out: "+*aoutput);
+ auto ec = wait_for_exit(*c);
+ delete c;
+ *aexitcode = ec;
+ _child = nullptr;
+
if(*aexitcode)
{
diff --git a/main.cpp b/main.cpp
index a38ff2d..be2fe51 100755
--- a/main.cpp
+++ b/main.cpp
@@ -888,20 +888,12 @@ static INT_PTR CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam,
{
tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", (SHGetValue(HKEY_CURRENT_USER, _T("Software\\GNU\\GnuPG"), _T("gpgProgram"), 0, path, &len) == ERROR_SUCCESS)?path:_T(""));
if(tmp[0])
- {
if(!boost::filesystem::exists(tmp))
- {
MessageBox(0, TranslateT("wrong gpg binary location found in system.\nplease choose another location"), TranslateT("Warning"), MB_OK);
- }
-/* char *mir_path = (char*)mir_alloc(MAX_PATH);
- CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)mir_path);
- SetCurrentDirectoryA(mir_path);
- mir_free(mir_path); */
- }
}
- else
- tmp = mir_wstrdup(path);
+ else tmp = mir_wstrdup(path);
mir_free(path);
+
SetDlgItemText(hwndDlg, IDC_BIN_PATH, tmp);
bool bad_version = false;
if(gpg_exists/* && lang_exists*/)
diff --git a/utilities.cpp b/utilities.cpp
index 736e5cf..68f01a2 100755
--- a/utilities.cpp
+++ b/utilities.cpp
@@ -1976,28 +1976,38 @@ INT_PTR ImportGpGKeys(WPARAM w, LPARAM l)
void fix_line_term(std::string &s)
{
+ if(s.empty())
+ return;
boost::algorithm::erase_all(s, "\r\r");
}
void fix_line_term(std::wstring &s)
{
+ if(s.empty())
+ return;
boost::algorithm::erase_all(s, _T("\r\r"));
}
void strip_line_term(std::wstring &s)
{
+ if(s.empty())
+ return;
boost::algorithm::erase_all(s, _T("\r"));
boost::algorithm::erase_all(s, _T("\n"));
}
void strip_line_term(std::string &s)
{
+ if(s.empty())
+ return;
boost::algorithm::erase_all(s, "\r");
boost::algorithm::erase_all(s, "\n");
}
void strip_tags(std::wstring &str)
{
+ if(str.empty())
+ return;
boost::algorithm::erase_all(str, inopentag);
boost::algorithm::erase_all(str, inclosetag);
boost::algorithm::erase_all(str, outopentag);