X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c756f7426059bddf6a5688820ae7655cf0cc5835..12db77cab1054d288a2b3e2d07e58ad1d6386a53:/src/unix/dialup.cpp?ds=sidebyside diff --git a/src/unix/dialup.cpp b/src/unix/dialup.cpp index ea9ed63df6..2dac8544b8 100644 --- a/src/unix/dialup.cpp +++ b/src/unix/dialup.cpp @@ -11,6 +11,10 @@ #include "wx/setup.h" +#ifdef __GNUG__ +# pragma implementation "dialup.h" +#endif + #if wxUSE_DIALUP_MANAGER #ifndef WX_PRECOMP @@ -19,11 +23,16 @@ #include "wx/string.h" #include "wx/event.h" -#include "wx/net.h" +#include "wx/dialup.h" #include "wx/timer.h" #include "wx/filefn.h" #include "wx/utils.h" #include "wx/log.h" +#include "wx/file.h" +#include "wx/process.h" +#include "wx/intl.h" +#include "wx/app.h" +#include "wx/wxchar.h" #include @@ -62,14 +71,8 @@ class WXDLLEXPORT wxDialUpManagerImpl : public wxDialUpManager { public: - wxDialUpManagerImpl() - { - m_IsOnline = -1; // unknown - m_timer = NULL; - m_CanUseIfconfig = -1; // unknown - m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST; - m_BeaconPort = 80; - } + wxDialUpManagerImpl(); + ~wxDialUpManagerImpl(); /** Could the dialup manager be initialized correctly? If this function returns FALSE, no other functions will work neither, so it's a good idea @@ -107,6 +110,23 @@ public: return m_IsOnline != 0; } + /// do we have a constant net connection? -- GUESS! + bool IsAlwaysOnline() const + { + ((wxDialUpManagerImpl *) this)->HangUp(); // brutal but necessary + return IsOnline(); + } + /// returns TRUE if (async) dialing is in progress + inline virtual bool IsDialing() const + { return m_DialProcess != NULL; } + + // cancel dialing the number initiated with Dial(async = TRUE) + // NB: this won't result in DISCONNECTED event being sent + virtual bool CancelDialing(); + + unsigned int GetISPNames(class wxArrayString &) const + { return 0; } + // sometimes the built-in logic for determining the online status may fail, // so, in general, the user should be allowed to override it. This function // allows to forcefully set the online status - whatever our internal @@ -163,10 +183,16 @@ private: wxString m_ISPname; /// a timer for regular testing class AutoCheckTimer *m_timer; - friend class AutoCheckTimer; + + /// a wxProcess for dialling in background + class wxDialProcess *m_DialProcess; + /// pid of dial process + int m_DialPId; + friend class wxDialProcess; + /// determine status - void CheckStatus(void) const; + void CheckStatus(bool fromAsync = FALSE) const; /// real status check void CheckStatusInternal(void); @@ -195,6 +221,45 @@ public: wxDialUpManagerImpl *m_dupman; }; +class wxDialProcess : public wxProcess +{ +public: + wxDialProcess(wxDialUpManagerImpl *dupman) + { + m_DupMan = dupman; + } + void OnTerminate(int WXUNUSED(pid), int WXUNUSED(status)) const + { + m_DupMan->m_DialProcess = NULL; + m_DupMan->CheckStatus(TRUE); + } +private: + wxDialUpManagerImpl *m_DupMan; +}; + + +wxDialUpManagerImpl::wxDialUpManagerImpl() +{ + m_IsOnline = -1; // unknown + m_DialProcess = NULL; + m_timer = NULL; + m_CanUseIfconfig = -1; // unknown + m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST; + m_BeaconPort = 80; + SetConnectCommand("pon", "poff"); // default values for Debian/GNU linux + wxChar * dial = wxGetenv(_T("WXDIALUP_DIALCMD")); + wxChar * hup = wxGetenv(_T("WXDIALUP_HUPCMD")); + if(dial || hup) + SetConnectCommand(dial ? wxString(dial) : m_ConnectCommand, + hup ? wxString(hup) : m_HangUpCommand); +} + +wxDialUpManagerImpl::~wxDialUpManagerImpl() +{ + if(m_timer) delete m_timer; + if(m_DialProcess) m_DialProcess->Detach(); +} + bool wxDialUpManagerImpl::Dial(const wxString &isp, const wxString & WXUNUSED(username), @@ -213,12 +278,19 @@ wxDialUpManagerImpl::Dial(const wxString &isp, if ( async ) { - wxFAIL_MSG(_T("TODO")); + m_DialProcess = new wxDialProcess(this); + m_DialPId = wxExecute(cmd, FALSE, m_DialProcess); + if(m_DialPId == 0) + { + delete m_DialProcess; + m_DialProcess = NULL; + return FALSE; + } + else + return TRUE; } else - { return wxExecute(cmd, /* sync */ TRUE) == 0; - } } bool @@ -226,16 +298,29 @@ wxDialUpManagerImpl::HangUp(void) { if(m_IsOnline == 0) return FALSE; + if(IsDialing()) + { + wxLogError(_("Already dialling ISP.")); + return FALSE; + } m_IsOnline = -1; wxString cmd; if(m_HangUpCommand.Find("%s")) - cmd.Printf(m_HangUpCommand,m_ISPname.c_str()); + cmd.Printf(m_HangUpCommand,m_ISPname.c_str(), m_DialProcess); else cmd = m_HangUpCommand; return wxExecute(cmd, /* sync */ TRUE) == 0; } +bool +wxDialUpManagerImpl::CancelDialing() +{ + if(! IsDialing()) + return FALSE; + return kill(m_DialPId, SIGTERM) > 0; +} + bool wxDialUpManagerImpl::EnableAutoCheckOnlineStatus(size_t nSeconds) { @@ -279,7 +364,7 @@ wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno) void -wxDialUpManagerImpl::CheckStatus(void) const +wxDialUpManagerImpl::CheckStatus(bool fromAsync) const { // This function calls the CheckStatusInternal() helper function // which is OS - specific and then sends the events. @@ -288,12 +373,10 @@ wxDialUpManagerImpl::CheckStatus(void) const ( /* non-const */ (wxDialUpManagerImpl *)this)->CheckStatusInternal(); // now send the events as appropriate: - if(m_IsOnline != oldIsOnline) + if(m_IsOnline != oldIsOnline && oldIsOnline != -1) { - if(m_IsOnline) - ; // send ev - else - ; // send ev + wxDialUpEvent event(m_IsOnline, ! fromAsync); + (void)wxTheApp->ProcessEvent(event); } } @@ -330,13 +413,13 @@ wxDialUpManagerImpl::CheckStatusInternal(void) if(m_CanUseIfconfig != 0) // unknown or yes { wxASSERT(m_IfconfigPath.length()); - + wxString tmpfile = wxGetTempFileName("_wxdialuptest"); wxString cmd = "/bin/sh -c \'"; cmd << m_IfconfigPath << " >" << tmpfile << '\''; /* I tried to add an option to wxExecute() to not close stdout, so we could let ifconfig write directly to the tmpfile, but - this does not work. That should be faster, as it doesn´t call + this does not work. That should be faster, as it doesn´t call the shell first. I have no idea why. :-( (KB) */ #if 0 // temporarily redirect stdout/stderr: @@ -396,7 +479,6 @@ wxDialUpManagerImpl::CheckStatusInternal(void) // This can be used under Win 9x, too! struct hostent *hp; struct sockaddr_in serv_addr; - int sockfd; m_IsOnline = 0; // assume false if((hp = gethostbyname(m_BeaconHost)) == NULL) @@ -405,24 +487,41 @@ wxDialUpManagerImpl::CheckStatusInternal(void) serv_addr.sin_family = hp->h_addrtype; memcpy(&serv_addr.sin_addr,hp->h_addr, hp->h_length); serv_addr.sin_port = htons(m_BeaconPort); + + // PING method: + + int sockfd; if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) { // sys_error("cannot create socket for gw"); return; } + + if(sendto(sockfd, "hello", + strlen("hello"), /* flags */ 0, + (struct sockaddr *) &serv_addr, + sizeof(serv_addr)) == -1) + { + close(sockfd); + return; + } + +#if 0 if( connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) - { + { //sys_error("cannot connect to server"); return; } //connected! +#endif close(sockfd); + m_IsOnline = TRUE; } /* static */ wxDialUpManager * -wxDialUpManager::wxDialUpManager::Create(void) +wxDialUpManager::Create(void) { return new wxDialUpManagerImpl; }