diff options
author | Gluzskiy Alexandr <sss123next@list.ru> | 2010-08-24 05:07:08 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss123next@list.ru> | 2010-08-24 05:07:08 +0300 |
commit | 35c5cc6c13327c36e3e0bf0f5d6431a9c19c897a (patch) | |
tree | b0f884e8e88fe08bb0028836d74b479ae5752938 | |
parent | f6721be1f054f6ecfe25c8722113e97aa1a94de1 (diff) |
parse gpg output in utf8 format, possible locales bug fixed (need checks)
-rw-r--r-- | gpg_wrapper.cpp | 12 | ||||
-rw-r--r-- | main.cpp | 67 | ||||
-rw-r--r-- | options.cpp | 48 | ||||
-rw-r--r-- | utilities.cpp | 16 | ||||
-rw-r--r-- | utilities.h | 1 |
5 files changed, 91 insertions, 53 deletions
diff --git a/gpg_wrapper.cpp b/gpg_wrapper.cpp index 8ff6631..f9f4207 100644 --- a/gpg_wrapper.cpp +++ b/gpg_wrapper.cpp @@ -77,6 +77,7 @@ pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD TCHAR *home_dir = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
commandline += home_dir;
commandline += _T("\" ");
+ commandline += _T("--display-charset utf-8 ");
commandline += *acommandline;
mir_free(bin_path);
mir_free(home_dir);
@@ -87,8 +88,15 @@ pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD char* tmp = mir_utf8encodeW(commandline.c_str()); debuglog<<"in: "<<tmp<<"\n";
mir_free(tmp);
- }
- success = CreateProcess(NULL, (TCHAR*)commandline.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &sinfo, &pri);
+ }
+
+ TCHAR chNewEnv[128];
+ LPTSTR lpszCurrentVariable;
+ lpszCurrentVariable = (LPTSTR)chNewEnv;
+ _tcscpy(lpszCurrentVariable, _T("LANGUAGE=0"));
+
+
+ success = CreateProcess(NULL, (TCHAR*)commandline.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, (LPVOID)chNewEnv, NULL, &sinfo, &pri);
if (!success)
{
@@ -78,7 +78,7 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM {//parse gpg output
string out;
DWORD code;
- string::size_type p = 0, p2 = 0, stop = 0;
+ wstring::size_type p = 0, p2 = 0, stop = 0;
{
wstring cmd = _T("--batch --list-secret-keys");
if(pxExecute(&cmd, "", &out, &code) == pxNotFound)
@@ -87,7 +87,6 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM break;
}
}
- cp866_to_cp1251(&out);
while(p != string::npos)
{
if((p = out.find("sec ", p)) == string::npos)
@@ -97,31 +96,31 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM break;
stop = p;
p2 = out.find("/", p) - 1;
- TCHAR *tmp = mir_a2t(out.substr(p,p2-p).c_str());
+ TCHAR *tmp = mir_utf8decodeW(out.substr(p,p2-p).c_str());
item.pszText = tmp;
iRow = ListView_InsertItem(hwndList, &item);
ListView_SetItemText(hwndList, iRow, 4, tmp);
mir_free(tmp);
p2+=2;
p = out.find(" ", p2);
- tmp = mir_a2t(out.substr(p2,p-p2).c_str());
+ tmp = mir_utf8decodeW(out.substr(p2,p-p2).c_str());
ListView_SetItemText(hwndList, iRow, 0, tmp);
mir_free(tmp);
p = out.find("uid ", p);
p2 = out.find_first_not_of(" ", p+5);
p = out.find("<", p2);
- tmp = mir_a2t(out.substr(p2,p-p2).c_str());
+ tmp = mir_utf8decodeW(out.substr(p2,p-p2).c_str());
ListView_SetItemText(hwndList, iRow, 2, tmp);
mir_free(tmp);
p++;
p2 = out.find(">", p);
- tmp = mir_a2t(out.substr(p,p2-p).c_str());
+ tmp = mir_utf8decodeW(out.substr(p,p2-p).c_str());
ListView_SetItemText(hwndList, iRow, 1, tmp);
mir_free(tmp);
p = out.find("ssb ", p2) + 6;
p = out.find(" ", p) + 1;
p2 = out.find("\n", p);
- tmp = mir_a2t(out.substr(p,p2-p-1).c_str());
+ tmp = mir_utf8decodeW(out.substr(p,p2-p-1).c_str());
ListView_SetItemText(hwndList, iRow, 3, tmp);
mir_free(tmp);
ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE);// not sure about this
@@ -558,7 +557,6 @@ static BOOL CALLBACK DlgProcKeyGenDialog(HWND hwndDlg, UINT msg, WPARAM wParam, break;
} }
- cp866_to_cp1251(&out);
ListView_DeleteAllItems(hwndList_g);
while(p != string::npos)
{
@@ -569,31 +567,31 @@ static BOOL CALLBACK DlgProcKeyGenDialog(HWND hwndDlg, UINT msg, WPARAM wParam, break;
stop = p;
p2 = out.find("/", p) - 1;
- TCHAR *tmp = mir_a2t(out.substr(p,p2-p).c_str());
+ TCHAR *tmp = mir_utf8decodeW(out.substr(p,p2-p).c_str());
item.pszText = tmp;
iRow = ListView_InsertItem(hwndList_g, &item);
ListView_SetItemText(hwndList_g, iRow, 4, tmp);
mir_free(tmp);
p2+=2;
p = out.find(" ", p2);
- tmp = mir_a2t(out.substr(p2,p-p2).c_str());
+ tmp = mir_utf8decodeW(out.substr(p2,p-p2).c_str());
ListView_SetItemText(hwndList_g, iRow, 0, tmp);
mir_free(tmp);
p = out.find("uid ", p);
p2 = out.find_first_not_of(" ", p+5);
p = out.find("<", p2);
- tmp = mir_a2t(out.substr(p2,p-p2).c_str());
+ tmp = mir_utf8decodeW(out.substr(p2,p-p2).c_str());
ListView_SetItemText(hwndList_g, iRow, 2, tmp);
mir_free(tmp);
p++;
p2 = out.find(">", p);
- tmp = mir_a2t(out.substr(p,p2-p).c_str());
+ tmp = mir_utf8decodeW(out.substr(p,p2-p).c_str());
ListView_SetItemText(hwndList_g, iRow, 1, tmp);
mir_free(tmp);
p = out.find("ssb ", p2) + 6;
p = out.find(" ", p) + 1;
p2 = out.find("\n", p);
- tmp = mir_a2t(out.substr(p,p2-p-1).c_str());
+ tmp = mir_utf8decodeW(out.substr(p,p2-p-1).c_str());
ListView_SetItemText(hwndList_g, iRow, 3, tmp);
mir_free(tmp);
ListView_SetColumnWidth(hwndList_g, 0, LVSCW_AUTOSIZE);// not sure about this
@@ -696,7 +694,6 @@ static BOOL CALLBACK DlgProcLoadExistingKey(HWND hwndDlg,UINT msg,WPARAM wParam, break;
} }
- cp866_to_cp1251(&out);
while(p != string::npos)
{
if((p = out.find("pub ", p)) == string::npos)
@@ -706,31 +703,31 @@ static BOOL CALLBACK DlgProcLoadExistingKey(HWND hwndDlg,UINT msg,WPARAM wParam, break;
stop = p;
p2 = out.find("/", p) - 1;
- TCHAR *tmp = mir_a2t(out.substr(p,p2-p).c_str());
+ TCHAR *tmp = mir_utf8decodeW(out.substr(p,p2-p).c_str());
item.pszText = tmp;
iRow = ListView_InsertItem(hwndList, &item);
ListView_SetItemText(hwndList, iRow, 4, tmp);
mir_free(tmp);
p2+=2;
p = out.find(" ", p2);
- tmp = mir_a2t(out.substr(p2,p-p2).c_str());
+ tmp = mir_utf8decodeW(out.substr(p2,p-p2).c_str());
ListView_SetItemText(hwndList, iRow, 0, tmp);
mir_free(tmp);
p = out.find("uid ", p);
p2 = out.find_first_not_of(" ", p+5);
p = out.find("<", p2);
- tmp = mir_a2t(out.substr(p2,p-p2).c_str());
+ tmp = mir_utf8decodeW(out.substr(p2,p-p2).c_str());
ListView_SetItemText(hwndList, iRow, 2, tmp);
mir_free(tmp);
p++;
p2 = out.find(">", p);
- tmp = mir_a2t(out.substr(p,p2-p).c_str());
+ tmp = mir_utf8decodeW(out.substr(p,p2-p).c_str());
ListView_SetItemText(hwndList, iRow, 1, tmp);
mir_free(tmp);
p = out.find("sub ", p2) + 6;
p = out.find(" ", p) + 1;
p2 = out.find("\n", p);
- tmp = mir_a2t(out.substr(p,p2-p-1).c_str());
+ tmp = mir_utf8decodeW(out.substr(p,p2-p-1).c_str());
ListView_SetItemText(hwndList, iRow, 3, tmp);
mir_free(tmp);
ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE);// not sure about this
@@ -910,8 +907,8 @@ void ImportKey() return;
} DBDeleteContactSetting(new_key_hcnt, szGPGModuleName, "bAlwatsTrust");
- cp866_to_cp1251(&output);
{
+ char *tmp = NULL;
string::size_type s = output.find("gpg: key ") + strlen("gpg: key ");
string::size_type s2 = output.find(":", s);
DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyID", output.substr(s,s2-s).c_str());
@@ -922,21 +919,41 @@ void ImportKey() s+=2;
if((s2 = output.find("(", s)) == string::npos)
s2 = output.find("<", s);
- DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainName", output.substr(s,s2-s-1).c_str());
+ tmp = new char [output.substr(s,s2-s-1).length()+1];
+ strcpy(tmp, output.substr(s,s2-s-1).c_str());
+ mir_utf8decode(tmp, 0);
+ DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainName", tmp);
+ mir_free(tmp);
if((s = output.find(")", s2)) == string::npos)
s = output.find(">", s2);
s2++;
if(output[s] == ')')
{
- DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyComment", output.substr(s2,s-s2).c_str());
+ tmp = new char [output.substr(s2,s-s2).length()+1];
+ strcpy(tmp, output.substr(s2,s-s2).c_str());
+ mir_utf8decode(tmp, 0);
+ DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyComment", tmp);
+ mir_free(tmp);
s+=3;
s2 = output.find(">", s);
- DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainEmail", output.substr(s,s2-s).c_str());
+ tmp = new char [output.substr(s,s2-s).length()+1];
+ strcpy(tmp, output.substr(s,s2-s).c_str());
+ mir_utf8decode(tmp, 0);
+ DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainEmail", tmp);
+ mir_free(tmp);
}
else
+ {
+ tmp = new char [output.substr(s2,s-s2).length()+1];
+ strcpy(tmp, output.substr(s2,s-s2).c_str());
+ mir_utf8decode(tmp, 0);
DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainEmail", output.substr(s2,s-s2).c_str());
- }
- MessageBoxA(0, output.c_str(), "", MB_OK);
+ mir_free(tmp);
+ }
+ } + ptmp = mir_utf8decodeW(output.c_str()); + MessageBox(0, ptmp, _T(""), MB_OK); + mir_free(ptmp);
DeleteFile(tmp2);
}
}
\ No newline at end of file diff --git a/options.cpp b/options.cpp index 42d81d2..e00ebbd 100644 --- a/options.cpp +++ b/options.cpp @@ -289,12 +289,16 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA { if(hdr->hdr.code == LVN_ITEMCHANGED) { + void setClistIcon(HANDLE hContact); + void setSrmmIcon(HANDLE hContact); int i = hdr->iItem; if(ListView_GetItemState(hwndList, i, 0xF000) == 0x2000) DBWriteContactSettingByte(user_data[i+1], szGPGModuleName, "GPGEncryption", 1); else DBWriteContactSettingByte(user_data[i+1], szGPGModuleName, "GPGEncryption", 0); item_num = hdr->iItem; + setClistIcon(user_data[i+1]); + setSrmmIcon(user_data[i+1]); } } switch (((LPNMHDR)lParam)->code) @@ -592,27 +596,39 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP } mir_free(begin); mir_free(end); - cp866_to_cp1251(&output); DBDeleteContactSetting(user_data[item_num+1], szGPGModuleName, "bAlwatsTrust"); { TCHAR *tmp; + char *tmp2; string::size_type s = output.find("gpg: key ") + strlen("gpg: key "); - string::size_type s2 = output.find(":", s); - DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyID", output.substr(s,s2-s).c_str()); - tmp = mir_a2t(output.substr(s,s2-s).c_str()); + string::size_type s2 = output.find(":", s);
+ tmp2 = new char [output.substr(s,s2-s).length()+1];
+ strcpy(tmp2, output.substr(s,s2-s).c_str());
+ mir_utf8decode(tmp2, 0); + DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyID", tmp2); + mir_free(tmp2); + tmp = mir_utf8decodeW(output.substr(s,s2-s).c_str()); ListView_SetItemText(hwndList_p, item_num, 1, tmp); mir_free(tmp); s2+=2; s = output.find("\"", s2)-1; if(s != s2-1) - { + {
+ tmp2 = new char [output.substr(s2,s-s2).length()+1];
+ strcpy(tmp2, output.substr(s2,s-s2).c_str()); + mir_utf8decode(tmp2, 0); DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyType", output.substr(s2,s-s2).c_str()); + mir_free(tmp2); } s+=2; if((s2 = output.find("(", s)) == string::npos) s2 = output.find("<", s); + tmp2 = new char [output.substr(s,s2-s-1).length()+1];
+ strcpy(tmp2, output.substr(s,s2-s-1).c_str());
+ mir_utf8decode(tmp2, 0); DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyMainName", output.substr(s,s2-s-1).c_str()); - tmp = mir_a2t(output.substr(s,s2-s-1).c_str()); + mir_free(tmp2); + tmp = mir_utf8decodeW(output.substr(s,s2-s-1).c_str()); ListView_SetItemText(hwndList_p, item_num, 2, tmp); mir_free(tmp); if((s = output.find(")", s2)) == string::npos) @@ -620,18 +636,30 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP s2++; if(output[s] == ')') { + tmp2 = new char [output.substr(s2,s-s2).length()+1];
+ strcpy(tmp2, output.substr(s2,s-s2).c_str()); + mir_utf8decode(tmp2, 0); DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyComment", output.substr(s2,s-s2).c_str()); + mir_free(tmp2); s+=3; s2 = output.find(">", s); + tmp2 = new char [output.substr(s,s2-s).length()+1];
+ strcpy(tmp2, output.substr(s,s2-s).c_str()); + mir_utf8decode(tmp2, 0); DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyMainEmail", output.substr(s,s2-s).c_str()); - tmp = mir_a2t(output.substr(s,s2-s).c_str()); + mir_free(tmp2); + tmp = mir_utf8decodeW(output.substr(s,s2-s).c_str()); ListView_SetItemText(hwndList_p, item_num, 3, tmp); mir_free(tmp); } else { + tmp2 = new char [output.substr(s2,s-s2).length()+1];
+ strcpy(tmp2, output.substr(s2,s-s2).c_str()); + mir_utf8decode(tmp2, 0); DBWriteContactSettingString(user_data[item_num+1], szGPGModuleName, "KeyMainEmail", output.substr(s2,s-s2).c_str()); - tmp = mir_a2t(output.substr(s2,s-s2).c_str()); + mir_free(tmp2); + tmp = mir_utf8decodeW(output.substr(s2,s-s2).c_str()); ListView_SetItemText(hwndList_p, item_num, 3, tmp); mir_free(tmp); } @@ -640,7 +668,9 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP ListView_SetColumnWidth(hwndList_p, 2, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList_p, 3, LVSCW_AUTOSIZE); } - MessageBoxA(0, output.c_str(), "", MB_OK); + tmp = mir_utf8decodeW(output.c_str()); + MessageBox(0, tmp, _T(""), MB_OK); + mir_free(tmp); DeleteFile(tmp2); } delete [] tmp; diff --git a/utilities.cpp b/utilities.cpp index 07623e1..7d0b241 100644 --- a/utilities.cpp +++ b/utilities.cpp @@ -261,22 +261,6 @@ void storeOutput(HANDLE ahandle, string *output) } while (available>0);
}
-void cp866_to_cp1251(string *str)
-{
- string::iterator p;
- for(p = str->begin(); p != str->end(); p++)
- {
- if(*p > -129 && *p < -80)
- *p += 64;
- else if(*p > -33 && *p < -16)
- *p += 16;
- else if(*p == -16)
- *p -= 72;
- else if(*p == -17)
- *p -= 57;
- }
-}
-
void HistoryLog(HANDLE hContact, char *data, int event_type, int flags) { DBEVENTINFO Event = {0}; diff --git a/utilities.h b/utilities.h index b89dc2f..dadf5a6 100644 --- a/utilities.h +++ b/utilities.h @@ -24,7 +24,6 @@ void GetFolderPath(TCHAR *WindowTittle, char *szSetting); void storeOutput(HANDLE ahandle, string *output); -void cp866_to_cp1251(string *str); void HistoryLog(HANDLE hContact, char *data, int event_type, int flags); int ComboBoxAddStringUtf(HWND hCombo, const TCHAR *szString, DWORD data); |