]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/dialup.cpp
wxDialUpManager fixes
[wxWidgets.git] / src / unix / dialup.cpp
index ea9ed63df6fa5bc88f997f872131ffa1ee482cb7..4985bd9ef7ad4b60e9b37b6ade0f0bc2a1a367da 100644 (file)
 
 #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 <stdlib.h>
 
 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
        to call this function and check its result before calling any other
@@ -107,6 +105,14 @@ public:
          return m_IsOnline != 0;
       }
 
+   /// returns TRUE if (async) dialing is in progress
+   inline virtual bool IsDialling() 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();
+
    // 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 +169,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 +207,39 @@ public:
    wxDialUpManagerImpl *m_dupman;
 };
 
+class wxDialProcess : public wxProcess
+{
+public:
+   wxDialProcess(wxDialUpManagerImpl *dupman)
+      {
+         m_DupMan = dupman;
+      }
+   void OnTerminate(int pid, int 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;
+}
+
+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 +258,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 +278,29 @@ wxDialUpManagerImpl::HangUp(void)
 {
    if(m_IsOnline == 0)
       return FALSE;
+   if(IsDialling())
+   {
+      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(! IsDialling())
+      return FALSE;
+   return kill(m_DialPId, SIGTERM) > 0;
+}
+
 bool
 wxDialUpManagerImpl::EnableAutoCheckOnlineStatus(size_t nSeconds)
 {
@@ -279,7 +344,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.
@@ -290,10 +355,8 @@ wxDialUpManagerImpl::CheckStatus(void) const
    // now send the events as appropriate:
    if(m_IsOnline != oldIsOnline)
    {
-      if(m_IsOnline)
-         ; // send ev
-      else
-         ; // send ev
+      wxDialUpEvent event(m_IsOnline, ! fromAsync);
+      (void)wxTheApp->ProcessEvent(event);
    }
 }