Browse Source

got rid of CheckForShutdown, replaced some thread-unsafe wxWidgets calls, Linux fixes, socket send MSG_NOSIGNAL, bind INADDR_ANY, works reliably on Linux now except if wxMessageBox is used in a thread other than the GUI thread

miguelfreitas
s_nakamoto 15 years ago
parent
commit
93cfb02acb
  1. 2
      db.cpp
  2. 9
      irc.cpp
  3. 67
      main.cpp
  4. 2
      main.h
  5. 193
      net.cpp
  6. 2
      net.h
  7. 63
      ui.cpp
  8. 3
      ui.h
  9. 60
      uibase.cpp
  10. 68
      uiproject.fbp
  11. 12
      util.cpp
  12. 14
      util.h

2
db.cpp

@ -550,7 +550,7 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet)
//printf("LoadWallet %s\n", wtx.GetHash().ToString().c_str()); //printf("LoadWallet %s\n", wtx.GetHash().ToString().c_str());
//printf(" %12I64d %s %s %s\n", //printf(" %12I64d %s %s %s\n",
// wtx.vout[0].nValue, // wtx.vout[0].nValue,
// DateTimeStr(wtx.nTime).c_str(), // DateTimeStrFormat("%x %H:%M:%S", wtx.nTime).c_str(),
// wtx.hashBlock.ToString().substr(0,14).c_str(), // wtx.hashBlock.ToString().substr(0,14).c_str(),
// wtx.mapValue["message"].c_str()); // wtx.mapValue["message"].c_str());
} }

9
irc.cpp

@ -167,9 +167,12 @@ void ThreadIRCSeed(void* parg)
while (!fShutdown) while (!fShutdown)
{ {
CAddress addrConnect("216.155.130.130:6667"); CAddress addrConnect("216.155.130.130:6667");
struct hostent* phostent = gethostbyname("chat.freenode.net"); if (!(fUseProxy && addrProxy.port == htons(9050)))
if (phostent && phostent->h_addr_list && phostent->h_addr_list[0]) {
addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(6667)); struct hostent* phostent = gethostbyname("chat.freenode.net");
if (phostent && phostent->h_addr_list && phostent->h_addr_list[0])
addrConnect = CAddress(*(u_long*)phostent->h_addr_list[0], htons(6667));
}
SOCKET hSocket; SOCKET hSocket;
if (!ConnectSocket(addrConnect, hSocket)) if (!ConnectSocket(addrConnect, hSocket))

67
main.cpp

@ -1361,15 +1361,24 @@ bool ScanMessageStart(Stream& s)
bool CheckDiskSpace(int64 nAdditionalBytes) bool CheckDiskSpace(int64 nAdditionalBytes)
{ {
wxLongLong nFreeBytesAvailable = 0; #ifdef __WXMSW__
if (!wxGetDiskSpace(GetDataDir(), NULL, &nFreeBytesAvailable)) uint64 nFreeBytesAvailable = 0; // bytes available to caller
{ uint64 nTotalNumberOfBytes = 0; // bytes on disk
printf("ERROR: wxGetDiskSpace() failed\n"); uint64 nTotalNumberOfFreeBytes = 0; // free bytes on disk
if (!GetDiskFreeSpaceEx(GetDataDir().c_str(),
(PULARGE_INTEGER)&nFreeBytesAvailable,
(PULARGE_INTEGER)&nTotalNumberOfBytes,
(PULARGE_INTEGER)&nTotalNumberOfFreeBytes))
{
printf("ERROR: GetDiskFreeSpaceEx() failed\n");
return true; return true;
} }
#else
uint64 nFreeBytesAvailable = filesystem::space(GetDataDir()).available;
#endif
// Check for 15MB because database could create another 10MB log file at any time // Check for 15MB because database could create another 10MB log file at any time
if (nFreeBytesAvailable.GetValue() < (int64)15000000 + nAdditionalBytes) if (nFreeBytesAvailable < (int64)15000000 + nAdditionalBytes)
{ {
fShutdown = true; fShutdown = true;
wxMessageBox("Warning: Your disk space is low ", "Bitcoin", wxICON_EXCLAMATION); wxMessageBox("Warning: Your disk space is low ", "Bitcoin", wxICON_EXCLAMATION);
@ -1546,7 +1555,7 @@ void PrintBlockTree()
pindex->nFile, pindex->nFile,
pindex->nBlockPos, pindex->nBlockPos,
block.GetHash().ToString().substr(0,14).c_str(), block.GetHash().ToString().substr(0,14).c_str(),
DateTimeStr(block.nTime).c_str(), DateTimeStrFormat("%x %H:%M:%S", block.nTime).c_str(),
block.vtx.size()); block.vtx.size());
CRITICAL_BLOCK(cs_mapWallet) CRITICAL_BLOCK(cs_mapWallet)
@ -1673,20 +1682,24 @@ bool ProcessMessages(CNode* pfrom)
bool fRet = false; bool fRet = false;
try try
{ {
CheckForShutdown(2);
CRITICAL_BLOCK(cs_main) CRITICAL_BLOCK(cs_main)
fRet = ProcessMessage(pfrom, strCommand, vMsg); fRet = ProcessMessage(pfrom, strCommand, vMsg);
CheckForShutdown(2); if (fShutdown)
return true;
} }
catch (std::ios_base::failure& e) { catch (std::ios_base::failure& e)
{
if (strstr(e.what(), "CDataStream::read() : end of data")) if (strstr(e.what(), "CDataStream::read() : end of data"))
{ {
// Allow exceptions from underlength message on vRecv // Allow exceptions from underlength message on vRecv
printf("ProcessMessage(%s, %d bytes) : Exception '%s' caught, normally caused by a message being shorter than its stated length\n", strCommand.c_str(), nMessageSize, e.what()); printf("ProcessMessage(%s, %d bytes) : Exception '%s' caught, normally caused by a message being shorter than its stated length\n", strCommand.c_str(), nMessageSize, e.what());
} }
else else
{
PrintException(&e, "ProcessMessage()"); PrintException(&e, "ProcessMessage()");
} catch (std::exception& e) { }
}
catch (std::exception& e) {
PrintException(&e, "ProcessMessage()"); PrintException(&e, "ProcessMessage()");
} catch (...) { } catch (...) {
PrintException(NULL, "ProcessMessage()"); PrintException(NULL, "ProcessMessage()");
@ -2093,7 +2106,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
bool SendMessages(CNode* pto) bool SendMessages(CNode* pto)
{ {
CheckForShutdown(2);
CRITICAL_BLOCK(cs_main) CRITICAL_BLOCK(cs_main)
{ {
// Don't send anything until we get their version message // Don't send anything until we get their version message
@ -2223,12 +2235,10 @@ void GenerateBitcoins(bool fGenerate)
void ThreadBitcoinMiner(void* parg) void ThreadBitcoinMiner(void* parg)
{ {
vnThreadsRunning[3]++;
CheckForShutdown(3);
try try
{ {
bool fRet = BitcoinMiner(); vnThreadsRunning[3]++;
printf("BitcoinMiner returned %s\n", fRet ? "true" : "false"); BitcoinMiner();
vnThreadsRunning[3]--; vnThreadsRunning[3]--;
} }
catch (std::exception& e) { catch (std::exception& e) {
@ -2238,6 +2248,8 @@ void ThreadBitcoinMiner(void* parg)
vnThreadsRunning[3]--; vnThreadsRunning[3]--;
PrintException(NULL, "ThreadBitcoinMiner()"); PrintException(NULL, "ThreadBitcoinMiner()");
} }
printf("ThreadBitcoinMiner exiting, %d threads remaining\n", vnThreadsRunning[3]);
} }
int FormatHashBlocks(void* pbuffer, unsigned int len) int FormatHashBlocks(void* pbuffer, unsigned int len)
@ -2285,7 +2297,7 @@ void BlockSHA256(const void* pin, unsigned int nBlocks, void* pout)
} }
bool BitcoinMiner() void BitcoinMiner()
{ {
printf("BitcoinMiner started\n"); printf("BitcoinMiner started\n");
@ -2296,11 +2308,13 @@ bool BitcoinMiner()
{ {
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
Sleep(50); Sleep(50);
CheckForShutdown(3); if (fShutdown)
return;
while (vNodes.empty()) while (vNodes.empty())
{ {
Sleep(1000); Sleep(1000);
CheckForShutdown(3); if (fShutdown)
return;
} }
unsigned int nTransactionsUpdatedLast = nTransactionsUpdated; unsigned int nTransactionsUpdatedLast = nTransactionsUpdated;
@ -2324,7 +2338,7 @@ bool BitcoinMiner()
// //
auto_ptr<CBlock> pblock(new CBlock()); auto_ptr<CBlock> pblock(new CBlock());
if (!pblock.get()) if (!pblock.get())
return false; return;
// Add our coinbase tx as first transaction // Add our coinbase tx as first transaction
pblock->vtx.push_back(txNew); pblock->vtx.push_back(txNew);
@ -2433,7 +2447,7 @@ bool BitcoinMiner()
{ {
// Save key // Save key
if (!AddKey(key)) if (!AddKey(key))
return false; return;
key.MakeNewKey(); key.MakeNewKey();
// Process this block the same as if we had received it from another node // Process this block the same as if we had received it from another node
@ -2450,7 +2464,12 @@ bool BitcoinMiner()
// Update nTime every few seconds // Update nTime every few seconds
if ((++tmp.block.nNonce & 0xffff) == 0) if ((++tmp.block.nNonce & 0xffff) == 0)
{ {
CheckForShutdown(3); if (fShutdown)
return;
if (!fGenerateBitcoins)
return;
if (fLimitProcessors && vnThreadsRunning[3] > nLimitProcessors)
return;
if (tmp.block.nNonce == 0) if (tmp.block.nNonce == 0)
break; break;
if (pindexPrev != pindexBest) if (pindexPrev != pindexBest)
@ -2459,16 +2478,10 @@ bool BitcoinMiner()
break; break;
if (vNodes.empty()) if (vNodes.empty())
break; break;
if (!fGenerateBitcoins)
return true;
if (fLimitProcessors && vnThreadsRunning[3] > nLimitProcessors)
return true;
tmp.block.nTime = pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); tmp.block.nTime = pblock->nTime = max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
} }
} }
} }
return true;
} }

2
main.h

@ -68,7 +68,7 @@ bool CommitTransactionSpent(const CWalletTx& wtxNew, const CKey& key);
bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew); bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew);
void GenerateBitcoins(bool fGenerate); void GenerateBitcoins(bool fGenerate);
void ThreadBitcoinMiner(void* parg); void ThreadBitcoinMiner(void* parg);
bool BitcoinMiner(); void BitcoinMiner();

193
net.cpp

@ -48,6 +48,10 @@ bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet)
SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKET hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (hSocket == INVALID_SOCKET) if (hSocket == INVALID_SOCKET)
return false; return false;
#if defined(__BSD__) || defined(__WXOSX__)
int set = 1;
setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int));
#endif
bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168)); bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168));
bool fProxy = (fUseProxy && fRoutable); bool fProxy = (fUseProxy && fRoutable);
@ -68,7 +72,7 @@ bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet)
char* pszSocks4 = pszSocks4IP; char* pszSocks4 = pszSocks4IP;
int nSize = sizeof(pszSocks4IP); int nSize = sizeof(pszSocks4IP);
int ret = send(hSocket, pszSocks4, nSize, 0); int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL);
if (ret != nSize) if (ret != nSize)
{ {
closesocket(hSocket); closesocket(hSocket);
@ -100,7 +104,7 @@ bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const cha
if (!ConnectSocket(addrConnect, hSocket)) if (!ConnectSocket(addrConnect, hSocket))
return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString().c_str()); return error("GetMyExternalIP() : connection to %s failed", addrConnect.ToString().c_str());
send(hSocket, pszGet, strlen(pszGet), 0); send(hSocket, pszGet, strlen(pszGet), MSG_NOSIGNAL);
string strLine; string strLine;
while (RecvLine(hSocket, strLine)) while (RecvLine(hSocket, strLine))
@ -124,7 +128,8 @@ bool GetMyExternalIP2(const CAddress& addrConnect, const char* pszGet, const cha
if (strLine.find("<")) if (strLine.find("<"))
strLine = strLine.substr(0, strLine.find("<")); strLine = strLine.substr(0, strLine.find("<"));
strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r")); strLine = strLine.substr(strspn(strLine.c_str(), " \t\n\r"));
strLine = wxString(strLine).Trim(); while (strLine.size() > 0 && isspace(strLine[strLine.size()-1]))
strLine.resize(strLine.size()-1);
CAddress addr(strLine.c_str()); CAddress addr(strLine.c_str());
printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str()); printf("GetMyExternalIP() received [%s] %s\n", strLine.c_str(), addr.ToString().c_str());
if (addr.ip == 0 || addr.ip == INADDR_NONE || !addr.IsRoutable()) if (addr.ip == 0 || addr.ip == INADDR_NONE || !addr.IsRoutable())
@ -492,24 +497,26 @@ void ThreadSocketHandler(void* parg)
{ {
IMPLEMENT_RANDOMIZE_STACK(ThreadSocketHandler(parg)); IMPLEMENT_RANDOMIZE_STACK(ThreadSocketHandler(parg));
loop try
{ {
vnThreadsRunning[0]++; vnThreadsRunning[0]++;
CheckForShutdown(0); ThreadSocketHandler2(parg);
try vnThreadsRunning[0]--;
{
ThreadSocketHandler2(parg);
vnThreadsRunning[0]--;
}
catch (std::exception& e) {
vnThreadsRunning[0]--;
PrintException(&e, "ThreadSocketHandler()");
} catch (...) {
vnThreadsRunning[0]--;
PrintException(NULL, "ThreadSocketHandler()");
}
Sleep(5000);
} }
catch (std::exception& e) {
vnThreadsRunning[0]--;
PrintException(&e, "ThreadSocketHandler()");
} catch (...) {
vnThreadsRunning[0]--;
PrintException(NULL, "ThreadSocketHandler()");
}
foreach(CNode* pnode, vNodes)
closesocket(pnode->hSocket);
if (closesocket(hListenSocket) == SOCKET_ERROR)
printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
printf("ThreadSocketHandler exiting\n");
} }
void ThreadSocketHandler2(void* parg) void ThreadSocketHandler2(void* parg)
@ -600,7 +607,8 @@ void ThreadSocketHandler2(void* parg)
vnThreadsRunning[0]--; vnThreadsRunning[0]--;
int nSelect = select(hSocketMax + 1, &fdsetRecv, &fdsetSend, NULL, &timeout); int nSelect = select(hSocketMax + 1, &fdsetRecv, &fdsetSend, NULL, &timeout);
vnThreadsRunning[0]++; vnThreadsRunning[0]++;
CheckForShutdown(0); if (fShutdown)
return;
if (nSelect == SOCKET_ERROR) if (nSelect == SOCKET_ERROR)
{ {
int nErr = WSAGetLastError(); int nErr = WSAGetLastError();
@ -659,7 +667,8 @@ void ThreadSocketHandler2(void* parg)
vNodesCopy = vNodes; vNodesCopy = vNodes;
foreach(CNode* pnode, vNodesCopy) foreach(CNode* pnode, vNodesCopy)
{ {
CheckForShutdown(0); if (fShutdown)
return;
SOCKET hSocket = pnode->hSocket; SOCKET hSocket = pnode->hSocket;
// //
@ -708,7 +717,7 @@ void ThreadSocketHandler2(void* parg)
CDataStream& vSend = pnode->vSend; CDataStream& vSend = pnode->vSend;
if (!vSend.empty()) if (!vSend.empty())
{ {
int nBytes = send(hSocket, &vSend[0], vSend.size(), 0); int nBytes = send(hSocket, &vSend[0], vSend.size(), MSG_NOSIGNAL);
if (nBytes > 0) if (nBytes > 0)
{ {
vSend.erase(vSend.begin(), vSend.begin() + nBytes); vSend.erase(vSend.begin(), vSend.begin() + nBytes);
@ -747,24 +756,21 @@ void ThreadOpenConnections(void* parg)
{ {
IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg)); IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg));
loop try
{ {
vnThreadsRunning[1]++; vnThreadsRunning[1]++;
CheckForShutdown(1); ThreadOpenConnections2(parg);
try vnThreadsRunning[1]--;
{ }
ThreadOpenConnections2(parg); catch (std::exception& e) {
vnThreadsRunning[1]--; vnThreadsRunning[1]--;
} PrintException(&e, "ThreadOpenConnections()");
catch (std::exception& e) { } catch (...) {
vnThreadsRunning[1]--; vnThreadsRunning[1]--;
PrintException(&e, "ThreadOpenConnections()"); PrintException(NULL, "ThreadOpenConnections()");
} catch (...) {
vnThreadsRunning[1]--;
PrintException(NULL, "ThreadOpenConnections()");
}
Sleep(5000);
} }
printf("ThreadOpenConnections exiting\n");
} }
void ThreadOpenConnections2(void* parg) void ThreadOpenConnections2(void* parg)
@ -778,7 +784,8 @@ void ThreadOpenConnections2(void* parg)
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
Sleep(1000); Sleep(1000);
CheckForShutdown(1); if (fShutdown)
return;
} }
} }
@ -792,7 +799,8 @@ void ThreadOpenConnections2(void* parg)
{ {
OpenNetworkConnection(addr); OpenNetworkConnection(addr);
Sleep(1000); Sleep(1000);
CheckForShutdown(1); if (fShutdown)
return;
} }
} }
} }
@ -806,11 +814,13 @@ void ThreadOpenConnections2(void* parg)
const int nMaxConnections = 15; const int nMaxConnections = 15;
while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size()) while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size())
{ {
CheckForShutdown(1); if (fShutdown)
return;
Sleep(2000); Sleep(2000);
} }
vnThreadsRunning[1]++; vnThreadsRunning[1]++;
CheckForShutdown(1); if (fShutdown)
return;
// //
// Choose an address to connect to based on most recently seen // Choose an address to connect to based on most recently seen
@ -869,14 +879,16 @@ bool OpenNetworkConnection(const CAddress& addrConnect)
// //
// Initiate outbound network connection // Initiate outbound network connection
// //
CheckForShutdown(1); if (fShutdown)
return false;
if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip)) if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip))
return false; return false;
vnThreadsRunning[1]--; vnThreadsRunning[1]--;
CNode* pnode = ConnectNode(addrConnect); CNode* pnode = ConnectNode(addrConnect);
vnThreadsRunning[1]++; vnThreadsRunning[1]++;
CheckForShutdown(1); if (fShutdown)
return false;
if (!pnode) if (!pnode)
return false; return false;
pnode->fNetworkNode = true; pnode->fNetworkNode = true;
@ -914,24 +926,21 @@ void ThreadMessageHandler(void* parg)
{ {
IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg)); IMPLEMENT_RANDOMIZE_STACK(ThreadMessageHandler(parg));
loop try
{ {
vnThreadsRunning[2]++; vnThreadsRunning[2]++;
CheckForShutdown(2); ThreadMessageHandler2(parg);
try vnThreadsRunning[2]--;
{ }
ThreadMessageHandler2(parg); catch (std::exception& e) {
vnThreadsRunning[2]--; vnThreadsRunning[2]--;
} PrintException(&e, "ThreadMessageHandler()");
catch (std::exception& e) { } catch (...) {
vnThreadsRunning[2]--; vnThreadsRunning[2]--;
PrintException(&e, "ThreadMessageHandler()"); PrintException(NULL, "ThreadMessageHandler()");
} catch (...) {
vnThreadsRunning[2]--;
PrintException(NULL, "ThreadMessageHandler()");
}
Sleep(5000);
} }
printf("ThreadMessageHandler exiting\n");
} }
void ThreadMessageHandler2(void* parg) void ThreadMessageHandler2(void* parg)
@ -951,10 +960,14 @@ void ThreadMessageHandler2(void* parg)
// Receive messages // Receive messages
TRY_CRITICAL_BLOCK(pnode->cs_vRecv) TRY_CRITICAL_BLOCK(pnode->cs_vRecv)
ProcessMessages(pnode); ProcessMessages(pnode);
if (fShutdown)
return;
// Send messages // Send messages
TRY_CRITICAL_BLOCK(pnode->cs_vSend) TRY_CRITICAL_BLOCK(pnode->cs_vSend)
SendMessages(pnode); SendMessages(pnode);
if (fShutdown)
return;
pnode->Release(); pnode->Release();
} }
@ -963,7 +976,8 @@ void ThreadMessageHandler2(void* parg)
vnThreadsRunning[2]--; vnThreadsRunning[2]--;
Sleep(100); Sleep(100);
vnThreadsRunning[2]++; vnThreadsRunning[2]++;
CheckForShutdown(2); if (fShutdown)
return;
} }
} }
@ -996,7 +1010,7 @@ bool StartNode(string& strError)
// Get local host ip // Get local host ip
char pszHostName[255]; char pszHostName[255];
if (gethostname(pszHostName, 255) == SOCKET_ERROR) if (gethostname(pszHostName, sizeof(pszHostName)) == SOCKET_ERROR)
{ {
strError = strprintf("Error: Unable to get IP address of this computer (gethostname returned error %d)", WSAGetLastError()); strError = strprintf("Error: Unable to get IP address of this computer (gethostname returned error %d)", WSAGetLastError());
printf("%s\n", strError.c_str()); printf("%s\n", strError.c_str());
@ -1009,9 +1023,16 @@ bool StartNode(string& strError)
printf("%s\n", strError.c_str()); printf("%s\n", strError.c_str());
return false; return false;
} }
addrLocalHost = CAddress(*(long*)(phostent->h_addr_list[0]),
DEFAULT_PORT, // Take the first IP that isn't loopback 127.x.x.x
nLocalServices); for (int i = 0; phostent->h_addr_list[i] != NULL; i++)
printf("host ip %d: %s\n", i, CAddress(*(unsigned int*)phostent->h_addr_list[i]).ToStringIP().c_str());
for (int i = 0; phostent->h_addr_list[i] != NULL; i++)
{
addrLocalHost = CAddress(*(unsigned int*)phostent->h_addr_list[i], DEFAULT_PORT, nLocalServices);
if (addrLocalHost.IsValid() && addrLocalHost.GetByte(3) != 127)
break;
}
printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str()); printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
// Create socket for listening for incoming connections // Create socket for listening for incoming connections
@ -1022,6 +1043,10 @@ bool StartNode(string& strError)
printf("%s\n", strError.c_str()); printf("%s\n", strError.c_str());
return false; return false;
} }
#if defined(__BSD__) || defined(__WXOSX__)
int set = 1;
setsockopt(hSocket, SOL_SOCKET, SO_NOSIGPIPE, (void*)&set, sizeof(int));
#endif
// Set to nonblocking, incoming connections will also inherit this // Set to nonblocking, incoming connections will also inherit this
#ifdef __WXMSW__ #ifdef __WXMSW__
@ -1038,19 +1063,22 @@ bool StartNode(string& strError)
// The sockaddr_in structure specifies the address family, // The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound // IP address, and port for the socket that is being bound
int nRetryLimit = 15; struct sockaddr_in sockaddr;
struct sockaddr_in sockaddr = addrLocalHost.GetSockAddr(); memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = INADDR_ANY; // bind to all IPs on this computer
sockaddr.sin_port = DEFAULT_PORT;
if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) if (::bind(hListenSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
{ {
int nErr = WSAGetLastError(); int nErr = WSAGetLastError();
if (nErr == WSAEADDRINUSE) if (nErr == WSAEADDRINUSE)
strError = strprintf("Error: Unable to bind to port %s on this computer. The program is probably already running.", addrLocalHost.ToString().c_str()); strError = strprintf("Error: Unable to bind to port %d on this computer. The program is probably already running.", ntohs(sockaddr.sin_port));
else else
strError = strprintf("Error: Unable to bind to port %s on this computer (bind returned error %d)", addrLocalHost.ToString().c_str(), nErr); strError = strprintf("Error: Unable to bind to port %d on this computer (bind returned error %d)", ntohs(sockaddr.sin_port), nErr);
printf("%s\n", strError.c_str()); printf("%s\n", strError.c_str());
return false; return false;
} }
printf("bound to addrLocalHost = %s\n", addrLocalHost.ToString().c_str()); printf("bound to port %d\n", ntohs(sockaddr.sin_port));
// Listen for incoming connections // Listen for incoming connections
if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR) if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
@ -1065,6 +1093,7 @@ bool StartNode(string& strError)
{ {
// Proxies can't take incoming connections // Proxies can't take incoming connections
addrLocalHost.ip = CAddress("0.0.0.0").ip; addrLocalHost.ip = CAddress("0.0.0.0").ip;
printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
} }
else else
{ {
@ -1115,17 +1144,17 @@ bool StopNode()
fShutdown = true; fShutdown = true;
nTransactionsUpdated++; nTransactionsUpdated++;
int64 nStart = GetTime(); int64 nStart = GetTime();
while (vnThreadsRunning[0] || vnThreadsRunning[2] || vnThreadsRunning[3]) while (vnThreadsRunning[0] > 0 || vnThreadsRunning[2] > 0 || vnThreadsRunning[3] > 0)
{ {
if (GetTime() - nStart > 15) if (GetTime() - nStart > 15)
break; break;
Sleep(20); Sleep(20);
} }
if (vnThreadsRunning[0]) printf("ThreadSocketHandler still running\n"); if (vnThreadsRunning[0] > 0) printf("ThreadSocketHandler still running\n");
if (vnThreadsRunning[1]) printf("ThreadOpenConnections still running\n"); if (vnThreadsRunning[1] > 0) printf("ThreadOpenConnections still running\n");
if (vnThreadsRunning[2]) printf("ThreadMessageHandler still running\n"); if (vnThreadsRunning[2] > 0) printf("ThreadMessageHandler still running\n");
if (vnThreadsRunning[3]) printf("ThreadBitcoinMiner still running\n"); if (vnThreadsRunning[3] > 0) printf("ThreadBitcoinMiner still running\n");
while (vnThreadsRunning[2]) while (vnThreadsRunning[2] > 0)
Sleep(20); Sleep(20);
Sleep(50); Sleep(50);
@ -1135,21 +1164,3 @@ bool StopNode()
#endif #endif
return true; return true;
} }
void CheckForShutdown(int n)
{
if (fShutdown)
{
if (n != -1)
if (--vnThreadsRunning[n] < 0)
vnThreadsRunning[n] = 0;
if (n == 0)
{
foreach(CNode* pnode, vNodes)
closesocket(pnode->hSocket);
closesocket(hListenSocket);
}
printf("Thread %d exiting\n", n);
_endthread();
}
}

2
net.h

@ -30,7 +30,6 @@ void AbandonRequests(void (*fn)(void*, CDataStream&), void* param1);
bool AnySubscribed(unsigned int nChannel); bool AnySubscribed(unsigned int nChannel);
bool StartNode(string& strError=REF(string())); bool StartNode(string& strError=REF(string()));
bool StopNode(); bool StopNode();
void CheckForShutdown(int n);
@ -268,6 +267,7 @@ public:
struct sockaddr_in GetSockAddr() const struct sockaddr_in GetSockAddr() const
{ {
struct sockaddr_in sockaddr; struct sockaddr_in sockaddr;
memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sin_family = AF_INET; sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = ip; sockaddr.sin_addr.s_addr = ip;
sockaddr.sin_port = port; sockaddr.sin_port = port;

63
ui.cpp

@ -65,11 +65,13 @@ bool Is24HourTime()
string DateStr(int64 nTime) string DateStr(int64 nTime)
{ {
// Can only be used safely here in the UI
return (string)wxDateTime((time_t)nTime).FormatDate(); return (string)wxDateTime((time_t)nTime).FormatDate();
} }
string DateTimeStr(int64 nTime) string DateTimeStr(int64 nTime)
{ {
// Can only be used safely here in the UI
wxDateTime datetime((time_t)nTime); wxDateTime datetime((time_t)nTime);
if (Is24HourTime()) if (Is24HourTime())
return (string)datetime.Format("%x %H:%M"); return (string)datetime.Format("%x %H:%M");
@ -283,6 +285,7 @@ CMainFrame::CMainFrame(wxWindow* parent) : CMainFrameBase(parent)
fRefreshListCtrl = false; fRefreshListCtrl = false;
fRefreshListCtrlRunning = false; fRefreshListCtrlRunning = false;
fOnSetFocusAddress = false; fOnSetFocusAddress = false;
fRefresh = false;
m_choiceFilter->SetSelection(0); m_choiceFilter->SetSelection(0);
m_staticTextBalance->SetLabel(FormatMoney(GetBalance()) + " "); m_staticTextBalance->SetLabel(FormatMoney(GetBalance()) + " ");
m_listCtrl->SetFocus(); m_listCtrl->SetFocus();
@ -350,7 +353,7 @@ void Shutdown(void* parg)
StopNode(); StopNode();
DBFlush(true); DBFlush(true);
printf("Bitcoin exiting\n"); printf("Bitcoin exiting\n\n");
exit(0); exit(0);
} }
} }
@ -391,6 +394,30 @@ void CMainFrame::OnListColBeginDrag(wxListEvent& event)
event.Veto(); event.Veto();
} }
int CMainFrame::GetSortIndex(const string& strSort)
{
#ifdef __WXMSW__
return 0;
#else
// The wx generic listctrl implementation used on GTK doesn't sort,
// so we have to do it ourselves. Remember, we sort in reverse order.
// In the wx generic implementation, they store the list of items
// in a vector, so indexed lookups are fast, but inserts are slower
// the closer they are to the top.
int low = 0;
int high = m_listCtrl->GetItemCount();
while (low < high)
{
int mid = low + ((high - low) / 2);
if (strSort.compare(m_listCtrl->GetItemText(mid).c_str()) >= 0)
high = mid;
else
low = mid + 1;
}
return low;
#endif
}
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) 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; string str0 = strSort;
@ -407,7 +434,7 @@ void CMainFrame::InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSo
// fNew is for blind insert, only use if you're sure it's new // fNew is for blind insert, only use if you're sure it's new
if (fNew || nIndex == -1) if (fNew || nIndex == -1)
{ {
nIndex = m_listCtrl->InsertItem(0, str0); nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), str0);
} }
else else
{ {
@ -415,7 +442,7 @@ void CMainFrame::InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSo
if (GetItemText(m_listCtrl, nIndex, 0) != str0) if (GetItemText(m_listCtrl, nIndex, 0) != str0)
{ {
m_listCtrl->DeleteItem(nIndex); m_listCtrl->DeleteItem(nIndex);
nIndex = m_listCtrl->InsertItem(0, str0); nIndex = m_listCtrl->InsertItem(GetSortIndex(strSort), str0);
} }
} }
@ -826,6 +853,11 @@ void CMainFrame::RefreshStatusColumn()
void CMainFrame::OnPaint(wxPaintEvent& event) void CMainFrame::OnPaint(wxPaintEvent& event)
{ {
if (fRefresh)
{
fRefresh = false;
Refresh();
}
event.Skip(); event.Skip();
} }
@ -846,7 +878,7 @@ void ThreadDelayedRepaint(void* parg)
{ {
printf("DelayedRepaint\n"); printf("DelayedRepaint\n");
wxPaintEvent event; wxPaintEvent event;
pframeMain->Refresh(); pframeMain->fRefresh = true;
pframeMain->AddPendingEvent(event); pframeMain->AddPendingEvent(event);
} }
} }
@ -871,7 +903,7 @@ void MainFrameRepaint()
printf("MainFrameRepaint\n"); printf("MainFrameRepaint\n");
wxPaintEvent event; wxPaintEvent event;
pframeMain->Refresh(); pframeMain->fRefresh = true;
pframeMain->AddPendingEvent(event); pframeMain->AddPendingEvent(event);
} }
} }
@ -907,7 +939,7 @@ void CMainFrame::OnPaintListCtrl(wxPaintEvent& event)
} }
vWalletUpdated.clear(); vWalletUpdated.clear();
if (m_listCtrl->GetItemCount() && strTop != (string)m_listCtrl->GetItemText(0)) if (m_listCtrl->GetItemCount() && strTop != (string)m_listCtrl->GetItemText(0))
m_listCtrl->ScrollList(0, INT_MAX); m_listCtrl->ScrollList(0, INT_MIN/2);
} }
} }
@ -943,9 +975,10 @@ void CMainFrame::OnPaintListCtrl(wxPaintEvent& event)
string strStatus = strprintf(" %d connections %d blocks %d transactions", vNodes.size(), nBestHeight + 1, nTransactionCount); string strStatus = strprintf(" %d connections %d blocks %d transactions", vNodes.size(), nBestHeight + 1, nTransactionCount);
m_statusBar->SetStatusText(strStatus, 2); m_statusBar->SetStatusText(strStatus, 2);
#ifdef __WXMSW__ // Pass through to listctrl to actually do the paint, we're just hooking the message
m_listCtrl->OnPaint(event); m_listCtrl->Disconnect(wxEVT_PAINT, (wxObjectEventFunction)NULL, NULL, this);
#endif m_listCtrl->GetEventHandler()->ProcessEvent(event);
m_listCtrl->Connect(wxEVT_PAINT, wxPaintEventHandler(CMainFrame::OnPaintListCtrl), NULL, this);
} }
@ -3331,7 +3364,11 @@ bool CMyApp::OnInit2()
g_isPainting = 10000; g_isPainting = 10000;
#endif #endif
wxImage::AddHandler(new wxPNGHandler); wxImage::AddHandler(new wxPNGHandler);
#ifdef __WXMSW__
SetAppName("Bitcoin"); SetAppName("Bitcoin");
#else
SetAppName("bitcoin");
#endif
ParseParameters(argc, argv); ParseParameters(argc, argv);
if (mapArgs.count("-?") || mapArgs.count("--help")) if (mapArgs.count("-?") || mapArgs.count("--help"))
@ -3355,7 +3392,10 @@ bool CMyApp::OnInit2()
// Limit to single instance per user // Limit to single instance per user
// Required to protect the database files if we're going to keep deleting log.* // Required to protect the database files if we're going to keep deleting log.*
// //
wxString strMutexName = wxString("Bitcoin.") + getenv("HOMEPATH"); #ifdef __WXMSW__
// todo: wxSingleInstanceChecker wasn't working on Linux, never deleted its lock file
// maybe should go by whether successfully bind port 8333 instead
wxString strMutexName = wxString("bitcoin_running.") + getenv("HOMEPATH");
for (int i = 0; i < strMutexName.size(); i++) for (int i = 0; i < strMutexName.size(); i++)
if (!isalnum(strMutexName[i])) if (!isalnum(strMutexName[i]))
strMutexName[i] = '.'; strMutexName[i] = '.';
@ -3367,7 +3407,6 @@ bool CMyApp::OnInit2()
loop loop
{ {
// TODO: find out how to do this in Linux, or replace with wxWidgets commands // TODO: find out how to do this in Linux, or replace with wxWidgets commands
#ifdef __WXMSW__
// Show the previous instance and exit // Show the previous instance and exit
HWND hwndPrev = FindWindow("wxWindowClassNR", "Bitcoin"); HWND hwndPrev = FindWindow("wxWindowClassNR", "Bitcoin");
if (hwndPrev) if (hwndPrev)
@ -3377,7 +3416,6 @@ bool CMyApp::OnInit2()
SetForegroundWindow(hwndPrev); SetForegroundWindow(hwndPrev);
return false; return false;
} }
#endif
if (GetTime() > nStart + 60) if (GetTime() > nStart + 60)
return false; return false;
@ -3390,6 +3428,7 @@ bool CMyApp::OnInit2()
break; break;
} }
} }
#endif
// //
// Parameters // Parameters

3
ui.h

@ -32,7 +32,6 @@ extern int fMinimizeOnClose;
extern void HandleCtrlA(wxKeyEvent& event); extern void HandleCtrlA(wxKeyEvent& event);
extern string DateTimeStr(int64 nTime);
extern string FormatTxStatus(const CWalletTx& wtx); extern string FormatTxStatus(const CWalletTx& wtx);
extern void CrossThreadCall(int nID, void* pdata); extern void CrossThreadCall(int nID, void* pdata);
extern void MainFrameRepaint(); extern void MainFrameRepaint();
@ -84,8 +83,10 @@ public:
bool fRefreshListCtrlRunning; bool fRefreshListCtrlRunning;
bool fOnSetFocusAddress; bool fOnSetFocusAddress;
unsigned int nListViewUpdated; unsigned int nListViewUpdated;
bool fRefresh;
void OnCrossThreadCall(wxCommandEvent& event); void OnCrossThreadCall(wxCommandEvent& event);
int GetSortIndex(const string& strSort);
void InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSort, const wxString& str1, const wxString& str2, const wxString& str3, const wxString& str4, const wxString& str5); void InsertLine(bool fNew, int nIndex, uint256 hashKey, string strSort, const wxString& str1, const wxString& str2, const wxString& str3, const wxString& str4, const wxString& str5);
bool DeleteLine(uint256 hashKey); bool DeleteLine(uint256 hashKey);
bool InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex=-1); bool InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex=-1);

60
uibase.cpp

@ -84,7 +84,7 @@ CMainFrameBase::CMainFrameBase( wxWindow* parent, wxWindowID id, const wxString&
m_staticText32->Wrap( -1 ); m_staticText32->Wrap( -1 );
bSizer85->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); bSizer85->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
m_textCtrlAddress = new wxTextCtrl( this, wxID_TEXTCTRLADDRESS, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_READONLY ); m_textCtrlAddress = new wxTextCtrl( this, wxID_TEXTCTRLADDRESS, wxEmptyString, wxDefaultPosition, wxSize( 340,-1 ), wxTE_READONLY );
m_textCtrlAddress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) ); m_textCtrlAddress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) );
bSizer85->Add( m_textCtrlAddress, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); bSizer85->Add( m_textCtrlAddress, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
@ -143,7 +143,7 @@ CMainFrameBase::CMainFrameBase( wxWindow* parent, wxWindowID id, const wxString&
wxBoxSizer* bSizer157; wxBoxSizer* bSizer157;
bSizer157 = new wxBoxSizer( wxVERTICAL ); bSizer157 = new wxBoxSizer( wxVERTICAL );
m_listCtrl = new wxListCtrl( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING|wxALWAYS_SHOW_SB ); m_listCtrl = new wxListCtrl( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING|wxVSCROLL );
bSizer157->Add( m_listCtrl, 1, wxEXPAND|wxALL, 5 ); bSizer157->Add( m_listCtrl, 1, wxEXPAND|wxALL, 5 );
m_panel7->SetSizer( bSizer157 ); m_panel7->SetSizer( bSizer157 );
@ -343,7 +343,7 @@ CTxDetailsDialogBase::CTxDetailsDialogBase( wxWindow* parent, wxWindowID id, con
wxBoxSizer* bSizer65; wxBoxSizer* bSizer65;
bSizer65 = new wxBoxSizer( wxVERTICAL ); bSizer65 = new wxBoxSizer( wxVERTICAL );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( 85,25 ), 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
bSizer65->Add( m_buttonOK, 0, wxALL, 5 ); bSizer65->Add( m_buttonOK, 0, wxALL, 5 );
bSizer64->Add( bSizer65, 0, wxALIGN_RIGHT, 5 ); bSizer64->Add( bSizer65, 0, wxALIGN_RIGHT, 5 );
@ -520,17 +520,13 @@ COptionsDialogBase::COptionsDialogBase( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer58; wxBoxSizer* bSizer58;
bSizer58 = new wxBoxSizer( wxHORIZONTAL ); bSizer58 = new wxBoxSizer( wxHORIZONTAL );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( 85,25 ), 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
bSizer58->Add( m_buttonOK, 0, wxALL, 5 ); bSizer58->Add( m_buttonOK, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer58->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer58->Add( m_buttonCancel, 0, wxALL, 5 );
m_buttonApply = new wxButton( this, wxID_APPLY, wxT("&Apply"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonApply = new wxButton( this, wxID_APPLY, wxT("&Apply"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonApply->SetMinSize( wxSize( 85,25 ) );
bSizer58->Add( m_buttonApply, 0, wxALL, 5 ); bSizer58->Add( m_buttonApply, 0, wxALL, 5 );
bSizer55->Add( bSizer58, 0, wxALIGN_RIGHT, 5 ); bSizer55->Add( bSizer58, 0, wxALIGN_RIGHT, 5 );
@ -622,7 +618,7 @@ CAboutDialogBase::CAboutDialogBase( wxWindow* parent, wxWindowID id, const wxStr
bSizer61->Add( 0, 0, 1, wxEXPAND, 5 ); bSizer61->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( 85,25 ), 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
bSizer61->Add( m_buttonOK, 0, wxALL, 5 ); bSizer61->Add( m_buttonOK, 0, wxALL, 5 );
bSizer60->Add( bSizer61, 0, wxALIGN_RIGHT|wxEXPAND, 5 ); bSizer60->Add( bSizer61, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
@ -767,13 +763,10 @@ CSendDialogBase::CSendDialogBase( wxWindow* parent, wxWindowID id, const wxStrin
m_buttonSend = new wxButton( this, wxID_BUTTONSEND, wxT("&Send"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonSend = new wxButton( this, wxID_BUTTONSEND, wxT("&Send"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonSend->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); m_buttonSend->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
m_buttonSend->SetMinSize( wxSize( 85,25 ) );
bSizer23->Add( m_buttonSend, 0, wxALL, 5 ); bSizer23->Add( m_buttonSend, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer23->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer23->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer21->Add( bSizer23, 0, wxEXPAND, 5 ); bSizer21->Add( bSizer23, 0, wxEXPAND, 5 );
@ -833,13 +826,10 @@ CSendingDialogBase::CSendingDialogBase( wxWindow* parent, wxWindowID id, const w
m_buttonOK = new wxButton( this, wxID_ANY, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonOK = new wxButton( this, wxID_ANY, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonOK->Enable( false ); m_buttonOK->Enable( false );
m_buttonOK->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonOK, 0, wxALL, 5 ); bSizer69->Add( m_buttonOK, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer69->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer68->Add( bSizer69, 0, wxEXPAND, 5 ); bSizer68->Add( bSizer69, 0, wxEXPAND, 5 );
@ -887,28 +877,19 @@ CYourAddressDialogBase::CYourAddressDialogBase( wxWindow* parent, wxWindowID id,
bSizer69->Add( 0, 0, 1, wxEXPAND, 5 ); bSizer69->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonRename = new wxButton( this, wxID_BUTTONRENAME, wxT("&Edit..."), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonRename = new wxButton( this, wxID_BUTTONRENAME, wxT("&Edit..."), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonRename->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonRename, 0, wxALL, 5 ); bSizer69->Add( m_buttonRename, 0, wxALL, 5 );
m_buttonNew = new wxButton( this, wxID_BUTTONNEW, wxT("&New Address..."), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonNew = new wxButton( this, wxID_BUTTONNEW, wxT("&New Address..."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonNew->SetMinSize( wxSize( 110,25 ) );
bSizer69->Add( m_buttonNew, 0, wxALL, 5 ); bSizer69->Add( m_buttonNew, 0, wxALL, 5 );
m_buttonCopy = new wxButton( this, wxID_BUTTONCOPY, wxT("&Copy to Clipboard"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonCopy = new wxButton( this, wxID_BUTTONCOPY, wxT("&Copy to Clipboard"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonCopy->SetMinSize( wxSize( 120,25 ) );
bSizer69->Add( m_buttonCopy, 0, wxALL, 5 ); bSizer69->Add( m_buttonCopy, 0, wxALL, 5 );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonOK->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonOK, 0, wxALL, 5 ); bSizer69->Add( m_buttonOK, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonCancel->Hide(); m_buttonCancel->Hide();
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer69->Add( m_buttonCancel, 0, wxALL, 5 );
@ -969,28 +950,18 @@ CAddressBookDialogBase::CAddressBookDialogBase( wxWindow* parent, wxWindowID id,
bSizer69->Add( 0, 0, 1, wxEXPAND, 5 ); bSizer69->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonEdit = new wxButton( this, wxID_BUTTONEDIT, wxT("&Edit..."), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonEdit = new wxButton( this, wxID_BUTTONEDIT, wxT("&Edit..."), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonEdit->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonEdit, 0, wxALL, 5 ); bSizer69->Add( m_buttonEdit, 0, wxALL, 5 );
m_buttonNew = new wxButton( this, wxID_BUTTONNEW, wxT("&New Address..."), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonNew = new wxButton( this, wxID_BUTTONNEW, wxT("&New Address..."), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonNew->SetMinSize( wxSize( 110,25 ) );
bSizer69->Add( m_buttonNew, 0, wxALL, 5 ); bSizer69->Add( m_buttonNew, 0, wxALL, 5 );
m_buttonDelete = new wxButton( this, wxID_BUTTONDELETE, wxT("&Delete"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonDelete = new wxButton( this, wxID_BUTTONDELETE, wxT("&Delete"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonDelete->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonDelete, 0, wxALL, 5 ); bSizer69->Add( m_buttonDelete, 0, wxALL, 5 );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonOK->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonOK, 0, wxALL, 5 ); bSizer69->Add( m_buttonOK, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer69->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer69->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer68->Add( bSizer69, 0, wxEXPAND, 5 ); bSizer68->Add( bSizer69, 0, wxEXPAND, 5 );
@ -1389,18 +1360,12 @@ CEditProductDialogBase::CEditProductDialogBase( wxWindow* parent, wxWindowID id,
bSizer26 = new wxBoxSizer( wxHORIZONTAL ); bSizer26 = new wxBoxSizer( wxHORIZONTAL );
m_buttonOK = new wxButton( this, wxID_BUTTONSEND, wxT("&Send"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonOK = new wxButton( this, wxID_BUTTONSEND, wxT("&Send"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonOK->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonOK, 0, wxALL, 5 ); bSizer26->Add( m_buttonOK, 0, wxALL, 5 );
m_buttonPreview = new wxButton( this, wxID_BUTTONPREVIEW, wxT("&Preview"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonPreview = new wxButton( this, wxID_BUTTONPREVIEW, wxT("&Preview"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonPreview->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonPreview, 0, wxALL, 5 ); bSizer26->Add( m_buttonPreview, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer26->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer20->Add( bSizer26, 0, wxALIGN_RIGHT, 5 ); bSizer20->Add( bSizer26, 0, wxALIGN_RIGHT, 5 );
@ -1605,18 +1570,13 @@ CViewProductDialogBase::CViewProductDialogBase( wxWindow* parent, wxWindowID id,
m_buttonBack = new wxButton( this, wxID_BUTTONBACK, wxT("< &Back "), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonBack = new wxButton( this, wxID_BUTTONBACK, wxT("< &Back "), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonBack->Enable( false ); m_buttonBack->Enable( false );
m_buttonBack->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonBack, 0, wxALL, 5 ); bSizer26->Add( m_buttonBack, 0, wxALL, 5 );
m_buttonNext = new wxButton( this, wxID_BUTTONNEXT, wxT(" &Next >"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonNext = new wxButton( this, wxID_BUTTONNEXT, wxT(" &Next >"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonNext->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonNext, 0, wxALL, 5 ); bSizer26->Add( m_buttonNext, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer26->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer20->Add( bSizer26, 0, wxALIGN_RIGHT, 5 ); bSizer20->Add( bSizer26, 0, wxALIGN_RIGHT, 5 );
@ -1662,8 +1622,6 @@ CViewOrderDialogBase::CViewOrderDialogBase( wxWindow* parent, wxWindowID id, con
bSizer26 = new wxBoxSizer( wxHORIZONTAL ); bSizer26 = new wxBoxSizer( wxHORIZONTAL );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonOK->SetMinSize( wxSize( 85,25 ) );
bSizer26->Add( m_buttonOK, 0, wxALL, 5 ); bSizer26->Add( m_buttonOK, 0, wxALL, 5 );
bSizer20->Add( bSizer26, 0, wxALIGN_RIGHT, 5 ); bSizer20->Add( bSizer26, 0, wxALIGN_RIGHT, 5 );
@ -1720,13 +1678,9 @@ CEditReviewDialogBase::CEditReviewDialogBase( wxWindow* parent, wxWindowID id, c
bSizer113 = new wxBoxSizer( wxHORIZONTAL ); bSizer113 = new wxBoxSizer( wxHORIZONTAL );
m_buttonSubmit = new wxButton( this, wxID_SUBMIT, wxT("&Submit"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonSubmit = new wxButton( this, wxID_SUBMIT, wxT("&Submit"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonSubmit->SetMinSize( wxSize( 85,25 ) );
bSizer113->Add( m_buttonSubmit, 0, wxALL, 5 ); bSizer113->Add( m_buttonSubmit, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer113->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer113->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer112->Add( bSizer113, 0, wxALIGN_RIGHT, 5 ); bSizer112->Add( bSizer113, 0, wxALIGN_RIGHT, 5 );
@ -1951,13 +1905,9 @@ CGetTextFromUserDialogBase::CGetTextFromUserDialogBase( wxWindow* parent, wxWind
bSizer80->Add( 0, 0, 1, wxEXPAND, 5 ); bSizer80->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonOK = new wxButton( this, wxID_OK, wxT("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_buttonOK->SetMinSize( wxSize( 85,25 ) );
bSizer80->Add( m_buttonOK, 0, wxALL, 5 ); bSizer80->Add( m_buttonOK, 0, wxALL, 5 );
m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonCancel->SetMinSize( wxSize( 85,25 ) );
bSizer80->Add( m_buttonCancel, 0, wxALL, 5 ); bSizer80->Add( m_buttonCancel, 0, wxALL, 5 );
bSizer79->Add( bSizer80, 0, wxEXPAND, 5 ); bSizer79->Add( bSizer80, 0, wxEXPAND, 5 );

68
uiproject.fbp

@ -70,7 +70,7 @@
<event name="OnSetFocus"></event> <event name="OnSetFocus"></event>
<event name="OnSize"></event> <event name="OnSize"></event>
<event name="OnUpdateUI"></event> <event name="OnUpdateUI"></event>
<object class="wxMenuBar" expanded="1"> <object class="wxMenuBar" expanded="0">
<property name="bg">240,240,240</property> <property name="bg">240,240,240</property>
<property name="context_help"></property> <property name="context_help"></property>
<property name="enabled">1</property> <property name="enabled">1</property>
@ -225,7 +225,7 @@
</object> </object>
</object> </object>
</object> </object>
<object class="wxToolBar" expanded="1"> <object class="wxToolBar" expanded="0">
<property name="bg"></property> <property name="bg"></property>
<property name="bitmapsize">20,20</property> <property name="bitmapsize">20,20</property>
<property name="context_help"></property> <property name="context_help"></property>
@ -439,7 +439,7 @@
<property name="name">m_textCtrlAddress</property> <property name="name">m_textCtrlAddress</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size">250,-1</property> <property name="size">340,-1</property>
<property name="style">wxTE_READONLY</property> <property name="style">wxTE_READONLY</property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="tooltip"></property> <property name="tooltip"></property>
@ -944,7 +944,7 @@
<property name="tooltip"></property> <property name="tooltip"></property>
<property name="window_extra_style"></property> <property name="window_extra_style"></property>
<property name="window_name"></property> <property name="window_name"></property>
<property name="window_style">wxALWAYS_SHOW_SB</property> <property name="window_style">wxVSCROLL</property>
<event name="OnChar"></event> <event name="OnChar"></event>
<event name="OnEnterWindow"></event> <event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event> <event name="OnEraseBackground"></event>
@ -1648,7 +1648,7 @@
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size">85,25</property> <property name="size">-1,-1</property>
<property name="style"></property> <property name="style"></property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="tooltip"></property> <property name="tooltip"></property>
@ -3031,7 +3031,7 @@
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size">85,25</property> <property name="size">-1,-1</property>
<property name="style"></property> <property name="style"></property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="tooltip"></property> <property name="tooltip"></property>
@ -3079,7 +3079,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -3131,7 +3131,7 @@
<property name="id">wxID_APPLY</property> <property name="id">wxID_APPLY</property>
<property name="label">&amp;Apply</property> <property name="label">&amp;Apply</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonApply</property> <property name="name">m_buttonApply</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -3493,7 +3493,7 @@
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size">85,25</property> <property name="size">-1,-1</property>
<property name="style"></property> <property name="style"></property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="tooltip"></property> <property name="tooltip"></property>
@ -4485,7 +4485,7 @@
<property name="id">wxID_BUTTONSEND</property> <property name="id">wxID_BUTTONSEND</property>
<property name="label">&amp;Send</property> <property name="label">&amp;Send</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonSend</property> <property name="name">m_buttonSend</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -4537,7 +4537,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -4775,7 +4775,7 @@
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="label">OK</property> <property name="label">OK</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -4827,7 +4827,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5089,7 +5089,7 @@
<property name="id">wxID_BUTTONRENAME</property> <property name="id">wxID_BUTTONRENAME</property>
<property name="label">&amp;Edit...</property> <property name="label">&amp;Edit...</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonRename</property> <property name="name">m_buttonRename</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5141,7 +5141,7 @@
<property name="id">wxID_BUTTONNEW</property> <property name="id">wxID_BUTTONNEW</property>
<property name="label">&amp;New Address...</property> <property name="label">&amp;New Address...</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">110,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonNew</property> <property name="name">m_buttonNew</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5193,7 +5193,7 @@
<property name="id">wxID_BUTTONCOPY</property> <property name="id">wxID_BUTTONCOPY</property>
<property name="label">&amp;Copy to Clipboard</property> <property name="label">&amp;Copy to Clipboard</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">120,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCopy</property> <property name="name">m_buttonCopy</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5245,7 +5245,7 @@
<property name="id">wxID_OK</property> <property name="id">wxID_OK</property>
<property name="label">OK</property> <property name="label">OK</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5297,7 +5297,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5559,7 +5559,7 @@
<property name="id">wxID_BUTTONEDIT</property> <property name="id">wxID_BUTTONEDIT</property>
<property name="label">&amp;Edit...</property> <property name="label">&amp;Edit...</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonEdit</property> <property name="name">m_buttonEdit</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5611,7 +5611,7 @@
<property name="id">wxID_BUTTONNEW</property> <property name="id">wxID_BUTTONNEW</property>
<property name="label">&amp;New Address...</property> <property name="label">&amp;New Address...</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">110,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonNew</property> <property name="name">m_buttonNew</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5663,7 +5663,7 @@
<property name="id">wxID_BUTTONDELETE</property> <property name="id">wxID_BUTTONDELETE</property>
<property name="label">&amp;Delete</property> <property name="label">&amp;Delete</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonDelete</property> <property name="name">m_buttonDelete</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5715,7 +5715,7 @@
<property name="id">wxID_OK</property> <property name="id">wxID_OK</property>
<property name="label">OK</property> <property name="label">OK</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -5767,7 +5767,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">public</property> <property name="permission">public</property>
<property name="pos"></property> <property name="pos"></property>
@ -10225,7 +10225,7 @@
<property name="id">wxID_BUTTONSEND</property> <property name="id">wxID_BUTTONSEND</property>
<property name="label">&amp;Send</property> <property name="label">&amp;Send</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -10277,7 +10277,7 @@
<property name="id">wxID_BUTTONPREVIEW</property> <property name="id">wxID_BUTTONPREVIEW</property>
<property name="label">&amp;Preview</property> <property name="label">&amp;Preview</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonPreview</property> <property name="name">m_buttonPreview</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -10329,7 +10329,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -10798,7 +10798,7 @@
<property name="id">wxID_BUTTONBACK</property> <property name="id">wxID_BUTTONBACK</property>
<property name="label">&lt; &amp;Back </property> <property name="label">&lt; &amp;Back </property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonBack</property> <property name="name">m_buttonBack</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -10850,7 +10850,7 @@
<property name="id">wxID_BUTTONNEXT</property> <property name="id">wxID_BUTTONNEXT</property>
<property name="label"> &amp;Next &gt;</property> <property name="label"> &amp;Next &gt;</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonNext</property> <property name="name">m_buttonNext</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -10902,7 +10902,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -11087,7 +11087,7 @@
<property name="id">wxID_OK</property> <property name="id">wxID_OK</property>
<property name="label">OK</property> <property name="label">OK</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -11488,7 +11488,7 @@
<property name="id">wxID_SUBMIT</property> <property name="id">wxID_SUBMIT</property>
<property name="label">&amp;Submit</property> <property name="label">&amp;Submit</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonSubmit</property> <property name="name">m_buttonSubmit</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -11540,7 +11540,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -12907,7 +12907,7 @@
<property name="id">wxID_OK</property> <property name="id">wxID_OK</property>
<property name="label">OK</property> <property name="label">OK</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonOK</property> <property name="name">m_buttonOK</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
@ -12959,7 +12959,7 @@
<property name="id">wxID_CANCEL</property> <property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property> <property name="label">Cancel</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size">85,25</property> <property name="minimum_size">-1,-1</property>
<property name="name">m_buttonCancel</property> <property name="name">m_buttonCancel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>

12
util.cpp

@ -96,12 +96,7 @@ void RandAddSeedPerfmon()
hash = 0; hash = 0;
memset(pdata, 0, nSize); memset(pdata, 0, nSize);
time_t nTime; printf("%s RandAddSeed() %d bytes\n", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str(), nSize);
time(&nTime);
struct tm* ptmTime = gmtime(&nTime);
char pszTime[200];
strftime(pszTime, sizeof(pszTime), "%x %H:%M:%S", ptmTime);
printf("%s RandAddSeed() %d bytes\n", pszTime, nSize);
} }
#endif #endif
} }
@ -350,7 +345,9 @@ void FormatException(char* pszMessage, std::exception* pex, const char* pszThrea
pszModule[0] = '\0'; pszModule[0] = '\0';
GetModuleFileName(NULL, pszModule, sizeof(pszModule)); GetModuleFileName(NULL, pszModule, sizeof(pszModule));
#else #else
const char* pszModule = wxStandardPaths::Get().GetExecutablePath().mb_str(); // might not be thread safe, uses wxString
//const char* pszModule = wxStandardPaths::Get().GetExecutablePath().mb_str();
const char* pszModule = "bitcoin";
#endif #endif
if (pex) if (pex)
snprintf(pszMessage, 1000, snprintf(pszMessage, 1000,
@ -425,7 +422,6 @@ void GetDataDir(char* pszDir)
} }
strlcpy(pszDir, pszCachedDir, MAX_PATH); strlcpy(pszDir, pszCachedDir, MAX_PATH);
} }
} }
string GetDataDir() string GetDataDir()

14
util.h

@ -84,6 +84,10 @@ inline void SetThreadPriority(int nThread, int nPriority) { setpriority(PRIO_PRO
#define THREAD_PRIORITY_NORMAL 0 #define THREAD_PRIORITY_NORMAL 0
#define THREAD_PRIORITY_ABOVE_NORMAL 0 #define THREAD_PRIORITY_ABOVE_NORMAL 0
#endif #endif
#ifndef MSG_NOSIGNAL
#define MSG_NOSIGNAL 0
#endif
@ -379,6 +383,14 @@ inline int64 GetTimeMillis()
return wxGetLocalTimeMillis().GetValue(); return wxGetLocalTimeMillis().GetValue();
} }
inline string DateTimeStrFormat(const char* pszFormat, int64 nTime)
{
time_t n = nTime;
struct tm* ptmTime = gmtime(&n);
char pszTime[200];
strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime);
return pszTime;
}
@ -400,7 +412,7 @@ inline void heapchk()
{ \ { \
static char nLoops; \ static char nLoops; \
if (nLoops <= 0) \ if (nLoops <= 0) \
nLoops = GetRand(50) + 1; \ nLoops = GetRand(20) + 1; \
if (nLoops-- > 1) \ if (nLoops-- > 1) \
{ \ { \
ThreadFn; \ ThreadFn; \

Loading…
Cancel
Save