]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/variant.cpp
fixed 3 infinite loops -- the person who tested this code must have had a lot of...
[wxWidgets.git] / src / common / variant.cpp
index 193612e59830b56d5c7abed10d448604eff43898..48d54c7ec1841cdf6b57e586e678fabeef37a726 100644 (file)
@@ -36,6 +36,8 @@
 #endif
 
 #include "wx/string.h"
+#include "wx/tokenzr.h"
+
 #include "wx/variant.h"
 
 #if wxUSE_TIMEDATE
@@ -1172,6 +1174,105 @@ bool wxVariantDataDateTime::Read(wxString& str)
     return TRUE;
 }
 
+// ----------------------------------------------------------------------------
+// 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 void Copy(wxVariantData& data);
+    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() { return new wxVariantDataArrayString; }
+
+protected:
+    wxArrayString m_value;
+
+    DECLARE_DYNAMIC_CLASS(wxVariantDataArrayString)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxVariantDataArrayString, wxVariantData)
+
+void wxVariantDataArrayString::Copy(wxVariantData& data)
+{
+    wxASSERT_MSG( data.GetType() == GetType(), wxT("wxVariantDataArrayString::Copy: Can't copy to this type of data") );
+
+    wxVariantDataArrayString& otherData = (wxVariantDataArrayString&) data;
+
+    otherData.m_value = 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& 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 += _T(';');
+
+        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, _T(";"));
+    while ( tk.HasMoreTokens() )
+    {
+        m_value.Add(tk.GetNextToken());
+    }
+
+    return TRUE;
+}
+
+
 
 /*
  * wxVariant
@@ -1280,9 +1381,16 @@ wxVariant::wxVariant(const DATE_STRUCT* valptr, const wxString& name) // Date
     m_data = new wxVariantDataDateTime(valptr);
     m_name = name;
 }
-#endif
+#endif // wxUSE_ODBC
+
+wxVariant::wxVariant(const wxArrayString& val, const wxString& name) // Strings
+{
+    m_data = new wxVariantDataArrayString(val);
+    m_name = name;
+}
 
 wxVariant::wxVariant(const wxVariant& variant)
+    : wxObject()
 {
     if (!variant.IsNull())
     {
@@ -1329,8 +1437,10 @@ void wxVariant::operator= (const wxVariant& variant)
             delete m_data;
         m_data = (wxVariantData*) variant.GetData()->GetClassInfo()->CreateObject();
     }
-//    GetData()->Copy(* variant.GetData());
+
     variant.GetData()->Copy(* GetData());
+
+    m_name = variant.m_name;
 }
 
 // Assignment using data, e.g.
@@ -1677,7 +1787,6 @@ void wxVariant::operator= (const wxDateTime& value)
     }
 }
 
-
 #if wxUSE_ODBC
 void wxVariant::operator= (const DATE_STRUCT* value)
 {
@@ -1702,7 +1811,41 @@ void wxVariant::operator= (const TIMESTAMP_STRUCT* value)
     m_data = new wxVariantDataDateTime(value);
 }
 
-#endif
+#endif // wxUSE_ODBC
+
+bool wxVariant::operator==(const wxArrayString& WXUNUSED(value)) const
+{
+    wxFAIL_MSG( _T("TODO") );
+
+    return FALSE;
+}
+
+bool wxVariant::operator!=(const wxArrayString& value) const
+{
+    return !(*this == value);
+}
+
+void wxVariant::operator=(const wxArrayString& value)
+{
+    if (GetType() == wxT("arrstring"))
+    {
+        ((wxVariantDataArrayString *)GetData())->SetValue(value);
+    }
+    else
+    {
+        delete m_data;
+        m_data = new wxVariantDataArrayString(value);
+    }
+}
+
+wxArrayString wxVariant::GetArrayString() const
+{
+    if ( GetType() == wxT("arrstring") )
+        return ((wxVariantDataArrayString *)GetData())->GetValue();
+
+    return wxArrayString();
+}
+
 
 // Treat a list variant as an array
 wxVariant wxVariant::operator[] (size_t idx) const
@@ -1911,6 +2054,12 @@ wxStringList& wxVariant::GetStringList() const
     return (wxStringList&) ((wxVariantDataStringList*) m_data)->GetValue();
 }
 
+// Make empty list
+void wxVariant::NullList()
+{
+    SetData(new wxVariantDataList());
+};
+
 // Append to list
 void wxVariant::Append(const wxVariant& value)
 {
@@ -2095,9 +2244,11 @@ bool wxVariant::Convert(wxDateTime* value) const
 {
     wxString type(GetType());
     if (type == wxT("datetime"))
+    {
         *value = ((wxVariantDataDateTime*)GetData())->GetValue();
-    else
-        return FALSE;
-
-    return TRUE;
+       return TRUE;
+    } 
+    // Fallback to string conversion
+    wxString val;
+    return Convert(&val) && (value->ParseDate(val));
 }