From 04857cb707be4de8083e599fc2e1967c77eb7f5e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 10 Aug 2003 15:51:30 +0000 Subject: [PATCH] added version checking to the renderers git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22736 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/renderer.h | 48 ++++++++++++++++++++++++++++++++++++-- samples/render/renddll.cpp | 6 +++++ samples/render/render.dsw | 41 ++++++++++++++++++++++++++++++-- src/common/rendcmn.cpp | 22 +++++++++++++++++ src/generic/renderg.cpp | 7 ++++++ 5 files changed, 120 insertions(+), 4 deletions(-) diff --git a/include/wx/renderer.h b/include/wx/renderer.h index ba5cb2611a..e343989a2a 100644 --- a/include/wx/renderer.h +++ b/include/wx/renderer.h @@ -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; diff --git a/samples/render/renddll.cpp b/samples/render/renddll.cpp index 3892058c6c..b0dbd69400 100644 --- a/samples/render/renddll.cpp +++ b/samples/render/renddll.cpp @@ -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() { diff --git a/samples/render/render.dsw b/samples/render/render.dsw index 8d05809f1c..83957d3627 100644 --- a/samples/render/render.dsw +++ b/samples/render/render.dsw @@ -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> +{{{ +}}} + +############################################################################### + diff --git a/src/common/rendcmn.cpp b/src/common/rendcmn.cpp index 77bfdde516..b97c769e7f 100644 --- a/src/common/rendcmn.cpp +++ b/src/common/rendcmn.cpp @@ -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); } diff --git a/src/generic/renderg.cpp b/src/generic/renderg.cpp index 9e66312b2d..9f409c3e98 100644 --- a/src/generic/renderg.cpp +++ b/src/generic/renderg.cpp @@ -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(); -- 2.45.2