]> git.saurik.com Git - wxWidgets.git/commitdiff
* wxCreateDynamicObject() uses an hashtable now
authorGuilhem Lavaux <lavaux@easynet.fr>
Tue, 1 Sep 1998 17:17:05 +0000 (17:17 +0000)
committerGuilhem Lavaux <lavaux@easynet.fr>
Tue, 1 Sep 1998 17:17:05 +0000 (17:17 +0000)
* wxClassInfo::first = NULL after the hashtable is initialized
* dynlib has been simplified.
* Some fix in the serialization core and in wxObject::StoreObject()/LoadObject()
* Updates in utils/serialize/sermain.cpp

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@645 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

13 files changed:
include/wx/dynlib.h
include/wx/object.h
include/wx/wx.h
src/common/dynlib.cpp
src/common/memory.cpp
src/common/module.cpp
src/common/object.cpp
src/common/objstrm.cpp
src/common/stream.cpp
src/gtk/data.cpp
src/gtk1/data.cpp
src/msw/data.cpp
utils/serialize/sermain.cpp

index 428048ce145fa66c974318881abdef3064abff60..cebc563b7efde284154242c5aa000aac30a17f43 100644 (file)
@@ -8,53 +8,19 @@
 #include <wx/string.h>
 #include <wx/list.h>
 #include <wx/dynarray.h>
 #include <wx/string.h>
 #include <wx/list.h>
 #include <wx/dynarray.h>
-
-// ---------------------------------------------------------------------------
-// Some more info on a class
-
-typedef struct {
-  wxClassInfo *class_info;
-  wxString path;
-} wxClassLibInfo;
-
-// ---------------------------------------------------------------------------
-// Useful arrays
-
-WX_DEFINE_ARRAY(wxClassInfo *, wxArrayClassInfo);
-WX_DEFINE_ARRAY(wxClassLibInfo *, wxArrayClassLibInfo);
-
-// ---------------------------------------------------------------------------
-// wxClassLibrary
-
-class wxClassLibrary {
-protected:
-  wxArrayClassLibInfo m_list;
-public:
-  wxClassLibrary(void);
-  ~wxClassLibrary(void);
-
-  // Dynamic (un)register a (new) class in the database
-  void RegisterClass(wxClassInfo *class_info, const wxString& path);
-  void UnregisterClass(wxClassInfo *class_info);
-
-  // Fetch all infos whose name matches the string (wildcards allowed)
-  bool FetchInfos(const wxString& path, wxArrayClassLibInfo& infos);
-
-  // Create all objects whose name matches the string (wildcards allowed)
-  bool CreateObjects(const wxString& path, wxArrayClassInfo& objs);
-
-  // Create one object using the EXACT name
-  wxObject *CreateObject(const wxString& path);
-};
+#include <wx/hash.h>
 
 // ---------------------------------------------------------------------------
 // wxLibrary
 
 class wxLibrary: public wxObject {
 
 // ---------------------------------------------------------------------------
 // wxLibrary
 
 class wxLibrary: public wxObject {
-protected:
-  wxClassLibrary *m_liblist;
+ protected:
   void *m_handle;
   void *m_handle;
-public:
+  bool m_destroy;
+ public:
+  wxHashTable classTable;
+
+ public:
   wxLibrary(void *handle);
   ~wxLibrary(void);
 
   wxLibrary(void *handle);
   ~wxLibrary(void);
 
@@ -64,16 +30,21 @@ public:
   // Create the object whose classname is "name"
   wxObject *CreateObject(const wxString& name);
 
   // Create the object whose classname is "name"
   wxObject *CreateObject(const wxString& name);
 
-  wxClassLibrary *ClassLib() const;
+  // Merge the symbols with the main symbols: WARNING! the library will not
+  // be unloaded.
+  void MergeWithSystem();
+
+ protected:
+  void PrepareClasses(wxClassInfo **first);
 };
 
 // ---------------------------------------------------------------------------
 // wxLibraries
 
 class wxLibraries {
 };
 
 // ---------------------------------------------------------------------------
 // wxLibraries
 
 class wxLibraries {
-protected:
+ protected:
   wxList m_loaded;
   wxList m_loaded;
-public:
+ public:
   wxLibraries(void);
   ~wxLibraries(void);
 
   wxLibraries(void);
   ~wxLibraries(void);
 
@@ -89,7 +60,10 @@ extern wxLibraries wxTheLibraries;
 // ---------------------------------------------------------------------------
 // Interesting defines
 
 // ---------------------------------------------------------------------------
 // Interesting defines
 
-#define WXDLL_ENTRY_FUNCTION() extern "C" wxClassLibrary *GetClassList()
-#define WXDLL_EXIT_FUNCTION(param) extern "C" void FreeClassList(wxClassLibrary *param)
+#define WXDLL_ENTRY_FUNCTION() \
+extern "C" wxClassInfo **wxGetClassFirst(); \
+wxClassInfo **wxGetClassFirst() { \
+  return &wxClassInfo::first; \
+}
 
 #endif
 
 #endif
index 4b0719be5c0e81cb0a05487ba448d61d9999ba70..eef671119f213cf078602d12b1042e06e0d77259 100644 (file)
@@ -29,10 +29,12 @@ class WXDLLEXPORT wxObject;
 #endif
 
 class WXDLLEXPORT wxClassInfo;
 #endif
 
 class WXDLLEXPORT wxClassInfo;
-class WXDLLEXPORT ostream;
+class WXDLLIMPORT ostream;
 class WXDLLEXPORT wxInputStream;
 class WXDLLEXPORT wxInputStream;
-class WXDLLIMPORT wxObjectInputStream;
-class WXDLLIMPORT wxObjectOutputStream;
+class WXDLLEXPORT wxObjectInputStream;
+class WXDLLEXPORT wxObjectOutputStream;
+class WXDLLEXPORT wxHashTable;
+class WXDLLEXPORT wxObject_Serialize;
 
 /*
  * Dynamic object system declarations
 
 /*
  * Dynamic object system declarations
@@ -57,6 +59,8 @@ class WXDLLEXPORT wxClassInfo
    static wxClassInfo *first;
    wxClassInfo *next;
 
    static wxClassInfo *first;
    wxClassInfo *next;
 
+   static wxHashTable classTable;
+
    wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn);
 
    wxObject *CreateObject(void);
    wxClassInfo(char *cName, char *baseName1, char *baseName2, int sz, wxObjectConstructorFn fn);
 
    wxObject *CreateObject(void);
@@ -195,6 +199,9 @@ class WXDLLEXPORT wxObject
 
 protected:
   wxObjectRefData *m_refData;
 
 protected:
   wxObjectRefData *m_refData;
+#ifdef USE_STORABLE_CLASSES
+  wxObject_Serialize *m_serialObj;
+#endif
 };
 
 /*
 };
 
 /*
index bb68d0fe786694914e916fee05eda1fbc174fd57..31233d3dac1b49b9d31ba8fb14b3d8872e6a8c73 100644 (file)
 #include "wx/dirdlg.h"
 #include "wx/cmndata.h"
 #include "wx/intl.h"
 #include "wx/dirdlg.h"
 #include "wx/cmndata.h"
 #include "wx/intl.h"
+#ifdef USE_STORABLE_CLASSES
+#include "wx/objstrm.h"
+#include "wx/serbase.h"
+#endif
 
 #endif
     // _WX_WXH__
 
 #endif
     // _WX_WXH__
index db17f823d469a2e09f154ea9960dea2f3c6957b7..6384eb3a8babddbc8a3c09d0f60a48a717d0048c 100644 (file)
@@ -42,27 +42,22 @@ wxLibraries wxTheLibraries;
 
 wxLibrary::wxLibrary(void *handle)
 {
 
 wxLibrary::wxLibrary(void *handle)
 {
-  typedef wxClassLibrary *(*t_get_list)(void);
-  t_get_list get_list;
+  typedef wxClassInfo **(*t_get_first)(void);
+  t_get_first get_first;
 
   m_handle = handle;
 
   m_handle = handle;
+  m_destroy = TRUE;
 
 
-  get_list = (t_get_list)GetSymbol("GetClassList");
-  m_liblist = (*get_list)();
+  // Some system may use a local heap for library.
+  get_first = (t_get_first)GetSymbol("wxGetClassFirst");
+  // It is a wxWindows DLL.
+  if (get_first)
+    PrepareClasses(get_first());
 }
 
 wxLibrary::~wxLibrary()
 {
 }
 
 wxLibrary::~wxLibrary()
 {
-  if (m_handle) {
-    typedef void (*t_free_list)(wxClassLibrary *);
-    t_free_list free_list;
-
-    free_list = (t_free_list) GetSymbol("FreeClassList");
-    if (free_list != NULL)
-      free_list(m_liblist);
-    else
-      delete m_liblist;
-
+  if (m_handle && m_destroy) {
 #ifdef __UNIX__
     dlclose(m_handle);
 #endif
 #ifdef __UNIX__
     dlclose(m_handle);
 #endif
@@ -74,7 +69,36 @@ wxLibrary::~wxLibrary()
 
 wxObject *wxLibrary::CreateObject(const wxString& name)
 {
 
 wxObject *wxLibrary::CreateObject(const wxString& name)
 {
-  return m_liblist->CreateObject(name);
+  wxClassInfo *info = (wxClassInfo *)classTable.Get(name);
+
+  if (!info)
+    return NULL;
+
+  return info->CreateObject();
+}
+
+void wxLibrary::PrepareClasses(wxClassInfo **first)
+{
+  // Index all class infos by their class name
+  wxClassInfo *info = *first;
+  while (info)
+  {
+    if (info->className)
+      classTable.Put(info->className, (wxObject *)info);
+    info = info->next;
+  }
+
+  // Set base pointers for each wxClassInfo
+  info = *first;
+  while (info)
+  {
+    if (info->GetBaseClassName1())
+      info->baseInfo1 = (wxClassInfo *)classTable.Get(info->GetBaseClassName1());
+    if (info->GetBaseClassName2())
+      info->baseInfo2 = (wxClassInfo *)classTable.Get(info->GetBaseClassName2());
+    info = info->next;
+  }
+  *first = NULL;
 }
 
 void *wxLibrary::GetSymbol(const wxString& symbname)
 }
 
 void *wxLibrary::GetSymbol(const wxString& symbname)
@@ -117,7 +141,7 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name)
   if ( (node = m_loaded.Find(name.GetData())) )
     return ((wxLibrary *)node->Data());
 
   if ( (node = m_loaded.Find(name.GetData())) )
     return ((wxLibrary *)node->Data());
 
-#ifdef __UNIX__
+#if defined(__UNIX__)
   lib_name.Prepend("./lib");
   lib_name += ".so";
 
   lib_name.Prepend("./lib");
   lib_name += ".so";
 
@@ -127,14 +151,16 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name)
 
   if (!handle)
     return NULL;
 
   if (!handle)
     return NULL;
-#endif
-#ifdef __WINDOWS__
+#elif defined(__WINDOWS__)
   lib_name += ".dll";
 
   HMODULE handle = LoadLibrary(lib_name);
   if (!handle)
     return NULL;
   lib_name += ".dll";
 
   HMODULE handle = LoadLibrary(lib_name);
   if (!handle)
     return NULL;
+#else
+  return NULL;
 #endif
 #endif
+
   lib = new wxLibrary((void *)handle);
 
   m_loaded.Append(name.GetData(), lib);
   lib = new wxLibrary((void *)handle);
 
   m_loaded.Append(name.GetData(), lib);
@@ -155,90 +181,3 @@ wxObject *wxLibraries::CreateObject(const wxString& path)
   }
   return NULL;
 }
   }
   return NULL;
 }
-
-// ---------------------------------------------------------------------------
-// wxClassLibrary (this class is used to access the internal class)
-// ---------------------------------------------------------------------------
-
-wxClassLibrary::wxClassLibrary(void)
-{
-}
-
-wxClassLibrary::~wxClassLibrary(void)
-{
-  size_t i;
-
-  for (i=0;i<m_list.Count();i++)
-    delete (m_list[i]);
-}
-
-void wxClassLibrary::RegisterClass(wxClassInfo *class_info,
-                                   const wxString& path)
-{
-  wxClassLibInfo *info = new wxClassLibInfo;
-
-  info->class_info = class_info;
-  info->path = path;
-  m_list.Add(info);
-}
-
-void wxClassLibrary::UnregisterClass(wxClassInfo *class_info)
-{
-  size_t i = 0;
-
-  while (i < m_list.Count()) {
-    if (m_list[i]->class_info == class_info) {
-      delete (m_list[i]);
-      m_list.Remove(i);
-      return;
-    }
-    i++;
-  }
-}
-
-bool wxClassLibrary::CreateObjects(const wxString& path,
-                                   wxArrayClassInfo& objs)
-{
-  wxClassLibInfo *info;
-  size_t i = 0;
-
-  while (i < m_list.Count()) {
-    info = m_list[i];
-    if (wxMatchWild(path, info->path))
-      objs.Add(info->class_info);
-    i++;
-  }
-  return (i > 0);
-}
-
-bool wxClassLibrary::FetchInfos(const wxString& path,
-                                wxArrayClassLibInfo& infos)
-{
-  wxClassLibInfo *info;
-  size_t i = 0;
-
-  while (i < m_list.Count()) {
-    info = m_list[i];
-    if (wxMatchWild(path, info->path)) {
-      wxClassLibInfo *inf = new wxClassLibInfo;
-      *inf = *info;
-      infos.Add(inf);
-    }
-    i++;
-  }
-  return (i > 0);
-}
-
-wxObject *wxClassLibrary::CreateObject(const wxString& path)
-{
-  wxClassLibInfo *info;
-  size_t i = 0;
-
-  while (i < m_list.Count()) {
-    info = m_list[i];
-    if (wxMatchWild(path, info->path))
-      return info->class_info->CreateObject();
-    i++;
-  }
-  return NULL;
-}
index f219387d429228cacbcbe216a752354cbf5d6027..a3dbce75165a34f77a74b07efdebfbe4d4bac270 100644 (file)
@@ -785,9 +785,14 @@ bool wxDebugContext::PrintClasses(void)
   }
 
   int n = 0;
   }
 
   int n = 0;
-  wxClassInfo *info = wxClassInfo::first;
-  while (info)
+  wxNode *node;
+  wxClassInfo *info;
+
+  wxClassInfo::classTable.BeginFind();
+  node = wxClassInfo::classTable.Next();
+  while (node)
   {
   {
+    info = (wxClassInfo *)node->Data();
     if (info->GetClassName())
     {
       wxTrace("%s ", info->GetClassName());
     if (info->GetClassName())
     {
       wxTrace("%s ", info->GetClassName());
@@ -801,7 +806,7 @@ bool wxDebugContext::PrintClasses(void)
       else
         wxTrace("\n");
     }
       else
         wxTrace("\n");
     }
-    info = info->next;
+    node = node->Next();
     n ++;
   }
   wxTrace("\nThere are %d classes derived from wxObject.\n", n);
     n ++;
   }
   wxTrace("\nThere are %d classes derived from wxObject.\n", n);
index bd2b82d782331cd235936b87fcc8902b53def181..57c8a312cce40270e7a4977fc9a54fe8ca3738b9 100644 (file)
@@ -21,6 +21,7 @@
 #endif
 
 #include "wx/module.h"
 #endif
 
 #include "wx/module.h"
+#include "wx/hash.h"
 
 IMPLEMENT_CLASS(wxModule, wxObject)
 
 
 IMPLEMENT_CLASS(wxModule, wxObject)
 
@@ -35,16 +36,21 @@ void wxModule::RegisterModule(wxModule* module)
 // and register them.
 bool wxModule::RegisterModules(void)
 {
 // and register them.
 bool wxModule::RegisterModules(void)
 {
-    wxClassInfo* classInfo = wxClassInfo::first;
-    while (classInfo)
+    wxNode *node;
+    wxClassInfo* classInfo;
+
+    wxClassInfo::classTable.BeginFind();
+    node = wxClassInfo::classTable.Next();
+    while (node)
     {
     {
+        classInfo = (wxClassInfo *)node->Data();
         if ((classInfo != (& (wxModule::classwxModule))) &&
             classInfo->IsKindOf(CLASSINFO(wxModule)))
         {
             wxModule* module = (wxModule*) classInfo->CreateObject();
             RegisterModule(module);
         }
         if ((classInfo != (& (wxModule::classwxModule))) &&
             classInfo->IsKindOf(CLASSINFO(wxModule)))
         {
             wxModule* module = (wxModule*) classInfo->CreateObject();
             RegisterModule(module);
         }
-        classInfo = classInfo->next;
+        node = wxClassInfo::classTable.Next();
     }
     return TRUE;
 }
     }
     return TRUE;
 }
index 6f378e681076ef0717b1c55b59251776baf9b477..f268814189bf561bc84476c164430e36d2ce7d7a 100644 (file)
 
 #ifndef WX_PRECOMP
 #include "wx/hash.h"
 
 #ifndef WX_PRECOMP
 #include "wx/hash.h"
+#ifdef USE_STORABLE_CLASSES
 #include "wx/objstrm.h"
 #include "wx/objstrm.h"
+#include "wx/serbase.h"
+#endif
 #endif
 
 #include <string.h>
 #endif
 
 #include <string.h>
@@ -40,6 +43,7 @@
 #if !USE_SHARED_LIBRARY
 wxClassInfo wxObject::classwxObject((char *) "wxObject", (char *) NULL, (char *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL);
 wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
 #if !USE_SHARED_LIBRARY
 wxClassInfo wxObject::classwxObject((char *) "wxObject", (char *) NULL, (char *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL);
 wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
+wxHashTable wxClassInfo::classTable(wxKEY_STRING);
 #endif
 
 /*
 #endif
 
 /*
@@ -49,11 +53,18 @@ wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
 wxObject::wxObject(void)
 {
   m_refData = (wxObjectRefData *) NULL;
 wxObject::wxObject(void)
 {
   m_refData = (wxObjectRefData *) NULL;
+#ifdef USE_STORABLE_CLASSES
+  m_serialObj = (wxObject_Serialize *)NULL;
+#endif
 }
 
 wxObject::~wxObject(void)
 {
        UnRef();
 }
 
 wxObject::~wxObject(void)
 {
        UnRef();
+#ifdef USE_STORABLE_CLASSES
+       if (m_serialObj)
+         delete m_serialObj;
+#endif
 }
 
 /*
 }
 
 /*
@@ -184,14 +195,12 @@ bool wxClassInfo::IsKindOf(wxClassInfo *info)
 // Set pointers to base class(es) to speed up IsKindOf
 void wxClassInfo::InitializeClasses(void)
 {
 // Set pointers to base class(es) to speed up IsKindOf
 void wxClassInfo::InitializeClasses(void)
 {
-  wxHashTable table(wxKEY_STRING);
-
   // Index all class infos by their class name
   wxClassInfo *info = first;
   while (info)
   {
     if (info->className)
   // Index all class infos by their class name
   wxClassInfo *info = first;
   while (info)
   {
     if (info->className)
-      table.Put(info->className, (wxObject *)info);
+      classTable.Put(info->className, (wxObject *)info);
     info = info->next;
   }
 
     info = info->next;
   }
 
@@ -200,23 +209,23 @@ void wxClassInfo::InitializeClasses(void)
   while (info)
   {
     if (info->GetBaseClassName1())
   while (info)
   {
     if (info->GetBaseClassName1())
-      info->baseInfo1 = (wxClassInfo *)table.Get(info->GetBaseClassName1());
+      info->baseInfo1 = (wxClassInfo *)classTable.Get(info->GetBaseClassName1());
     if (info->GetBaseClassName2())
     if (info->GetBaseClassName2())
-      info->baseInfo2 = (wxClassInfo *)table.Get(info->GetBaseClassName2());
+      info->baseInfo2 = (wxClassInfo *)classTable.Get(info->GetBaseClassName2());
     info = info->next;
   }
     info = info->next;
   }
+  first = NULL;
 }
 
 wxObject *wxCreateDynamicObject(char *name)
 {
 }
 
 wxObject *wxCreateDynamicObject(char *name)
 {
-  wxClassInfo *info = wxClassInfo::first;
-  while (info)
-  {
-    if (info->className && strcmp(info->className, name) == 0)
-      return info->CreateObject();
-    info = info->next;
-  }
-  return (wxObject *) NULL;
+  wxClassInfo *info;
+
+  info = (wxClassInfo *)wxClassInfo::classTable.Get(name);
+  if (!info)
+    return (wxObject *)NULL;
+
+  return info->CreateObject();
 }
 
 #ifdef USE_STORABLE_CLASSES
 }
 
 #ifdef USE_STORABLE_CLASSES
@@ -235,50 +244,50 @@ void wxObject::StoreObject( wxObjectOutputStream& stream )
 {
   wxString obj_name = wxString(GetClassInfo()->GetClassName()) + "_Serialize";
   wxLibrary *lib = wxTheLibraries.LoadLibrary("wxserial");
 {
   wxString obj_name = wxString(GetClassInfo()->GetClassName()) + "_Serialize";
   wxLibrary *lib = wxTheLibraries.LoadLibrary("wxserial");
-  WXSERIAL(wxObject) *serial;
 
   if (!lib) {
     wxMessageBox("Can't load wxSerial dynamic library.", "Alert !");
     return;
   }
 
   if (!lib) {
     wxMessageBox("Can't load wxSerial dynamic library.", "Alert !");
     return;
   }
-  serial = (WXSERIAL(wxObject) *)lib->CreateObject( obj_name );
+  if (!m_serialObj) {
+    m_serialObj = (WXSERIAL(wxObject) *)lib->CreateObject( obj_name );
 
 
-  if (!serial) {
-    wxString message;
+    if (!m_serialObj) {
+      wxString message;
 
 
-    message.Printf("Can't find the serialization object (%s) for the object %s",
-                   WXSTRINGCAST obj_name,                                                          WXSTRINGCAST GetClassInfo()->GetClassName());
-    wxMessageBox(message, "Alert !");
-    return;
+      message.Printf("Can't find the serialization object (%s) for the object %s",
+                     WXSTRINGCAST obj_name,
+                     WXSTRINGCAST GetClassInfo()->GetClassName());
+      wxMessageBox(message, "Alert !");
+      return;
+    }
+    m_serialObj->SetObject(this);
   }
 
   }
 
-  serial->SetObject(this);
-  serial->StoreObject(stream);
-
-  delete serial;
+  m_serialObj->StoreObject(stream);
 }
 
 void wxObject::LoadObject( wxObjectInputStream& stream )
 {
   wxString obj_name = wxString(GetClassInfo()->GetClassName()) + "_Serialize";
   wxLibrary *lib = wxTheLibraries.LoadLibrary("wxserial");
 }
 
 void wxObject::LoadObject( wxObjectInputStream& stream )
 {
   wxString obj_name = wxString(GetClassInfo()->GetClassName()) + "_Serialize";
   wxLibrary *lib = wxTheLibraries.LoadLibrary("wxserial");
-  WXSERIAL(wxObject) *serial =
-                           (WXSERIAL(wxObject) *)lib->CreateObject( obj_name );
 
 
-  if (!serial) {
-    wxString message;
+  if (!m_serialObj) {
+    m_serialObj = (WXSERIAL(wxObject) *)lib->CreateObject( obj_name );
 
 
-    message.Printf("Can't find the serialization object (%s) for the object %s",
-                   WXSTRINGCAST obj_name,
-                   WXSTRINGCAST GetClassInfo()->GetClassName());
-    wxMessageBox(message, "Alert !");
-    return;
-  }
+    if (!m_serialObj) {
+      wxString message;
 
 
-  serial->SetObject(this);
-  serial->LoadObject(stream);
+      message.Printf("Can't find the serialization object (%s) for the object %s",
+                     WXSTRINGCAST obj_name,
+                     WXSTRINGCAST GetClassInfo()->GetClassName());
+      wxMessageBox(message, "Alert !");
+      return;
+    }
+    m_serialObj->SetObject(this);
+  }
 
 
-  delete serial;
+  m_serialObj->LoadObject(stream);
 }
 
 #endif
 }
 
 #endif
index 07fa7f9a19b7e8415d7da1ff7b3fe75316ef449e..2bb34f1c593c81784950bcd39e8191243972d0ff 100644 (file)
@@ -49,13 +49,16 @@ void wxObjectOutputStream::WriteObjectDef(wxObjectStreamInfo& info)
   if (info.duplicate) {
     data_s.WriteString(TAG_DUPLICATE_OBJECT);
     data_s.WriteString(GetObjectName(info.object));
   if (info.duplicate) {
     data_s.WriteString(TAG_DUPLICATE_OBJECT);
     data_s.WriteString(GetObjectName(info.object));
+    printf("info.object (dup %s)\n", info.object->GetClassInfo()->GetClassName());
     return;
   }
 
   if (info.object) {
     data_s.WriteString(info.object->GetClassInfo()->GetClassName());
     return;
   }
 
   if (info.object) {
     data_s.WriteString(info.object->GetClassInfo()->GetClassName());
+    printf("info.object (%s)\n", info.object->GetClassInfo()->GetClassName());
   } else {
     data_s.WriteString(TAG_EMPTY_OBJECT);
   } else {
     data_s.WriteString(TAG_EMPTY_OBJECT);
+    printf("info.object (NULL)\n");
     return;
   }
 
     return;
   }
 
@@ -230,13 +233,13 @@ bool wxObjectInputStream::ReadObjectDef(wxObjectStreamInfo *info)
 
   class_name = data_s.ReadString();
   info->children_removed = 0;
 
   class_name = data_s.ReadString();
   info->children_removed = 0;
+  info->n_children = 0;
 
   if (class_name == TAG_EMPTY_OBJECT)
     info->object = (wxObject *) NULL;
   else if (class_name == TAG_DUPLICATE_OBJECT) {
     info->object_name = data_s.ReadString();
     info->object = SolveName(info->object_name);
 
   if (class_name == TAG_EMPTY_OBJECT)
     info->object = (wxObject *) NULL;
   else if (class_name == TAG_DUPLICATE_OBJECT) {
     info->object_name = data_s.ReadString();
     info->object = SolveName(info->object_name);
-    info->n_children = 0;
   } else {
     info->object_name = data_s.ReadString();
     info->object = wxCreateDynamicObject( WXSTRINGCAST class_name);
   } else {
     info->object_name = data_s.ReadString();
     info->object = wxCreateDynamicObject( WXSTRINGCAST class_name);
index dda5f6446bee5ba0e264eb2fb20d85bd4655cdf6..f25f6381fb7bc13c26f23af4bf3bf796b6d9e6b9 100644 (file)
@@ -52,6 +52,8 @@ void wxStreamBuffer::WriteBack(char c)
 
   // Assume that if we write "back" we have read a few bytes: so we have some
   // space.
 
   // Assume that if we write "back" we have read a few bytes: so we have some
   // space.
+  if (m_buffer_pos == m_buffer_start)
+    return;
 
   m_buffer_pos--;
   *m_buffer_pos = c;
 
   m_buffer_pos--;
   *m_buffer_pos = c;
@@ -212,6 +214,7 @@ wxInputStream::wxInputStream()
   m_i_destroybuf = TRUE;
   m_i_streambuf = new wxStreamBuffer(*this);
   m_eof = FALSE;
   m_i_destroybuf = TRUE;
   m_i_streambuf = new wxStreamBuffer(*this);
   m_eof = FALSE;
+  m_lastread = 0;
 }
 
 wxInputStream::wxInputStream(wxStreamBuffer *buffer)
 }
 
 wxInputStream::wxInputStream(wxStreamBuffer *buffer)
@@ -219,6 +222,7 @@ wxInputStream::wxInputStream(wxStreamBuffer *buffer)
   m_i_destroybuf = FALSE;
   m_i_streambuf = buffer;
   m_eof = FALSE;
   m_i_destroybuf = FALSE;
   m_i_streambuf = buffer;
   m_eof = FALSE;
+  m_lastread = 0;
 }
 
 wxInputStream::~wxInputStream()
 }
 
 wxInputStream::~wxInputStream()
@@ -416,12 +420,16 @@ wxOutputStream::wxOutputStream()
 {
   m_o_destroybuf = TRUE;
   m_o_streambuf = new wxStreamBuffer(*this);
 {
   m_o_destroybuf = TRUE;
   m_o_streambuf = new wxStreamBuffer(*this);
+  m_bad = FALSE;
+  m_lastwrite = 0;
 }
 
 wxOutputStream::wxOutputStream(wxStreamBuffer *buffer)
 {
   m_o_destroybuf = FALSE;
   m_o_streambuf = buffer;
 }
 
 wxOutputStream::wxOutputStream(wxStreamBuffer *buffer)
 {
   m_o_destroybuf = FALSE;
   m_o_streambuf = buffer;
+  m_bad = FALSE;
+  m_lastwrite = 0;
 }
 
 wxOutputStream::~wxOutputStream()
 }
 
 wxOutputStream::~wxOutputStream()
index f436ac031fec652a3a435371c9b468d704fdb34b..9812d570c746074224f01d92ae58569234f38df6 100644 (file)
@@ -172,6 +172,7 @@ const char *wxUserResourceStr = "TEXT";
 // Hand-coded IMPLEMENT... macro for wxObject (define static data)
 wxClassInfo wxObject::classwxObject((char *) "wxObject", (char *) NULL, (char *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL);
 wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
 // Hand-coded IMPLEMENT... macro for wxObject (define static data)
 wxClassInfo wxObject::classwxObject((char *) "wxObject", (char *) NULL, (char *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL);
 wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
+wxHashTable wxClassInfo::classTable(wxKEY_STRING);
 
 #include "wx/button.h"
 #include "wx/bmpbuttn.h"
 
 #include "wx/button.h"
 #include "wx/bmpbuttn.h"
index f436ac031fec652a3a435371c9b468d704fdb34b..9812d570c746074224f01d92ae58569234f38df6 100644 (file)
@@ -172,6 +172,7 @@ const char *wxUserResourceStr = "TEXT";
 // Hand-coded IMPLEMENT... macro for wxObject (define static data)
 wxClassInfo wxObject::classwxObject((char *) "wxObject", (char *) NULL, (char *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL);
 wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
 // Hand-coded IMPLEMENT... macro for wxObject (define static data)
 wxClassInfo wxObject::classwxObject((char *) "wxObject", (char *) NULL, (char *) NULL, (int ) sizeof(wxObject), (wxObjectConstructorFn) NULL);
 wxClassInfo *wxClassInfo::first = (wxClassInfo *) NULL;
+wxHashTable wxClassInfo::classTable(wxKEY_STRING);
 
 #include "wx/button.h"
 #include "wx/bmpbuttn.h"
 
 #include "wx/button.h"
 #include "wx/bmpbuttn.h"
index ea8b75ba3d933aaf8dc87658fc487fdffb6b174f..0b9cb427f98b173ab42a985d5a8dd29e7c7ad14a 100644 (file)
@@ -167,6 +167,7 @@ wxPrintPaperDatabase* wxThePrintPaperDatabase = NULL;
 // Hand-coded IMPLEMENT... macro for wxObject (define static data)
 wxClassInfo wxObject::classwxObject("wxObject", NULL, NULL, sizeof(wxObject), NULL);
 wxClassInfo *wxClassInfo::first = NULL;
 // Hand-coded IMPLEMENT... macro for wxObject (define static data)
 wxClassInfo wxObject::classwxObject("wxObject", NULL, NULL, sizeof(wxObject), NULL);
 wxClassInfo *wxClassInfo::first = NULL;
+wxClassInfo wxClassInfo::classTable(wxKEY_STRING);
 
 #include "wx/button.h"
 #include "wx/bmpbuttn.h"
 
 #include "wx/button.h"
 #include "wx/bmpbuttn.h"
index e0c63aa0b4e59c372cae4a198061c62e14281feb..2983a8c495e0757c8a61ceeee48978aa4d663e63 100644 (file)
 
 IMPLEMENT_DYNAMIC_CLASS(wxObject_Serialize, wxObject)
 
 
 IMPLEMENT_DYNAMIC_CLASS(wxObject_Serialize, wxObject)
 
-#define REGISTER_CLASS(classname) \
-lib->RegisterClass(CLASSINFO(classname##_Serialize), #classname "_Serialize")
-
 WXDLL_ENTRY_FUNCTION()
 WXDLL_ENTRY_FUNCTION()
-{
-  wxClassLibrary *lib = new wxClassLibrary;
-
-  REGISTER_CLASS(wxList);
-
-  REGISTER_CLASS(wxWindow);
-  REGISTER_CLASS(wxIndividualLayoutConstraint);
-  REGISTER_CLASS(wxLayoutConstraints);
-  REGISTER_CLASS(wxFrame);
-  REGISTER_CLASS(wxPanel);
-  REGISTER_CLASS(wxDialog);
-  REGISTER_CLASS(wxMenu);
-  REGISTER_CLASS(wxMenuItem);
-  REGISTER_CLASS(wxMenuBar);
-  REGISTER_CLASS(wxMDIParentFrame);
-  REGISTER_CLASS(wxMDIChildFrame);
-  REGISTER_CLASS(wxMDIClientWindow);
-
-  REGISTER_CLASS(wxGDIObject);
-  REGISTER_CLASS(wxBitmap);
-  REGISTER_CLASS(wxRegion);
-  REGISTER_CLASS(wxColour);
-  REGISTER_CLASS(wxFont);
-  REGISTER_CLASS(wxPen);
-  REGISTER_CLASS(wxBrush);
-  REGISTER_CLASS(wxImageList);
-  REGISTER_CLASS(wxPenList);
-  REGISTER_CLASS(wxBrushList);
-  REGISTER_CLASS(wxFontList);
-  REGISTER_CLASS(wxColourDatabase);
-  REGISTER_CLASS(wxBitmapList);
-  REGISTER_CLASS(wxImageList);
-
-  REGISTER_CLASS(wxControl);
-  REGISTER_CLASS(wxSlider);
-  REGISTER_CLASS(wxCheckBox);
-  REGISTER_CLASS(wxChoice);
-  REGISTER_CLASS(wxGauge);
-  REGISTER_CLASS(wxListBox);
-  REGISTER_CLASS(wxButton);
-  REGISTER_CLASS(wxStaticText);
-  REGISTER_CLASS(wxStaticBox);
-  REGISTER_CLASS(wxRadioBox);
-  REGISTER_CLASS(wxComboBox);
-  REGISTER_CLASS(wxNotebook);
-
-  REGISTER_CLASS(wxSplitterWindow);
-  REGISTER_CLASS(wxGrid);
-  REGISTER_CLASS(wxGridCell);
-
-  return lib;
-}
-
-WXDLL_EXIT_FUNCTION(lib)
-{
-  delete lib;
-}