]> git.saurik.com Git - wxWidgets.git/commitdiff
Allow creating wxSingleInstanceChecker with default name.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 16 Sep 2009 12:38:00 +0000 (12:38 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 16 Sep 2009 12:38:00 +0000 (12:38 +0000)
This makes it easier to use in common cases: there is no need to come up with
a unique name for the checker any more as sufficiently unique combination of
wxApp::GetAppName() and wxGetUserId() is used if no name was explicitly given.

This is done by calling the new CreateDefault() on demand from
IsAnotherRunning() instead of simply creating the checker with the default
name in the default ctor for compatibility (you had to call Create() after
using the default ctor before and it can only be called once) and because
wxTheApp might not exist yet when wxSingleInstanceChecker is created.

Closes #11166.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61945 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/snglinst.h
interface/wx/snglinst.h
src/msw/snglinst.cpp
src/os2/snglinst.cpp
src/unix/snglinst.cpp

index a8f508aefbbecb32c2acb6693388b51462954c85..e62d6cfc01808232eeb05646ddc1ddbae0b2eaa1 100644 (file)
@@ -15,6 +15,9 @@
 
 #if wxUSE_SNGLINST_CHECKER
 
+#include "wx/app.h"
+#include "wx/utils.h"
+
 // ----------------------------------------------------------------------------
 // wxSingleInstanceChecker
 // ----------------------------------------------------------------------------
@@ -33,9 +36,11 @@ public:
         Create(name, path);
     }
 
-    // name must be given and be as unique as possible, it is used as the mutex
-    // name under Win32 and the lock file name under Unix -
-    // wxTheApp->GetAppName() may be a good value for this parameter
+    // notice that calling Create() is optional now, if you don't do it before
+    // calling IsAnotherRunning(), CreateDefault() is used automatically
+    //
+    // name it is used as the mutex name under Win32 and the lock file name
+    // under Unix so it should be as unique as possible and must be non-empty
     //
     // path is optional and is ignored under Win32 and used as the directory to
     // create the lock file in under Unix (default is wxGetHomeDir())
@@ -44,8 +49,32 @@ public:
     // instance is running - use IsAnotherRunning() to check it
     bool Create(const wxString& name, const wxString& path = wxEmptyString);
 
+    // use the default name, which is a combination of wxTheApp->GetAppName()
+    // and wxGetUserId() for mutex/lock file
+    //
+    // this is called implicitly by IsAnotherRunning() if the checker hadn't
+    // been created until then
+    bool CreateDefault()
+    {
+        wxCHECK_MSG( wxTheApp, false, "must have application instance" );
+        return Create(wxTheApp->GetAppName() + '-' + wxGetUserId());
+    }
+
     // is another copy of this program already running?
-    bool IsAnotherRunning() const;
+    bool IsAnotherRunning() const
+    {
+        if ( !m_impl )
+        {
+            if ( !const_cast<wxSingleInstanceChecker *>(this)->CreateDefault() )
+            {
+                // if creation failed, return false as it's better to not
+                // prevent this instance from starting up if there is an error
+                return false;
+            }
+        }
+
+        return DoIsAnotherRunning();
+    }
 
     // dtor is not virtual, this class is not meant to be used polymorphically
     ~wxSingleInstanceChecker();
@@ -54,6 +83,9 @@ private:
     // common part of all ctors
     void Init() { m_impl = NULL; }
 
+    // do check if another instance is running, called only if m_impl != NULL
+    bool DoIsAnotherRunning() const;
+
     // the implementation details (platform specific)
     class WXDLLIMPEXP_FWD_BASE wxSingleInstanceCheckerImpl *m_impl;
 
index 4d240abe655d4b2840b64c65d4c743e78c27c969..a7c7c0b460bf62b0f8996297a3ab1bc8e5e45795 100644 (file)
@@ -23,8 +23,7 @@
     @code
     bool MyApp::OnInit()
     {
-        const wxString name = wxString::Format("MyApp-%s", wxGetUserId().c_str());
-        m_checker = new wxSingleInstanceChecker(name);
+        m_checker = new wxSingleInstanceChecker;
         if ( m_checker-IsAnotherRunning() )
         {
             wxLogError(_("Another program instance is already running, aborting."));
     }
     @endcode
 
-    Note using wxGetUserId() to construct the name: this allows different user
-    to run the application concurrently which is usually the intended goal.
-    If you don't use the user name in the wxSingleInstanceChecker name, only
-    one user would be able to run the application at a time.
+    Note that by default wxSingleInstanceChecker::CreateDefault() is used to
+    create the checker meaning that it will be initialized differently for
+    different users and thus will allow different users to run the application
+    concurrently which is usually the required behaviour. However if only a
+    single instance of a program should be running system-wide, you need to
+    call Create() with a custom name which does @em not include wxGetUserId().
 
     This class is implemented for Win32 and Unix platforms (supporting @c fcntl()
     system call, but almost all of modern Unix systems do) only.
@@ -63,43 +64,53 @@ class wxSingleInstanceChecker
 {
 public:
     /**
-        Default ctor, use Create() after it.
+        Default constructor.
+
+        You may call Create() after using it or directly call
+        IsAnotherRunning() in which case CreateDefault() will be implicitly
+        used.
     */
     wxSingleInstanceChecker();
 
     /**
-        Like Create() but without error checking.
+        Constructor calling Create().
+
+        This constructor does exactly the same thing as Create() but doesn't
+        allow to check for errors.
     */
     wxSingleInstanceChecker(const wxString& name,
                             const wxString& path = wxEmptyString);
 
     /**
         Destructor frees the associated resources.
+
         Note that it is not virtual, this class is not meant to be used polymorphically.
     */
     ~wxSingleInstanceChecker();
 
     /**
         Initialize the object if it had been created using the default constructor.
+
         Note that you can't call Create() more than once, so calling it if the
-        @ref wxSingleInstanceChecker() "non default ctor" had been used is an error.
+        non default ctor had been used is an error.
 
         @param name
             Must be given and be as unique as possible. It is used as the
             mutex name under Win32 and the lock file name under Unix.
-            GetAppName() and wxGetUserId() are commonly used to construct
+            wxApp::GetAppName() and wxGetUserId() are commonly used to construct
             this parameter.
         @param path
             The path is optional and is ignored under Win32 and used as the
             directory to create the lock file in under Unix
             (default is wxGetHomeDir()).
 
-        @return Returns @false if initialization failed, it doesn't mean that
-                another instance is running - use  IsAnotherRunning() to check
-                for it.
+        @return
+            Returns @false if initialization failed, it doesn't mean that
+            another instance is running -- use IsAnotherRunning() to check for
+            it.
 
         @note
-            One of possible reasons while Create may fail on Unix is that the lock
+            One of possible reasons while Create() may fail on Unix is that the lock
             file used for checking already exists but was not created by the user.
             Therefore applications shouldn't treat failure of this function as fatal
             condition, because doing so would open them to the possibility of a
@@ -111,8 +122,25 @@ public:
                 const wxString& path = wxEmptyString);
 
     /**
-        Returns @true if another copy of this program is already running, @false
-        otherwise.
+        Calls Create() with default name.
+
+        This method simply calls Create() with a string composed of
+        wxApp::GetAppName() and wxGetUserId().
+
+        Because this method uses wxApp::GetAppName(), it may only be called
+        after the global application was constructed.
+
+        @since 2.9.1
+     */
+    bool CreateDefault();
+
+    /**
+        Returns @true if another copy of this program is already running and
+        @false otherwise.
+
+        Notice that if the object was created using the default constructor
+        Create() hadn't been called before this method, it will call
+        CreateDefault() automatically.
     */
     bool IsAnotherRunning() const;
 };
index 8f69ec56981c4d641936f329133bf38e07410cb3..1e5d08ef79e5210ca08b707b10c79abce8709470 100644 (file)
@@ -113,7 +113,7 @@ bool wxSingleInstanceChecker::Create(const wxString& name,
     return m_impl->Create(name);
 }
 
-bool wxSingleInstanceChecker::IsAnotherRunning() const
+bool wxSingleInstanceChecker::DoIsAnotherRunning() const
 {
     wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );
 
index f1c4b184b1ddaa4fbb591b806b5632b14ee1a143..499ad0d1a2ec3bcbdb8cd6cb73e4bfbf09cd911a 100644 (file)
@@ -117,7 +117,7 @@ bool wxSingleInstanceChecker::Create(const wxString& name,
     return m_impl->Create(name);\r
 }\r
 \r
-bool wxSingleInstanceChecker::IsAnotherRunning() const\r
+bool wxSingleInstanceChecker::DoIsAnotherRunning() const
 {\r
     wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );\r
 \r
index 43674249af60d0c3fdb10864a3dbdf7f5a9c6f2d..ce8e9e38f778562869293c38b2d300bd9e138827 100644 (file)
@@ -371,7 +371,7 @@ bool wxSingleInstanceChecker::Create(const wxString& name,
     return m_impl->Create(fullname);
 }
 
-bool wxSingleInstanceChecker::IsAnotherRunning() const
+bool wxSingleInstanceChecker::DoIsAnotherRunning() const
 {
     wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );