+ wxDateTime value;
+ if (!Convert(& value))
+ {
+ wxFAIL_MSG(wxT("Could not convert to a datetime"));
+ }
+
+ return value;
+}
+
+#endif // wxUSE_DATETIME
+
+// ----------------------------------------------------------------------------
+// wxVariantDataArrayString
+// ----------------------------------------------------------------------------
+
+class wxVariantDataArrayString: public wxVariantData
+{
+public:
+ wxVariantDataArrayString() { }
+ wxVariantDataArrayString(const wxArrayString& value) { m_value = value; }
+
+ wxArrayString GetValue() const { return m_value; }
+ void SetValue(const wxArrayString& value) { m_value = value; }
+
+ virtual bool Eq(wxVariantData& data) const;
+#if wxUSE_STD_IOSTREAM
+ virtual bool Write(wxSTD ostream& str) const;
+#endif
+ virtual bool Write(wxString& str) const;
+#if wxUSE_STD_IOSTREAM
+ virtual bool Read(wxSTD istream& str);
+#endif
+ virtual bool Read(wxString& str);
+ virtual wxString GetType() const { return wxT("arrstring"); }
+ virtual wxVariantData* Clone() const { return new wxVariantDataArrayString(m_value); }
+
+protected:
+ wxArrayString m_value;
+};
+
+bool wxVariantDataArrayString::Eq(wxVariantData& data) const
+{
+ wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Eq: argument mismatch") );
+
+ wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
+
+ return otherData.m_value == m_value;
+}
+
+#if wxUSE_STD_IOSTREAM
+bool wxVariantDataArrayString::Write(wxSTD ostream& WXUNUSED(str)) const
+{
+ // Not implemented
+ return false;
+}
+#endif
+
+bool wxVariantDataArrayString::Write(wxString& str) const
+{
+ size_t count = m_value.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ if ( n )
+ str += wxT(';');
+
+ str += m_value[n];
+ }
+
+ return true;
+}
+
+
+#if wxUSE_STD_IOSTREAM
+bool wxVariantDataArrayString::Read(wxSTD istream& WXUNUSED(str))
+{
+ // Not implemented
+ return false;
+}
+#endif
+
+
+bool wxVariantDataArrayString::Read(wxString& str)
+{
+ wxStringTokenizer tk(str, wxT(";"));
+ while ( tk.HasMoreTokens() )
+ {
+ m_value.Add(tk.GetNextToken());
+ }
+
+ return true;
+}
+
+// wxVariant
+
+wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
+{
+ m_refData = new wxVariantDataArrayString(val);
+ m_name = name;
+}
+
+bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
+{
+ wxFAIL_MSG( wxT("TODO") );
+
+ return false;
+}
+
+bool wxVariant::operator!=(const wxArrayString& value) const
+{
+ return !(*this == value);
+}
+
+void wxVariant::operator=(const wxArrayString& value)
+{
+ if (GetType() == wxT("arrstring") &&
+ m_refData->GetRefCount() == 1)
+ {
+ ((wxVariantDataArrayString *)GetData())->SetValue(value);
+ }
+ else
+ {
+ UnRef();
+ m_refData = new wxVariantDataArrayString(value);
+ }
+}
+
+wxArrayString wxVariant::GetArrayString() const
+{
+ if ( GetType() == wxT("arrstring") )
+ return ((wxVariantDataArrayString *)GetData())->GetValue();
+
+ return wxArrayString();
+}
+
+// ----------------------------------------------------------------------------
+// wxVariantDataLongLong
+// ----------------------------------------------------------------------------
+
+#if wxUSE_LONGLONG
+
+class WXDLLIMPEXP_BASE wxVariantDataLongLong : public wxVariantData
+{
+public:
+ wxVariantDataLongLong() { m_value = 0; }
+ wxVariantDataLongLong(wxLongLong value) { m_value = value; }
+
+ wxLongLong GetValue() const { return m_value; }
+ void SetValue(wxLongLong value) { m_value = value; }
+
+ virtual bool Eq(wxVariantData& data) const;
+
+ virtual bool Read(wxString& str);
+ virtual bool Write(wxString& str) const;
+#if wxUSE_STD_IOSTREAM
+ virtual bool Read(wxSTD istream& str);
+ virtual bool Write(wxSTD ostream& str) const;
+#endif
+#if wxUSE_STREAMS
+ virtual bool Read(wxInputStream& str);
+ virtual bool Write(wxOutputStream &str) const;
+#endif // wxUSE_STREAMS
+
+ wxVariantData* Clone() const
+ {
+ return new wxVariantDataLongLong(m_value);
+ }
+
+ virtual wxString GetType() const { return wxS("longlong"); }
+
+protected:
+ wxLongLong m_value;
+};
+
+bool wxVariantDataLongLong::Eq(wxVariantData& data) const
+{
+ wxASSERT_MSG( (data.GetType() == wxS("longlong")),
+ "wxVariantDataLongLong::Eq: argument mismatch" );
+
+ wxVariantDataLongLong& otherData = (wxVariantDataLongLong&) data;
+
+ return (otherData.m_value == m_value);
+}
+
+#if wxUSE_STD_IOSTREAM
+bool wxVariantDataLongLong::Write(wxSTD ostream& str) const
+{
+ wxString s;
+ Write(s);
+ str << (const char*) s.mb_str();
+ return true;
+}
+#endif
+
+bool wxVariantDataLongLong::Write(wxString& str) const
+{
+#ifdef wxLongLong_t
+ str.Printf(wxS("%lld"), m_value.GetValue());
+ return true;
+#else
+ return false;
+#endif
+}
+
+#if wxUSE_STD_IOSTREAM
+bool wxVariantDataLongLong::Read(wxSTD istream& WXUNUSED(str))
+{
+ wxFAIL_MSG(wxS("Unimplemented"));
+ return false;
+}
+#endif
+
+#if wxUSE_STREAMS
+bool wxVariantDataLongLong::Write(wxOutputStream& str) const
+{
+ wxTextOutputStream s(str);
+ s.Write32(m_value.GetLo());
+ s.Write32(m_value.GetHi());
+ return true;
+}
+
+bool wxVariantDataLongLong::Read(wxInputStream& str)
+{
+ wxTextInputStream s(str);
+ unsigned long lo = s.Read32();
+ long hi = s.Read32();
+ m_value = wxLongLong(hi, lo);
+ return true;
+}
+#endif // wxUSE_STREAMS
+
+bool wxVariantDataLongLong::Read(wxString& str)
+{
+#ifdef wxLongLong_t
+ wxLongLong_t value_t;
+ if ( !str.ToLongLong(&value_t) )
+ return false;
+ m_value = value_t;
+ return true;
+#else
+ return false;
+#endif
+}
+
+// wxVariant
+
+wxVariant::wxVariant(wxLongLong val, const wxString& name)
+{
+ m_refData = new wxVariantDataLongLong(val);
+ m_name = name;
+}
+
+bool wxVariant::operator==(wxLongLong value) const
+{
+ wxLongLong thisValue;
+ if ( !Convert(&thisValue) )
+ return false;