added version checking to the renderers
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22736 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
70a2162770
commit
04857cb707
@ -85,6 +85,37 @@ struct WXDLLEXPORT wxSplitterRenderParams
|
|||||||
const bool isHotSensitive;
|
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
|
// wxRendererNative: abstracts drawing methods needed by the native controls
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -92,8 +123,6 @@ struct WXDLLEXPORT wxSplitterRenderParams
|
|||||||
class WXDLLEXPORT wxRendererNative
|
class WXDLLEXPORT wxRendererNative
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~wxRendererNative() { } // stop GCC warning
|
|
||||||
|
|
||||||
// drawing functions
|
// drawing functions
|
||||||
// -----------------
|
// -----------------
|
||||||
|
|
||||||
@ -160,6 +189,18 @@ public:
|
|||||||
//
|
//
|
||||||
// return the previous renderer used with Set() or NULL if none
|
// return the previous renderer used with Set() or NULL if none
|
||||||
static wxRendererNative *Set(wxRendererNative *renderer);
|
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)
|
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
|
||||||
{ return m_rendererNative.GetSplitterParams(win); }
|
{ return m_rendererNative.GetSplitterParams(win); }
|
||||||
|
|
||||||
|
virtual wxRendererVersion GetVersion() const
|
||||||
|
{ return m_rendererNative.GetVersion(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxRendererNative& m_rendererNative;
|
wxRendererNative& m_rendererNative;
|
||||||
|
|
||||||
|
@ -70,6 +70,12 @@ public:
|
|||||||
return wxSplitterRenderParams(0, 0, 0);
|
return wxSplitterRenderParams(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual wxRendererVersion GetVersion() const
|
||||||
|
{
|
||||||
|
return wxRendererVersion(wxRendererVersion::Current_Version,
|
||||||
|
wxRendererVersion::Current_Age);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0 // just for debugging
|
#if 0 // just for debugging
|
||||||
MyDllRenderer()
|
MyDllRenderer()
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,8 @@ Microsoft Developer Studio Workspace File, Format Version 6.00
|
|||||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
# 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>
|
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>
|
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>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
@ -83,6 +83,9 @@ private:
|
|||||||
|
|
||||||
bool m_initialized;
|
bool m_initialized;
|
||||||
|
|
||||||
|
// just to suppress a gcc warning
|
||||||
|
friend class wxRendererPtrDummyFriend;
|
||||||
|
|
||||||
DECLARE_NO_COPY_CLASS(wxRendererPtr)
|
DECLARE_NO_COPY_CLASS(wxRendererPtr)
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -123,6 +126,11 @@ private:
|
|||||||
// wxRendererNative implementation
|
// wxRendererNative implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
|
wxRendererNative::~wxRendererNative()
|
||||||
|
{
|
||||||
|
// empty but necessary
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Managing the global renderer
|
// Managing the global renderer
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -171,10 +179,24 @@ wxRendererNative *wxRendererNative::Load(const wxString& name)
|
|||||||
if ( !pfnwxCreateRenderer )
|
if ( !pfnwxCreateRenderer )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
// create a renderer object
|
||||||
wxRendererNative *renderer = (*pfnwxCreateRenderer)();
|
wxRendererNative *renderer = (*pfnwxCreateRenderer)();
|
||||||
if ( !renderer )
|
if ( !renderer )
|
||||||
return NULL;
|
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);
|
return new wxRendererFromDynLib(dll, renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,6 +71,13 @@ public:
|
|||||||
|
|
||||||
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
|
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
|
||||||
|
|
||||||
|
virtual wxRendererVersion GetVersion() const
|
||||||
|
{
|
||||||
|
return wxRendererVersion(wxRendererVersion::Current_Version,
|
||||||
|
wxRendererVersion::Current_Age);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Cleanup by deleting standard renderer
|
// Cleanup by deleting standard renderer
|
||||||
static void Cleanup();
|
static void Cleanup();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user