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;
|
||||
};
|
||||
|
||||
// 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;
|
||||
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user