]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/dialup.cpp
Use gdk_window_invalidate instead of gtk_widget_queue_draw as the latter doesn't...
[wxWidgets.git] / src / unix / dialup.cpp
index f64e45fd903055a597e087040c419fea49e12cba..96cf13130b6c7cc2f588bd3670f8a8e7f869a2c6 100644 (file)
@@ -1,6 +1,6 @@
 // -*- c++ -*- ////////////////////////////////////////////////////////////////
 // -*- c++ -*- ////////////////////////////////////////////////////////////////
-// Name:        unix/dialup.cpp
-// Purpose:     Network related wxWindows classes and functions
+// Name:        src/unix/dialup.cpp
+// Purpose:     Network related wxWidgets classes and functions
 // Author:      Karsten Ballüder
 // Modified by:
 // Created:     03.10.99
 // Author:      Karsten Ballüder
 // Modified by:
 // Created:     03.10.99
@@ -9,30 +9,27 @@
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // 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
 
 
 #if wxUSE_DIALUP_MANAGER
 
+#include "wx/dialup.h"
+
 #ifndef  WX_PRECOMP
 #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
 
 #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/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 <stdlib.h>
 
@@ -46,6 +43,9 @@
 #include <arpa/inet.h>
 #include <errno.h>
 
 #include <arpa/inet.h>
 #include <errno.h>
 
+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
 // workstation using dial-up access to the net. There is at most one instance
 // ----------------------------------------------------------------------------
 // A class which groups functions dealing with connecting to the network from a
 // workstation using dial-up access to the net. There is at most one instance
@@ -73,19 +73,19 @@ class WXDLLEXPORT wxDialUpManagerImpl : public wxDialUpManager
 {
 public:
    wxDialUpManagerImpl();
 {
 public:
    wxDialUpManagerImpl();
-   ~wxDialUpManagerImpl();
+   virtual ~wxDialUpManagerImpl();
 
    /** Could the dialup manager be initialized correctly? If this function
 
    /** 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
        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
 
    /** 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
        message in the latter case.
        @param nameOfISP optional paramater for dial program
        @param username unused
@@ -99,7 +99,7 @@ public:
    // Hang up the currently active dial up connection.
    virtual bool HangUp();
 
    // 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
    // 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
@@ -111,11 +111,11 @@ public:
    // do we have a constant net connection?
    virtual bool IsAlwaysOnline() const;
 
    // 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; }
 
    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();
 
    // NB: this won't result in DISCONNECTED event being sent
    virtual bool CancelDialing();
 
@@ -126,7 +126,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.
    // 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
       { m_IsOnline = isOnline ? Net_Connected : Net_No; }
 
    // set misc wxDialUpManager options
@@ -138,7 +138,7 @@ public:
    // Windows, the notification about the change of connection status is
    // instantenous.
    //
    // 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
    virtual bool EnableAutoCheckOnlineStatus(size_t nSeconds);
 
    // disable automatic check for connection status change - notice that the
@@ -216,7 +216,7 @@ private:
    friend class wxDialProcess;
 
    // determine status
    friend class wxDialProcess;
 
    // determine status
-   void CheckStatus(bool fromAsync = FALSE) const;
+   void CheckStatus(bool fromAsync = false) const;
 
    // real status check
    void CheckStatusInternal();
 
    // real status check
    void CheckStatusInternal();
@@ -244,21 +244,18 @@ class AutoCheckTimer : public wxTimer
 {
 public:
    AutoCheckTimer(wxDialUpManagerImpl *dupman)
 {
 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()
 
    virtual void Notify()
-      { wxLogTrace(wxT("Checking dial up network status.")); m_dupman->CheckStatus(); }
+   {
+       wxLogTrace(_T("dialup"), wxT("Checking dial up network status."));
+
+       m_dupman->CheckStatus();
+   }
 
 
-   virtual void Stop()
-      { if ( m_started ) wxTimer::Stop(); }
 public:
 public:
-   bool m_started;
    wxDialUpManagerImpl *m_dupman;
 };
 
    wxDialUpManagerImpl *m_dupman;
 };
 
@@ -275,7 +272,7 @@ public:
          if(m_DupMan)
          {
             m_DupMan->m_DialProcess = NULL;
          if(m_DupMan)
          {
             m_DupMan->m_DialProcess = NULL;
-            m_DupMan->CheckStatus(TRUE);
+            m_DupMan->CheckStatus(true);
          }
       }
 private:
          }
       }
 private:
@@ -324,54 +321,54 @@ wxDialUpManagerImpl::Dial(const wxString &isp,
                           const wxString & WXUNUSED(password),
                           bool async)
 {
                           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)
+        {
+            delete m_DialProcess;
+            m_DialProcess = NULL;
+            return false;
+        }
+        else
+            return true;
+    }
+    else
+        return wxExecute(cmd, /* sync */ true) == 0;
 }
 
 bool wxDialUpManagerImpl::HangUp()
 {
 }
 
 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())
 }
 
 
 bool wxDialUpManagerImpl::CancelDialing()
 {
    if(! IsDialing())
-      return FALSE;
+      return false;
    return kill(m_DialPId, SIGTERM) > 0;
 }
 
    return kill(m_DialPId, SIGTERM) > 0;
 }
 
@@ -401,7 +398,7 @@ void wxDialUpManagerImpl::DisableAutoCheckOnlineStatus()
 
 void wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno)
 {
 
 void wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno)
 {
-   if(hostname.Length() == 0)
+   if(hostname.length() == 0)
    {
       m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST;
       m_BeaconPort = 80;
    {
       m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST;
       m_BeaconPort = 80;
@@ -410,7 +407,7 @@ void wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno)
 
    // does hostname contain a port number?
    wxString port = hostname.After(wxT(':'));
 
    // does hostname contain a port number?
    wxString port = hostname.After(wxT(':'));
-   if(port.Length())
+   if(port.length())
    {
       m_BeaconHost = hostname.Before(wxT(':'));
       m_BeaconPort = wxAtoi(port);
    {
       m_BeaconHost = hostname.Before(wxT(':'));
       m_BeaconPort = wxAtoi(port);
@@ -583,9 +580,11 @@ wxDialUpManagerImpl::NetConnection wxDialUpManagerImpl::CheckConnect()
    }
    else // failed to connect
    {
    }
    else // failed to connect
    {
+#ifdef ENETUNREACH
        if(errno == ENETUNREACH)
           return Net_No; // network is unreachable
        else
        if(errno == ENETUNREACH)
           return Net_No; // network is unreachable
        else
+#endif
           return Net_Unknown; // connect failed, but don't know why
    }
 }
           return Net_Unknown; // connect failed, but don't know why
    }
 }
@@ -636,6 +635,10 @@ wxDialUpManagerImpl::CheckProcNet()
 int
 wxDialUpManagerImpl::CheckIfconfig()
 {
 int
 wxDialUpManagerImpl::CheckIfconfig()
 {
+#ifdef __VMS
+    m_CanUseIfconfig = 0;
+    return -1;
+#else
     // assume that the test doesn't work
     int netDevice = NetDevice_Unknown;
 
     // assume that the test doesn't work
     int netDevice = NetDevice_Unknown;
 
@@ -644,9 +647,10 @@ wxDialUpManagerImpl::CheckIfconfig()
     {
         static const wxChar *ifconfigLocations[] =
         {
     {
         static const wxChar *ifconfigLocations[] =
         {
-            _T("/sbin"),         // Linux, FreeBSD
+            _T("/sbin"),         // Linux, FreeBSD, Darwin
             _T("/usr/sbin"),     // SunOS, Solaris, AIX, HP-UX
             _T("/usr/etc"),      // IRIX
             _T("/usr/sbin"),     // SunOS, Solaris, AIX, HP-UX
             _T("/usr/etc"),      // IRIX
+            _T("/etc"),          // AIX 5
         };
 
         for ( size_t n = 0; n < WXSIZEOF(ifconfigLocations); n++ )
         };
 
         for ( size_t n = 0; n < WXSIZEOF(ifconfigLocations); n++ )
@@ -669,31 +673,39 @@ wxDialUpManagerImpl::CheckIfconfig()
         wxASSERT_MSG( m_IfconfigPath.length(),
                       _T("can't use ifconfig if it wasn't found") );
 
         wxASSERT_MSG( m_IfconfigPath.length(),
                       _T("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;
         cmd << m_IfconfigPath;
-#if defined(__SOLARIS__) || defined (__SUNOS__)
+#if defined(__AIX__) || \
+    defined(__NETBSD__) || \
+    defined(__OSF__) || \
+    defined(__SOLARIS__) || defined (__SUNOS__)
         // need to add -a flag
         // need to add -a flag
-        cmd << " -a";
+        cmd << wxT(" -a");
 #elif defined(__LINUX__) || defined(__SGI__)
         // nothing to be added to ifconfig
 #elif defined(__LINUX__) || defined(__SGI__)
         // nothing to be added to ifconfig
-#elif defined(__FREEBSD__)
+#elif defined(__FREEBSD__) || defined(__DARWIN__)
         // add -l flag
         // add -l flag
-        cmd << " -l";
+        cmd << wxT(" -l");
 #elif defined(__HPUX__)
         // VZ: a wild guess (but without it, ifconfig fails completely)
 #elif defined(__HPUX__)
         // VZ: a wild guess (but without it, ifconfig fails completely)
-        cmd << _T(" ppp0");
+        cmd << wxT(" ppp0");
 #else
 #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
         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
            the shell first. I have no idea why. :-(  (KB) */
         /* 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
            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;
         {
             m_CanUseIfconfig = 1;
             wxFFile file;
@@ -704,23 +716,23 @@ wxDialUpManagerImpl::CheckIfconfig()
                 {
                     // FIXME shouldn't we grep for "^ppp"? (VZ)
 
                 {
                     // 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
 
 #if defined(__SOLARIS__) || defined (__SUNOS__)
                     // dialup device under SunOS/Solaris
-                    hasModem = strstr(output,"ipdptp") != (char *)NULL;
-                    hasLAN = strstr(output, "hme") != (char *)NULL;
+                    hasModem = strstr(output.fn_str(),"ipdptp") != NULL;
+                    hasLAN = strstr(output.fn_str(), "hme") != NULL;
 #elif defined(__LINUX__) || defined (__FREEBSD__)
 #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(),"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
 #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
 #elif defined(__HPUX__)
                     // if could run ifconfig on interface, then it exists
-                    hasModem = TRUE;
+                    hasModem = true;
 #endif
 
                     netDevice = NetDevice_None;
 #endif
 
                     netDevice = NetDevice_None;
@@ -742,50 +754,70 @@ wxDialUpManagerImpl::CheckIfconfig()
     }
 
     return netDevice;
     }
 
     return netDevice;
+#endif
 }
 
 wxDialUpManagerImpl::NetConnection wxDialUpManagerImpl::CheckPing()
 {
 }
 
 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 = _T("/etc/ping");
+#elif defined(__SGI__)
+        m_PingPath = _T("/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;
        // 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__)
 #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)
+    cmd << wxT("-c 1 "); // only ping once
 #elif defined(__HPUX__)
 #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
 #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
 #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 */
 }
 
 /* static */