]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/dialup.cpp
Workaround for #15404: wxRichTextCtrl: caret does not disappear when focus is lost...
[wxWidgets.git] / src / unix / dialup.cpp
index 54797d807c490728aedf1b5346888f537986a316..95d37b22ef6d3ebb63bb213455fd45006c84fe08 100644 (file)
@@ -1,53 +1,48 @@
 // -*- c++ -*- ////////////////////////////////////////////////////////////////
-// Name:        unix/dialup.cpp
-// Purpose:     Network related wxWindows classes and functions
-// Author:      Karsten Ballüder
+// Name:        src/unix/dialup.cpp
+// Purpose:     Network related wxWidgets classes and functions
+// Author:      Karsten Ballüder
 // Modified by:
 // Created:     03.10.99
-// RCS-ID:      $Id$
-// Copyright:   (c) Karsten Ballüder
+// Copyright:   (c) Karsten Ballüder
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "wx/setup.h"
-
-#ifdef __GNUG__
-#   pragma implementation "dialup.h"
-#endif
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
 #if wxUSE_DIALUP_MANAGER
 
+#include "wx/dialup.h"
+
 #ifndef  WX_PRECOMP
-#   include "wx/defs.h"
+    #include "wx/string.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/event.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/timer.h"
 #endif // !PCH
 
-#include "wx/string.h"
-#include "wx/event.h"
-#include "wx/dialup.h"
-#include "wx/timer.h"
-#include "wx/filefn.h"
-#include "wx/utils.h"
-#include "wx/log.h"
+#include "wx/filename.h"
 #include "wx/ffile.h"
 #include "wx/process.h"
-#include "wx/intl.h"
-#include "wx/app.h"
-#include "wx/wxchar.h"
+#include "wx/crt.h"
 
 #include <stdlib.h>
 
 #include <signal.h>
 #include <fcntl.h>
 #include <unistd.h>
-#define __STRICT_ANSI__
 #include <sys/socket.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <errno.h>
 
-DEFINE_EVENT_TYPE(wxEVT_DIALUP_CONNECTED)
-DEFINE_EVENT_TYPE(wxEVT_DIALUP_DISCONNECTED)
+wxDEFINE_EVENT( wxEVT_DIALUP_CONNECTED, wxDialUpEvent );
+wxDEFINE_EVENT( wxEVT_DIALUP_DISCONNECTED, wxDialUpEvent );
 
 // ----------------------------------------------------------------------------
 // A class which groups functions dealing with connecting to the network from a
@@ -76,19 +71,19 @@ class WXDLLEXPORT wxDialUpManagerImpl : public wxDialUpManager
 {
 public:
    wxDialUpManagerImpl();
-   ~wxDialUpManagerImpl();
+   virtual ~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
+       returns false, no other functions will work neither, so it's a good idea
        to call this function and check its result before calling any other
        wxDialUpManager methods.
    */
    virtual bool IsOk() const
-      { return TRUE; }
+      { return true; }
 
    /** The simplest way to initiate a dial up: this function dials the given
        ISP (exact meaning of the parameter depends on the platform), returns
-       TRUE on success or FALSE on failure and logs the appropriate error
+       true on success or false on failure and logs the appropriate error
        message in the latter case.
        @param nameOfISP optional paramater for dial program
        @param username unused
@@ -102,7 +97,7 @@ public:
    // Hang up the currently active dial up connection.
    virtual bool HangUp();
 
-   // returns TRUE if the computer is connected to the network: under Windows,
+   // returns true if the computer is connected to the network: under Windows,
    // this just means that a RAS connection exists, under Unix we check that
    // the "well-known host" (as specified by SetWellKnownHost) is reachable
    virtual bool IsOnline() const
@@ -114,11 +109,11 @@ public:
    // do we have a constant net connection?
    virtual bool IsAlwaysOnline() const;
 
-   // returns TRUE if (async) dialing is in progress
+   // returns true if (async) dialing is in progress
    virtual bool IsDialing() const
       { return m_DialProcess != NULL; }
 
-   // cancel dialing the number initiated with Dial(async = TRUE)
+   // cancel dialing the number initiated with Dial(async = true)
    // NB: this won't result in DISCONNECTED event being sent
    virtual bool CancelDialing();
 
@@ -129,7 +124,7 @@ public:
    // so, in general, the user should be allowed to override it. This function
    // allows to forcefully set the online status - whatever our internal
    // algorithm may think about it.
-   virtual void SetOnlineStatus(bool isOnline = TRUE)
+   virtual void SetOnlineStatus(bool isOnline = true)
       { m_IsOnline = isOnline ? Net_Connected : Net_No; }
 
    // set misc wxDialUpManager options
@@ -141,7 +136,7 @@ public:
    // Windows, the notification about the change of connection status is
    // instantenous.
    //
-   // Returns FALSE if couldn't set up automatic check for online status.
+   // Returns false if couldn't set up automatic check for online status.
    virtual bool EnableAutoCheckOnlineStatus(size_t nSeconds);
 
    // disable automatic check for connection status change - notice that the
@@ -219,7 +214,7 @@ private:
    friend class wxDialProcess;
 
    // determine status
-   void CheckStatus(bool fromAsync = FALSE) const;
+   void CheckStatus(bool fromAsync = false) const;
 
    // real status check
    void CheckStatusInternal();
@@ -247,21 +242,18 @@ class AutoCheckTimer : public wxTimer
 {
 public:
    AutoCheckTimer(wxDialUpManagerImpl *dupman)
-      {
-         m_dupman = dupman;
-         m_started = FALSE;
-      }
-
-   virtual bool Start( int millisecs = -1, bool WXUNUSED(one_shot) = FALSE )
-      { m_started = TRUE; return wxTimer::Start(millisecs, FALSE); }
+   {
+       m_dupman = dupman;
+   }
 
    virtual void Notify()
-      { wxLogTrace(wxT("Checking dial up network status.")); m_dupman->CheckStatus(); }
+   {
+       wxLogTrace(wxT("dialup"), wxT("Checking dial up network status."));
+
+       m_dupman->CheckStatus();
+   }
 
-   virtual void Stop()
-      { if ( m_started ) wxTimer::Stop(); }
 public:
-   bool m_started;
    wxDialUpManagerImpl *m_dupman;
 };
 
@@ -278,7 +270,7 @@ public:
          if(m_DupMan)
          {
             m_DupMan->m_DialProcess = NULL;
-            m_DupMan->CheckStatus(TRUE);
+            m_DupMan->CheckStatus(true);
          }
       }
 private:
@@ -298,15 +290,15 @@ wxDialUpManagerImpl::wxDialUpManagerImpl()
    m_BeaconPort = 80;
 
 #ifdef __SGI__
-   m_ConnectCommand = _T("/usr/etc/ppp");
+   m_ConnectCommand = wxT("/usr/etc/ppp");
 #elif defined(__LINUX__)
    // default values for Debian/GNU linux
-   m_ConnectCommand = _T("pon");
-   m_HangUpCommand = _T("poff");
+   m_ConnectCommand = wxT("pon");
+   m_HangUpCommand = wxT("poff");
 #endif
 
-   wxChar * dial = wxGetenv(_T("WXDIALUP_DIALCMD"));
-   wxChar * hup = wxGetenv(_T("WXDIALUP_HUPCMD"));
+   wxChar * dial = wxGetenv(wxT("WXDIALUP_DIALCMD"));
+   wxChar * hup = wxGetenv(wxT("WXDIALUP_HUPCMD"));
    SetConnectCommand(dial ? wxString(dial) : m_ConnectCommand,
                      hup ? wxString(hup) : m_HangUpCommand);
 }
@@ -327,54 +319,53 @@ wxDialUpManagerImpl::Dial(const wxString &isp,
                           const wxString & WXUNUSED(password),
                           bool async)
 {
-   if(m_IsOnline == Net_Connected)
-      return FALSE;
-   m_ISPname = isp;
-   wxString cmd;
-   if(m_ConnectCommand.Find(wxT("%s")))
-      cmd.Printf(m_ConnectCommand,m_ISPname.c_str());
-   else
-      cmd = m_ConnectCommand;
+    if(m_IsOnline == Net_Connected)
+        return false;
+    m_ISPname = isp;
+    wxString cmd;
+    if(m_ConnectCommand.Find(wxT("%s")))
+        cmd.Printf(m_ConnectCommand,m_ISPname.c_str());
+    else
+        cmd = m_ConnectCommand;
 
-   if ( async )
-   {
-      m_DialProcess = new wxDialProcess(this);
-      m_DialPId = (int)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;
+    if ( async )
+    {
+        m_DialProcess = new wxDialProcess(this);
+        m_DialPId = (int)wxExecute(cmd, false, m_DialProcess);
+        if(m_DialPId == 0)
+        {
+            wxDELETE(m_DialProcess);
+            return false;
+        }
+        else
+            return true;
+    }
+    else
+        return wxExecute(cmd, /* sync */ true) == 0;
 }
 
 bool wxDialUpManagerImpl::HangUp()
 {
-   if(m_IsOnline == Net_No)
-      return FALSE;
-   if(IsDialing())
-   {
-      wxLogError(_("Already dialling ISP."));
-      return FALSE;
-   }
-   wxString cmd;
-   if(m_HangUpCommand.Find(wxT("%s")))
-      cmd.Printf(m_HangUpCommand,m_ISPname.c_str(), m_DialProcess);
-   else
-      cmd = m_HangUpCommand;
-   return wxExecute(cmd, /* sync */ TRUE) == 0;
+    if(m_IsOnline == Net_No)
+        return false;
+    if(IsDialing())
+    {
+        wxLogError(_("Already dialling ISP."));
+        return false;
+    }
+    wxString cmd;
+    if(m_HangUpCommand.Find(wxT("%s")))
+        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 false;
    return kill(m_DialPId, SIGTERM) > 0;
 }
 
@@ -385,8 +376,7 @@ bool wxDialUpManagerImpl::EnableAutoCheckOnlineStatus(size_t nSeconds)
    bool rc = m_timer->Start(nSeconds*1000);
    if(! rc)
    {
-      delete m_timer;
-      m_timer = NULL;
+      wxDELETE(m_timer);
    }
    return rc;
 }
@@ -396,15 +386,14 @@ void wxDialUpManagerImpl::DisableAutoCheckOnlineStatus()
    if(m_timer != NULL)
    {
       m_timer->Stop();
-      delete m_timer;
-      m_timer = NULL;
+      wxDELETE(m_timer);
    }
 }
 
 
 void wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno)
 {
-   if(hostname.Length() == 0)
+   if( hostname.empty() )
    {
       m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST;
       m_BeaconPort = 80;
@@ -413,7 +402,7 @@ void wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno)
 
    // does hostname contain a port number?
    wxString port = hostname.After(wxT(':'));
-   if(port.Length())
+   if( !port.empty() )
    {
       m_BeaconHost = hostname.Before(wxT(':'));
       m_BeaconPort = wxAtoi(port);
@@ -515,7 +504,7 @@ void wxDialUpManagerImpl::CheckStatusInternal()
             break;
 
         default:
-            wxFAIL_MSG(_T("Unexpected netDeviceType"));
+            wxFAIL_MSG(wxT("Unexpected netDeviceType"));
     }
 }
 
@@ -586,9 +575,11 @@ wxDialUpManagerImpl::NetConnection wxDialUpManagerImpl::CheckConnect()
    }
    else // failed to connect
    {
+#ifdef ENETUNREACH
        if(errno == ENETUNREACH)
           return Net_No; // network is unreachable
        else
+#endif
           return Net_Unknown; // connect failed, but don't know why
    }
 }
@@ -601,7 +592,7 @@ wxDialUpManagerImpl::CheckProcNet()
     int netDevice = NetDevice_Unknown;
 
 #ifdef __LINUX__
-    if (wxFileExists(_T("/proc/net/route")))
+    if (wxFileExists(wxT("/proc/net/route")))
     {
         // cannot use wxFile::Length because file doesn't support seeking, so
         // use stdio directly
@@ -615,7 +606,10 @@ wxDialUpManagerImpl::CheckProcNet()
 
             while (fgets(output, 256, f) != NULL)
             {
-                if ( strstr(output, "eth") ) // network card
+                // Test for the known network interface names
+                if ( strstr(output, "eth")
+                        || strstr(output, "wlan")
+                        || strstr(output, "ath") )
                 {
                     netDevice |= NetDevice_LAN;
                 }
@@ -639,23 +633,28 @@ wxDialUpManagerImpl::CheckProcNet()
 int
 wxDialUpManagerImpl::CheckIfconfig()
 {
+#ifdef __VMS
+    m_CanUseIfconfig = 0;
+    return -1;
+#else
     // assume that the test doesn't work
     int netDevice = NetDevice_Unknown;
 
     // first time check for ifconfig location
     if ( m_CanUseIfconfig == -1 ) // unknown
     {
-        static const wxChar *ifconfigLocations[] =
+        static const wxChar *const ifconfigLocations[] =
         {
-            _T("/sbin"),         // Linux, FreeBSD
-            _T("/usr/sbin"),     // SunOS, Solaris, AIX, HP-UX
-            _T("/usr/etc"),      // IRIX
+            wxT("/sbin"),         // Linux, FreeBSD, Darwin
+            wxT("/usr/sbin"),     // SunOS, Solaris, AIX, HP-UX
+            wxT("/usr/etc"),      // IRIX
+            wxT("/etc"),          // AIX 5
         };
 
         for ( size_t n = 0; n < WXSIZEOF(ifconfigLocations); n++ )
         {
             wxString path(ifconfigLocations[n]);
-            path << _T("/ifconfig");
+            path << wxT("/ifconfig");
 
             if ( wxFileExists(path) )
             {
@@ -669,34 +668,42 @@ wxDialUpManagerImpl::CheckIfconfig()
     {
         wxLogNull ln; // suppress all error messages
 
-        wxASSERT_MSG( m_IfconfigPath.length(),
-                      _T("can't use ifconfig if it wasn't found") );
+        wxASSERT_MSG( !m_IfconfigPath.empty(),
+                      wxT("can't use ifconfig if it wasn't found") );
 
-        wxString tmpfile = wxGetTempFileName("_wxdialuptest");
-        wxString cmd = "/bin/sh -c \'";
+        wxString tmpfile = wxFileName::CreateTempFileName( wxT("_wxdialuptest") );
+        wxString cmd = wxT("/bin/sh -c \'");
         cmd << m_IfconfigPath;
-#if defined(__SOLARIS__) || defined (__SUNOS__)
+#if defined(__AIX__) || \
+    defined(__NETBSD__) || \
+    defined(__OSF__) || \
+    defined(__SOLARIS__) || defined (__SUNOS__)
         // need to add -a flag
-        cmd << " -a";
-#elif defined(__LINUX__) || defined(__SGI__)
+        cmd << wxT(" -a");
+#elif defined(__LINUX__) || defined(__SGI__) || defined(__OPENBSD__)
         // nothing to be added to ifconfig
-#elif defined(__FREEBSD__)
+#elif defined(__FREEBSD__) || defined(__DARWIN__) || defined(__QNX__)
         // add -l flag
-        cmd << " -l";
+        cmd << wxT(" -l");
 #elif defined(__HPUX__)
         // VZ: a wild guess (but without it, ifconfig fails completely)
-        cmd << _T(" ppp0");
+        cmd << wxT(" ppp0");
 #else
-#     pragma warning "No ifconfig information for this OS."
+        #if defined(__GNUG__)
+            #warning "No ifconfig information for this OS."
+        #else
+            #pragma warning "No ifconfig information for this OS."
+        #endif
+
         m_CanUseIfconfig = 0;
         return -1;
 #endif
-        cmd << " >" << tmpfile <<  '\'';
+       cmd << wxT(" >") << tmpfile <<  wxT('\'');
         /* 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 ( wxExecute(cmd,TRUE /* sync */) == 0 )
+        if ( wxExecute(cmd,true /* sync */) == 0 )
         {
             m_CanUseIfconfig = 1;
             wxFFile file;
@@ -707,23 +714,24 @@ wxDialUpManagerImpl::CheckIfconfig()
                 {
                     // FIXME shouldn't we grep for "^ppp"? (VZ)
 
-                    bool hasModem = FALSE,
-                         hasLAN = FALSE;
+                    bool hasModem = false,
+                         hasLAN = false;
 
 #if defined(__SOLARIS__) || defined (__SUNOS__)
                     // dialup device under SunOS/Solaris
-                    hasModem = strstr(output,"ipdptp") != (char *)NULL;
-                    hasLAN = strstr(output, "hme") != (char *)NULL;
-#elif defined(__LINUX__) || defined (__FREEBSD__)
-                    hasModem = strstr(output,"ppp")    // ppp
-                        || strstr(output,"sl")  // slip
-                        || strstr(output,"pl"); // plip
-                    hasLAN = strstr(output, "eth") != NULL;
+                    hasModem = strstr(output.fn_str(),"ipdptp") != NULL;
+                    hasLAN = strstr(output.fn_str(), "hme") != NULL;
+#elif defined(__LINUX__) || defined (__FREEBSD__) || defined (__QNX__) || \
+      defined(__OPENBSD__)
+                    hasModem = strstr(output.fn_str(),"ppp")    // ppp
+                        || strstr(output.fn_str(),"sl")  // slip
+                        || strstr(output.fn_str(),"pl"); // plip
+                    hasLAN = strstr(output.fn_str(), "eth") != NULL;
 #elif defined(__SGI__)  // IRIX
-                    hasModem = strstr(output, "ppp") != NULL; // PPP
+                    hasModem = strstr(output.fn_str(), "ppp") != NULL; // PPP
 #elif defined(__HPUX__)
                     // if could run ifconfig on interface, then it exists
-                    hasModem = TRUE;
+                    hasModem = true;
 #endif
 
                     netDevice = NetDevice_None;
@@ -738,57 +746,78 @@ wxDialUpManagerImpl::CheckIfconfig()
         }
         else // could not run ifconfig correctly
         {
-            m_CanUseIfconfig = 0; // don´t try again
+            m_CanUseIfconfig = 0; // don't try again
         }
 
         (void) wxRemoveFile(tmpfile);
     }
 
     return netDevice;
+#endif
 }
 
 wxDialUpManagerImpl::NetConnection wxDialUpManagerImpl::CheckPing()
 {
-   // First time check for ping location. We only use the variant
-   // which does not take arguments, a la GNU.
-   if(m_CanUsePing == -1) // unknown
-   {
-      if(wxFileExists("/bin/ping"))
-         m_PingPath = "/bin/ping";
-      else if(wxFileExists("/usr/sbin/ping"))
-         m_PingPath = "/usr/sbin/ping";
-      if(! m_PingPath)
-      {
-         m_CanUsePing = 0;
-      }
-   }
+    // First time check for ping location. We only use the variant
+    // which does not take arguments, a la GNU.
+    if(m_CanUsePing == -1) // unknown
+    {
+#ifdef __VMS
+        if (wxFileExists( wxT("SYS$SYSTEM:TCPIP$PING.EXE") ))
+            m_PingPath = wxT("$SYS$SYSTEM:TCPIP$PING");
+#elif defined(__AIX__)
+        m_PingPath = wxT("/etc/ping");
+#elif defined(__SGI__)
+        m_PingPath = wxT("/usr/etc/ping");
+#else
+        if (wxFileExists( wxT("/bin/ping") ))
+            m_PingPath = wxT("/bin/ping");
+        else if (wxFileExists( wxT("/usr/sbin/ping") ))
+            m_PingPath = wxT("/usr/sbin/ping");
+#endif
+        if (!m_PingPath)
+        {
+            m_CanUsePing = 0;
+        }
+    }
 
-   if(! m_CanUsePing)
-   {
+    if(! m_CanUsePing)
+    {
        // we didn't find ping
        return Net_Unknown;
-   }
+    }
 
-   wxLogNull ln; // suppress all error messages
-   wxASSERT(m_PingPath.length());
-   wxString cmd;
-   cmd << m_PingPath << ' ';
+    wxLogNull ln; // suppress all error messages
+    wxASSERT(m_PingPath.length());
+    wxString cmd;
+    cmd << m_PingPath << wxT(' ');
 #if defined(__SOLARIS__) || defined (__SUNOS__)
-   // nothing to add to ping command
-#elif defined(__LINUX__) || defined ( __FREEBSD__)
-   cmd << "-c 1 "; // only ping once
+    // nothing to add to ping command
+#elif defined(__AIX__) || \
+      defined (__BSD__) || \
+      defined(__LINUX__) || \
+      defined(__OSF__) || \
+      defined(__SGI__) || \
+      defined(__VMS) || \
+      defined(__QNX__)
+    cmd << wxT("-c 1 "); // only ping once
 #elif defined(__HPUX__)
-   cmd << "64 1 "; // only ping once (need also specify the packet size)
+    cmd << wxT("64 1 "); // only ping once (need also specify the packet size)
 #else
-#   pragma warning "No Ping information for this OS."
-   m_CanUsePing = 0;
-   return Net_Unknown;
+    #if defined(__GNUG__)
+        #warning "No Ping information for this OS."
+    #else
+        #pragma warning "No Ping information for this OS."
+    #endif
+
+    m_CanUsePing = 0;
+    return Net_Unknown;
 #endif
-   cmd << m_BeaconHost;
-   if(wxExecute(cmd, TRUE /* sync */) == 0)
-      return Net_Connected;
-   else
-      return Net_No;
+    cmd << m_BeaconHost;
+    if(wxExecute(cmd, true /* sync */) == 0)
+        return Net_Connected;
+    else
+        return Net_No;
 }
 
 /* static */