]> git.saurik.com Git - wxWidgets.git/commitdiff
added version checking to the renderers
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 10 Aug 2003 15:51:30 +0000 (15:51 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 10 Aug 2003 15:51:30 +0000 (15:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22736 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/renderer.h
samples/render/renddll.cpp
samples/render/render.dsw
src/common/rendcmn.cpp
src/generic/renderg.cpp

index ba5cb2611a17b2c0dc68cbe79a0048c4d6980d9b..e343989a2a137aa154bbcc4e172321a742fde012 100644 (file)
@@ -85,6 +85,37 @@ struct WXDLLEXPORT wxSplitterRenderParams
     const bool isHotSensitive;
 };
 
+// wxRendererNative interface version
+struct WXDLLEXPORT wxRendererVersion
+{
+    wxRendererVersion(int version_, int age_) : version(version_), age(age_) { }
+
+    // default copy ctor, assignment operator and dtor are ok
+
+    // the current version and age of wxRendererNative interface: different
+    // versions are incompatible (in both ways) while the ages inside the same
+    // version are upwards compatible, i.e. the version of the renderer must
+    // match the version of the main program exactly while the age may be
+    // highergreater or equal to it
+    //
+    // NB: don't forget to increment age after adding any new virtual function!
+    enum
+    {
+        Current_Version = 1,
+        Current_Age = 5
+    };
+
+
+    // check if the given version is compatible with the current one
+    static bool IsCompatible(const wxRendererVersion& ver)
+    {
+        return ver.version == Current_Version && ver.age >= Current_Age;
+    }
+
+    const int version;
+    const int age;
+};
+
 // ----------------------------------------------------------------------------
 // wxRendererNative: abstracts drawing methods needed by the native controls
 // ----------------------------------------------------------------------------
@@ -92,8 +123,6 @@ struct WXDLLEXPORT wxSplitterRenderParams
 class WXDLLEXPORT wxRendererNative
 {
 public:
-    virtual ~wxRendererNative() { } // stop GCC warning
-
     // drawing functions
     // -----------------
 
@@ -160,6 +189,18 @@ public:
     //
     // return the previous renderer used with Set() or NULL if none
     static wxRendererNative *Set(wxRendererNative *renderer);
+
+
+    // miscellaneous stuff
+    // -------------------
+
+    // this function is used for version checking: Load() refuses to load any
+    // DLLs implementing an older or incompatible version; it should be
+    // implemented simply by returning wxRendererVersion::Current_XXX values
+    virtual wxRendererVersion GetVersion() const = 0;
+
+    // virtual dtor for any base class
+    virtual ~wxRendererNative();
 };
 
 // ----------------------------------------------------------------------------
@@ -207,6 +248,9 @@ public:
     virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
         { return m_rendererNative.GetSplitterParams(win); }
 
+    virtual wxRendererVersion GetVersion() const
+        { return m_rendererNative.GetVersion(); }
+
 protected:
     wxRendererNative& m_rendererNative;
 
index 3892058c6c5a1fc987933cf4c3027231247adcf3..b0dbd69400d924314e1104db02fce3c385a7a772 100644 (file)
@@ -70,6 +70,12 @@ public:
         return wxSplitterRenderParams(0, 0, 0);
     }
 
+    virtual wxRendererVersion GetVersion() const
+    {
+        return wxRendererVersion(wxRendererVersion::Current_Version,
+                                 wxRendererVersion::Current_Age);
+    }
+
 #if 0 // just for debugging
     MyDllRenderer()
     {
index 8d05809f1c9c2395d37ae469d0c5aa649dd15c67..83957d362735469ec3da28d5b0384b5e7d682639 100644 (file)
@@ -2,7 +2,8 @@ Microsoft Developer Studio Workspace File, Format Version 6.00
 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
 
 ###############################################################################
-Project: "renddll"=render_renddll.dsp - Package Owner=<4>
+
+Project: "basedll"=..\..\build\msw\wx_basedll.dsp - Package Owner=<4>
 
 Package=<5>
 {{{
@@ -14,7 +15,7 @@ Package=<4>
 
 ###############################################################################
 
-Project: "render"=render_render.dsp - Package Owner=<4>
+Project: "coredll"=..\..\build\msw\wx_coredll.dsp - Package Owner=<4>
 
 Package=<5>
 {{{
@@ -26,3 +27,39 @@ Package=<4>
 
 ###############################################################################
 
+Project: "renddll"=.\render_renddll.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "render"=.\render_render.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
index 77bfdde5168306426ef8841c958706716cfcfc7c..b97c769e7fc614e3008d084552ab0fb3e5b61686 100644 (file)
@@ -83,6 +83,9 @@ private:
 
     bool m_initialized;
 
+    // just to suppress a gcc warning
+    friend class wxRendererPtrDummyFriend;
+
     DECLARE_NO_COPY_CLASS(wxRendererPtr)
 };
 
@@ -123,6 +126,11 @@ private:
 // wxRendererNative implementation
 // ============================================================================
 
+wxRendererNative::~wxRendererNative()
+{
+    // empty but necessary
+}
+
 // ----------------------------------------------------------------------------
 // Managing the global renderer
 // ----------------------------------------------------------------------------
@@ -171,10 +179,24 @@ wxRendererNative *wxRendererNative::Load(const wxString& name)
     if ( !pfnwxCreateRenderer )
         return NULL;
 
+    // create a renderer object
     wxRendererNative *renderer = (*pfnwxCreateRenderer)();
     if ( !renderer )
         return NULL;
 
+    // check that its version is compatible with ours
+    wxRendererVersion ver = renderer->GetVersion();
+    if ( !wxRendererVersion::IsCompatible(ver) )
+    {
+        wxLogError(_("Renderer \"%s\" has incompatible version %d.%d and couldn't be loaded."),
+                   name.c_str(), ver.version, ver.age);
+        delete renderer;
+
+        return NULL;
+    }
+
+    // finally wrap the renderer in an object which will delete it and unload
+    // the library when it is deleted and return it to the caller
     return new wxRendererFromDynLib(dll, renderer);
 }
 
index 9e66312b2d1fe79d1a3c06e319720d428ad3650b..9f409c3e9898d2273142869d6a148b83d8547b2a 100644 (file)
@@ -71,6 +71,13 @@ public:
 
     virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
 
+    virtual wxRendererVersion GetVersion() const
+    {
+        return wxRendererVersion(wxRendererVersion::Current_Version,
+                                 wxRendererVersion::Current_Age);
+    }
+
+
     // Cleanup by deleting standard renderer
     static void Cleanup();