diff --git a/checkin_notes b/checkin_notes index 7e6c37ad2c..d717327eec 100755 --- a/checkin_notes +++ b/checkin_notes @@ -26298,3 +26298,20 @@ Rom 29 Mar 2005 MainFrame.cpp clientgui/msw/ taskbarex.h + +David 29 Mar 2005 + - moved NetOpen(), NetClose(), NetCheck() from win_net.cpp (removed) + to lib/network.C + + client/ + client_state.C + hostinfo_network.h + time_stats.C + win/ + win_net.cpp,h (removed) + wingui_mainwindow.cpp + lib/ + network.C,h + win_build/ + boinc_cli.vcproj + boinc_gui.vcproj diff --git a/client/client_state.C b/client/client_state.C index 203fdcf042..3197792cbd 100644 --- a/client/client_state.C +++ b/client/client_state.C @@ -52,6 +52,7 @@ #include "file_names.h" #include "hostinfo.h" #include "hostinfo_network.h" +#include "network.h" #include "http.h" #include "log_flags.h" #include "client_msgs.h" diff --git a/client/hostinfo_network.h b/client/hostinfo_network.h index eac4c8138a..4144ed725a 100644 --- a/client/hostinfo_network.h +++ b/client/hostinfo_network.h @@ -17,9 +17,5 @@ // or write to the Free Software Foundation, Inc., // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#define CONNECTED_STATE_NOT_CONNECTED 0 -#define CONNECTED_STATE_CONNECTED 1 -#define CONNECTED_STATE_UNKNOWN 2 -extern int get_connected_state(); extern int get_local_network_info(char* dom, int ,char* ip, int iplen); diff --git a/client/time_stats.C b/client/time_stats.C index 5288204324..c1f09871fd 100644 --- a/client/time_stats.C +++ b/client/time_stats.C @@ -31,7 +31,7 @@ #include "util.h" #include "error_numbers.h" #include "client_msgs.h" -#include "hostinfo_network.h" +#include "network.h" #include "time_stats.h" diff --git a/client/win/win_net.cpp b/client/win/win_net.cpp deleted file mode 100644 index 79f9ef6e78..0000000000 --- a/client/win/win_net.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// Berkeley Open Infrastructure for Network Computing -// http://boinc.berkeley.edu -// Copyright (C) 2005 University of California -// -// This is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; -// either version 2.1 of the License, or (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU Lesser General Public License for more details. -// -// To view the GNU Lesser General Public License visit -// http://www.gnu.org/copyleft/lesser.html -// or write to the Free Software Foundation, Inc., -// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -#include "boinc_win.h" - -#include "win_net.h" -#include "client_state.h" -#include "hostinfo_network.h" - -#define DIAL_WAIT 60 // seconds after dial to wait (in case of cancel) -#define CONFIRM_WAIT 60 // seconds after user says not to connect to ask again -#define CLOSE_WAIT 5 // seconds after last call to close that the connection should be terminated - -int net_ref_count = -1; // -1 closed, 0 open but not used, >0 number of users -double net_last_req_time = 0; // last time user was requested to connect in seconds -double net_last_dial_time = 0; // last time modem was dialed -double net_close_time = 0; // 0 don't close, >0 time when network connection should be terminated in seconds -bool dialed = false; - -int WinsockInitialize() -{ - WSADATA wsdata; - return WSAStartup( MAKEWORD( 1, 1 ), &wsdata); -} - -int WinsockCleanup() -{ - return WSACleanup(); -} - -typedef BOOL (WINAPI *GetStateProc)( OUT LPDWORD lpdwFlags, IN DWORD dwReserved); - -int get_connected_state( ) { - int online = 0; - static bool first=true; - static HMODULE libmodule; - static GetStateProc GetState; - DWORD connectionFlags; - - if (first) { - libmodule = LoadLibrary("wininet.dll"); - if (libmodule) { - GetState = (GetStateProc) GetProcAddress(libmodule, "InternetGetConnectedState"); - } - first = false; - } - if (libmodule && GetState) { - online = (*GetState)(&connectionFlags, 0); - if (online) { - return CONNECTED_STATE_CONNECTED; - } else { - return CONNECTED_STATE_NOT_CONNECTED; - } - } - return CONNECTED_STATE_UNKNOWN; -} - -int NetOpen( void ) -{ - int rc; - - typedef BOOL (WINAPI *GetStateProc)( OUT LPDWORD lpdwFlags, IN DWORD dwReserved); - typedef BOOL (WINAPI *AutoDialProc)( IN DWORD dwFlags, IN DWORD dwReserved); - - if(net_ref_count >= 0) { - net_ref_count ++; - return 0; - } - - GetStateProc GetState = NULL; - AutoDialProc AutoDial = NULL; - DWORD connectionFlags; - HMODULE libmodule = NULL; - - libmodule = LoadLibrary("wininet.dll"); - if (libmodule) { - GetState = (GetStateProc)GetProcAddress(libmodule, "InternetGetConnectedState"); - AutoDial = (AutoDialProc)GetProcAddress(libmodule, "InternetAutodial"); - - if (GetState && AutoDial) { - rc = (*GetState)(&connectionFlags, 0); - - // Don't Autodial if already connected to Internet by Modem or LAN - if (!rc) { - if((double)time(NULL) < net_last_dial_time + CONFIRM_WAIT) { - return -1; - } -#if !defined(_WIN32) && !defined(_CONSOLE) - if(gstate.global_prefs.confirm_before_connecting) { - net_last_req_time = (double)time(NULL); - if(!RequestNetConnect()) { - return -1; - } - } -#endif - net_last_dial_time = (double)time(NULL); - rc = (*AutoDial)(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0); - if (rc) { - dialed = true; - } else { - // InternetAutodial() returns error 86 for some users - // and 668 for some other users, but a subsequent call - // to gethostbyname() or connect() autodials successfully. - // So (with one exception) we ignore failure returns - // from InternetAutodial() to work around this problem. - // Error 86 is "The specified Network Password is not correct." - // Error 668 is RAS Error "The connection dropped." - rc = GetLastError(); - // Don't continue if busy signal, no answer or user cancelled - if (rc == ERROR_USER_DISCONNECTION) { - return -1; - } - } - } - } - } - - net_ref_count = 1; - return 0; -} - -void NetClose( void ) -{ - if(net_ref_count > 0) net_ref_count --; - if(net_ref_count == 0) { - net_close_time = (double)time(NULL) + CLOSE_WAIT; - } -} - -void NetCheck( void ) { - if(net_ref_count == 0 && net_close_time > 0 && net_close_time < (double)time(NULL)) { - - typedef BOOL (WINAPI *HangupProc)(IN DWORD dwReserved); - HangupProc HangUp = NULL; - HMODULE libmodule = NULL; - - // Hang up the modem if we dialed it - if (dialed && gstate.global_prefs.hangup_if_dialed) { - libmodule = LoadLibrary("wininet.dll"); - if (libmodule) { - HangUp = (HangupProc)GetProcAddress(libmodule, "InternetAutodialHangup"); - if (HangUp) int rc = (* HangUp)(0); - } - } - dialed = false; - net_ref_count = -1; - net_close_time = 0; - - } -} - -const char *BOINC_RCSID_4971b5333e = "$Id$"; diff --git a/client/win/win_net.h b/client/win/win_net.h deleted file mode 100644 index cff7403e6e..0000000000 --- a/client/win/win_net.h +++ /dev/null @@ -1,29 +0,0 @@ -// Berkeley Open Infrastructure for Network Computing -// http://boinc.berkeley.edu -// Copyright (C) 2005 University of California -// -// This is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; -// either version 2.1 of the License, or (at your option) any later version. -// -// This software is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU Lesser General Public License for more details. -// -// To view the GNU Lesser General Public License visit -// http://www.gnu.org/copyleft/lesser.html -// or write to the Free Software Foundation, Inc., - -#ifndef __WIN_NET_H -#define __WIN_NET_H - -extern int WinsockInitialize(); -extern int WinsockCleanup(); - -extern int NetOpen( void ); -extern void NetClose( void ); -extern void NetCheck( void ); - -#endif diff --git a/client/win/wingui_mainwindow.cpp b/client/win/wingui_mainwindow.cpp index 0a7dbe34d2..630c61f52c 100755 --- a/client/win/wingui_mainwindow.cpp +++ b/client/win/wingui_mainwindow.cpp @@ -22,7 +22,7 @@ #include "client_msgs.h" #include "diagnostics.h" #include "hostinfo.h" -#include "win_net.h" +#include "network.h" #include "wingui_mainwindow.h" @@ -2175,7 +2175,9 @@ void CMainWindow::OnTimer(UINT uEventID) { // update state and gui while(gstate.do_something(dtime())); - NetCheck(); // check if network connection can be terminated + + // check if network connection can be terminated + NetCheck(gstate.global_prefs.hangup_if_dialed); UpdateGUI(&gstate); diff --git a/lib/network.C b/lib/network.C index 383c4875cc..35a015bc17 100644 --- a/lib/network.C +++ b/lib/network.C @@ -46,3 +46,144 @@ int get_socket_error(int fd) { #endif return n; } + +#ifdef _WIN32 + +#define DIAL_WAIT 60 // seconds after dial to wait (in case of cancel) +#define CONFIRM_WAIT 60 // seconds after user says not to connect to ask again +#define CLOSE_WAIT 5 // seconds after last call to close that the connection should be terminated + +int net_ref_count = -1; // -1 closed, 0 open but not used, >0 number of users +double net_last_req_time = 0; // last time user was requested to connect in seconds +double net_last_dial_time = 0; // last time modem was dialed +double net_close_time = 0; // 0 don't close, >0 time when network connection should be terminated in seconds +bool dialed = false; + +int WinsockInitialize() { + WSADATA wsdata; + return WSAStartup( MAKEWORD( 1, 1 ), &wsdata); +} + +int WinsockCleanup() { + return WSACleanup(); +} + +typedef BOOL (WINAPI *GetStateProc)( OUT LPDWORD lpdwFlags, IN DWORD dwReserved); + +int get_connected_state( ) { + int online = 0; + static bool first=true; + static HMODULE libmodule; + static GetStateProc GetState; + DWORD connectionFlags; + + if (first) { + libmodule = LoadLibrary("wininet.dll"); + if (libmodule) { + GetState = (GetStateProc) GetProcAddress(libmodule, "InternetGetConnectedState"); + } + first = false; + } + if (libmodule && GetState) { + online = (*GetState)(&connectionFlags, 0); + if (online) { + return CONNECTED_STATE_CONNECTED; + } else { + return CONNECTED_STATE_NOT_CONNECTED; + } + } + return CONNECTED_STATE_UNKNOWN; +} + +int NetOpen() { + int rc; + + typedef BOOL (WINAPI *GetStateProc)( OUT LPDWORD lpdwFlags, IN DWORD dwReserved); + typedef BOOL (WINAPI *AutoDialProc)( IN DWORD dwFlags, IN DWORD dwReserved); + + if (net_ref_count >= 0) { + net_ref_count ++; + return 0; + } + + GetStateProc GetState = NULL; + AutoDialProc AutoDial = NULL; + DWORD connectionFlags; + HMODULE libmodule = NULL; + + libmodule = LoadLibrary("wininet.dll"); + if (libmodule) { + GetState = (GetStateProc)GetProcAddress(libmodule, "InternetGetConnectedState"); + AutoDial = (AutoDialProc)GetProcAddress(libmodule, "InternetAutodial"); + + if (GetState && AutoDial) { + rc = (*GetState)(&connectionFlags, 0); + + // Don't Autodial if already connected to Internet by Modem or LAN + if (!rc) { + if((double)time(NULL) < net_last_dial_time + CONFIRM_WAIT) { + return -1; + } +#if !defined(_WIN32) && !defined(_CONSOLE) + if(gstate.global_prefs.confirm_before_connecting) { + net_last_req_time = (double)time(NULL); + if(!RequestNetConnect()) { + return -1; + } + } +#endif + net_last_dial_time = (double)time(NULL); + rc = (*AutoDial)(INTERNET_AUTODIAL_FORCE_UNATTENDED, 0); + if (rc) { + dialed = true; + } else { + // InternetAutodial() returns error 86 for some users + // and 668 for some other users, but a subsequent call + // to gethostbyname() or connect() autodials successfully. + // So (with one exception) we ignore failure returns + // from InternetAutodial() to work around this problem. + // Error 86 is "The specified Network Password is not correct." + // Error 668 is RAS Error "The connection dropped." + rc = GetLastError(); + // Don't continue if busy signal, no answer or user cancelled + if (rc == ERROR_USER_DISCONNECTION) { + return -1; + } + } + } + } + } + + net_ref_count = 1; + return 0; +} + +void NetClose() { + if (net_ref_count > 0) net_ref_count --; + if (net_ref_count == 0) { + net_close_time = (double)time(NULL) + CLOSE_WAIT; + } +} + +void NetCheck(bool hangup_if_dialed) { + if (net_ref_count == 0 && net_close_time > 0 && net_close_time < (double)time(NULL)) { + + typedef BOOL (WINAPI *HangupProc)(IN DWORD dwReserved); + HangupProc HangUp = NULL; + HMODULE libmodule = NULL; + + // Hang up the modem if we dialed it + if (dialed && hangup_if_dialed) { + libmodule = LoadLibrary("wininet.dll"); + if (libmodule) { + HangUp = (HangupProc)GetProcAddress(libmodule, "InternetAutodialHangup"); + if (HangUp) int rc = (* HangUp)(0); + } + } + dialed = false; + net_ref_count = -1; + net_close_time = 0; + + } +} +#endif \ No newline at end of file diff --git a/lib/network.h b/lib/network.h index 3e483a962e..28f1f5ff8b 100644 --- a/lib/network.h +++ b/lib/network.h @@ -29,3 +29,14 @@ typedef int32_t socklen_t; typedef size_t socklen_t; #endif +#define CONNECTED_STATE_NOT_CONNECTED 0 +#define CONNECTED_STATE_CONNECTED 1 +#define CONNECTED_STATE_UNKNOWN 2 + +extern int get_connected_state(); + +#ifdef _WIN32 +extern int NetOpen(); +extern void NetClose(); +extern void NetCheck(bool hangup_if_dialed); +#endif diff --git a/win_build/boinc_cli.vcproj b/win_build/boinc_cli.vcproj index 2711017dd1..ab206bb230 100644 --- a/win_build/boinc_cli.vcproj +++ b/win_build/boinc_cli.vcproj @@ -992,29 +992,6 @@ - - - - - - - - @@ -1148,9 +1125,6 @@ - - diff --git a/win_build/boinc_gui.vcproj b/win_build/boinc_gui.vcproj index 0df5a6be31..ee502f8cee 100644 --- a/win_build/boinc_gui.vcproj +++ b/win_build/boinc_gui.vcproj @@ -1014,29 +1014,6 @@ - - - - - - - - - - @@ -1349,10 +1323,10 @@ Name="Resource Files" Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> + RelativePath="..\client\win\boinc.bmp"> + RelativePath="..\client\win\res\boinc.bmp"> @@ -1372,10 +1346,10 @@ + RelativePath="..\client\win\res\boincsm.bmp"> + RelativePath="..\client\win\boincsm.bmp">