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:
Vadim Zeitlin 2003-08-10 15:51:30 +00:00
parent 70a2162770
commit 04857cb707
5 changed files with 120 additions and 4 deletions

View 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;

View 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()
{

View 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>
{{{
}}}
###############################################################################

View 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);
}

View 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();