From 7271c7ff35b74b7fa0bb9dd2db95b99fb9f9db01 Mon Sep 17 00:00:00 2001 From: s_nakamoto Date: Sun, 14 Feb 2010 00:08:27 +0000 Subject: [PATCH] Workaround for bug on wxWidgets 2.9.0 Ubuntu 9.10 64-bit where first character of the hidden columns were displayed so status column had three numbers overprinted. Fixed by adding a leading space to the hidden columns. 64-bit compile with wxWidgets 2.9.0 seems to be fully working normally now. --- bignum.h | 8 ++------ main.cpp | 11 +++++------ net.cpp | 2 +- rpc.cpp | 2 +- ui.cpp | 40 ++++++++++++---------------------------- uint256.h | 14 +++++++++----- 6 files changed, 30 insertions(+), 47 deletions(-) diff --git a/bignum.h b/bignum.h index e1ab165b2..61ba3fa03 100644 --- a/bignum.h +++ b/bignum.h @@ -64,12 +64,6 @@ public: } } - explicit CBigNum(const std::string& str) - { - BN_init(this); - SetHex(str); - } - CBigNum& operator=(const CBigNum& b) { if (!BN_copy(this, &b)) @@ -407,6 +401,7 @@ public: CBigNum& operator>>=(unsigned int shift) { + // Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number if (!BN_rshift(this, this, shift)) throw bignum_error("CBigNum:operator>>= : BN_rshift failed"); return *this; @@ -516,6 +511,7 @@ inline const CBigNum operator<<(const CBigNum& a, unsigned int shift) inline const CBigNum operator>>(const CBigNum& a, unsigned int shift) { CBigNum r; + // Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number if (!BN_rshift(&r, &a, shift)) throw bignum_error("CBigNum:operator>> : BN_rshift failed"); return r; diff --git a/main.cpp b/main.cpp index 90d239fa0..0c7aff842 100644 --- a/main.cpp +++ b/main.cpp @@ -1570,7 +1570,9 @@ bool LoadBlockIndex(bool fAllowNew) txNew.vout.resize(1); txNew.vin[0].scriptSig = CScript() << 486604799 << CBigNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); txNew.vout[0].nValue = 50 * COIN; - txNew.vout[0].scriptPubKey = CScript() << CBigNum("0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704") << OP_CHECKSIG; + CBigNum bnPubKey; + bnPubKey.SetHex("0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704"); + txNew.vout[0].scriptPubKey = CScript() << bnPubKey << OP_CHECKSIG; CBlock block; block.vtx.push_back(txNew); block.hashPrevBlock = 0; @@ -3022,12 +3024,9 @@ string SendMoneyToBitcoinAddress(string strAddress, int64 nValue, CWalletTx& wtx return "You don't have enough money"; // Parse bitcoin address - uint160 hash160; - if (!AddressToHash160(strAddress, hash160)) + CScript scriptPubKey; + if (!scriptPubKey.SetBitcoinAddress(strAddress)) return "Invalid bitcoin address"; - // Send to bitcoin address - CScript scriptPubKey; - scriptPubKey.SetBitcoinAddress(hash160); return SendMoney(scriptPubKey, nValue, wtxNew); } diff --git a/net.cpp b/net.cpp index ada78eb36..d669b8c5e 100644 --- a/net.cpp +++ b/net.cpp @@ -1032,7 +1032,7 @@ void ThreadMessageHandler2(void* parg) { printf("ThreadMessageHandler started\n"); SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL); - loop + while (!fShutdown) { // Poll the connected nodes for messages vector vNodesCopy; diff --git a/rpc.cpp b/rpc.cpp index 9f28e7ec7..b176b1580 100644 --- a/rpc.cpp +++ b/rpc.cpp @@ -503,7 +503,7 @@ Value CallRPC(const string& strMethod, const Array& params) // Connect to localhost tcp::iostream stream("127.0.0.1", "8332"); if (stream.fail()) - throw runtime_error("unable to connect to server"); + throw runtime_error("couldn't connect to server"); // Send request string strRequest = JSONRPCRequest(strMethod, params, 1); diff --git a/ui.cpp b/ui.cpp index 586200d6e..aad599c77 100644 --- a/ui.cpp +++ b/ui.cpp @@ -328,7 +328,7 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) m_toolBar->Realize(); // resize to fit ubuntu's huge default font dResize = 1.20; - SetSize(dResize * GetSize().GetWidth(), 1.1 * GetSize().GetHeight()); + SetSize((dResize + 0.02) * GetSize().GetWidth(), 1.09 * GetSize().GetHeight()); #endif m_staticTextBalance->SetLabel(FormatMoney(GetBalance()) + " "); m_listCtrl->SetFocus(); @@ -346,24 +346,6 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent) m_listCtrl->InsertColumn(5, "Debit", wxLIST_FORMAT_RIGHT, dResize * 79); m_listCtrl->InsertColumn(6, "Credit", wxLIST_FORMAT_RIGHT, dResize * 79); - //m_listCtrlProductsSent->InsertColumn(0, "Category", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlProductsSent->InsertColumn(1, "Title", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlProductsSent->InsertColumn(2, "Description", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlProductsSent->InsertColumn(3, "Price", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlProductsSent->InsertColumn(4, "", wxLIST_FORMAT_LEFT, 100); - - //m_listCtrlOrdersSent->InsertColumn(0, "Time", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersSent->InsertColumn(1, "Price", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersSent->InsertColumn(2, "", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersSent->InsertColumn(3, "", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersSent->InsertColumn(4, "", wxLIST_FORMAT_LEFT, 100); - - //m_listCtrlOrdersReceived->InsertColumn(0, "Time", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersReceived->InsertColumn(1, "Price", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersReceived->InsertColumn(2, "Payment Status", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersReceived->InsertColumn(3, "", wxLIST_FORMAT_LEFT, 100); - //m_listCtrlOrdersReceived->InsertColumn(4, "", wxLIST_FORMAT_LEFT, 100); - // Init status bar int pnWidths[3] = { -100, 88, 290 }; #ifndef __WXMSW__ @@ -503,33 +485,34 @@ int CMainFrame::GetSortIndex(const string& strSort) void CMainFrame::InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSort, const wxString& str2, const wxString& str3, const wxString& str4, const wxString& str5, const wxString& str6) { - string str0 = strSort; - long nData = *(long*)&hashKey; + strSort = " " + strSort; // leading space to workaround wx2.9.0 ubuntu 9.10 bug + long nData = *(long*)&hashKey; // where first char of hidden column is displayed // Find item if (!fNew && nIndex == -1) { + string strHash = " " + hashKey.ToString(); while ((nIndex = m_listCtrl->FindItem(nIndex, nData)) != -1) - if (GetItemText(m_listCtrl, nIndex, 1) == hashKey.ToString()) + if (GetItemText(m_listCtrl, nIndex, 1) == strHash) break; } // fNew is for blind insert, only use if you're sure it's new if (fNew || nIndex == -1) { - nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), str0); + nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), strSort); } else { // If sort key changed, must delete and reinsert to make it relocate - if (GetItemText(m_listCtrl, nIndex, 0) != str0) + if (GetItemText(m_listCtrl, nIndex, 0) != strSort) { m_listCtrl->DeleteItem(nIndex); - nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), str0); + nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), strSort); } } - m_listCtrl->SetItem(nIndex, 1, hashKey.ToString()); + m_listCtrl->SetItem(nIndex, 1, " " + hashKey.ToString()); m_listCtrl->SetItem(nIndex, 2, str2); m_listCtrl->SetItem(nIndex, 3, str3); m_listCtrl->SetItem(nIndex, 4, str4); @@ -544,8 +527,9 @@ bool CMainFrame::DeleteLine(uint256 hashKey) // Find item int nIndex = -1; + string strHash = " " + hashKey.ToString(); while ((nIndex = m_listCtrl->FindItem(nIndex, nData)) != -1) - if (GetItemText(m_listCtrl, nIndex, 1) == hashKey.ToString()) + if (GetItemText(m_listCtrl, nIndex, 1) == strHash) break; if (nIndex != -1) @@ -1916,7 +1900,7 @@ CSendingDialog::CSendingDialog(wxWindow* parent, const CAddress& addrIn, int64 n fUIDone = false; fWorkDone = false; #ifndef __WXMSW__ - SetSize(1.2 * GetSize().GetWidth(), 1.05 * GetSize().GetHeight()); + SetSize(1.2 * GetSize().GetWidth(), 1.08 * GetSize().GetHeight()); #endif SetTitle(strprintf("Sending %s to %s", FormatMoney(nPrice).c_str(), wtx.mapValue["to"].c_str())); diff --git a/uint256.h b/uint256.h index 9a0c77049..6976d9dc0 100644 --- a/uint256.h +++ b/uint256.h @@ -299,19 +299,18 @@ public: return string(psz, psz + sizeof(pn)*2); } - void SetHex(const std::string& str) + void SetHex(const char* psz) { for (int i = 0; i < WIDTH; i++) pn[i] = 0; - // skip 0x - const char* psz = str.c_str(); + // skip leading spaces while (isspace(*psz)) psz++; + + // skip 0x if (psz[0] == '0' && tolower(psz[1]) == 'x') psz += 2; - while (isspace(*psz)) - psz++; // hex string to uint static char phexdigit[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0 }; @@ -332,6 +331,11 @@ public: } } + void SetHex(const std::string& str) + { + SetHex(str.c_str()); + } + std::string ToString() const { return (GetHex());