]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ole/safearray.cpp
Improve SAFEARRAY support in wxMSW OLE Automation code.
[wxWidgets.git] / src / msw / ole / safearray.cpp
diff --git a/src/msw/ole/safearray.cpp b/src/msw/ole/safearray.cpp
new file mode 100644 (file)
index 0000000..c4061e7
--- /dev/null
@@ -0,0 +1,134 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        msw/ole/safearray.cpp
+// Purpose:     Implementation of wxSafeArrayBase class.
+// Author:      PB
+// Created:     2012-09-23
+// RCS-ID:      $Id$
+// Copyright:   (c) 2012 wxWidgets development team
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+    #include "wx/variant.h"
+#endif // WX_PRECOMP
+
+#include "wx/msw/ole/safearray.h"
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxSafeArrayBase
+// ----------------------------------------------------------------------------
+
+void wxSafeArrayBase::Destroy()
+{
+    if ( m_array )
+    {
+        Unlock();
+        HRESULT hr = SafeArrayDestroy(m_array);
+        if ( FAILED(hr) )
+        {
+            wxLogApiError(wxS("SafeArrayDestroy()"), hr);
+        }
+        m_array = NULL;
+    }
+}
+
+SAFEARRAY* wxSafeArrayBase::Detach()
+{
+    wxCHECK_MSG( m_array, NULL, wxS("Uninitialized safe array") );
+
+    Unlock();
+    SAFEARRAY* array = m_array;
+    m_array = NULL;
+    return array;
+}
+
+size_t wxSafeArrayBase::GetDim() const
+{
+    wxASSERT( m_array );
+
+    return SafeArrayGetDim(m_array);
+}
+
+bool wxSafeArrayBase::GetLBound(size_t dim, long& bound) const
+{
+    wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
+    wxCHECK_MSG( dim > 0, false, wxS("Invalid dimension index") );
+
+    HRESULT hr = SafeArrayGetLBound(m_array, dim, &bound);
+    if ( FAILED(hr) )
+    {
+        wxLogApiError(wxS("SafeArrayGetLBound()"), hr);
+        return false;
+    }
+    return true;
+}
+
+bool wxSafeArrayBase::GetUBound(size_t dim, long& bound) const
+{
+    wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
+    wxCHECK_MSG( dim > 0, false, wxS("Invalid dimension index") );
+
+    HRESULT hr = SafeArrayGetUBound(m_array, dim, &bound);
+    if ( FAILED(hr) )
+    {
+        wxLogApiError(wxS("SafeArrayGetUBound()"), hr);
+        return false;
+    }
+    return true;
+}
+
+size_t wxSafeArrayBase::GetCount(size_t dim) const
+{
+    long lBound, uBound;
+
+    if ( GetLBound(dim, lBound) && GetUBound(dim, uBound) )
+        return uBound - lBound + 1;
+    return 0;
+}
+
+bool wxSafeArrayBase::Lock()
+{
+    wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
+
+    HRESULT hr = SafeArrayLock(m_array);
+    if ( FAILED(hr) )
+    {
+        wxLogApiError(wxS("SafeArrayLock()"), hr);
+        return false;
+    }
+    return true;
+}
+
+bool wxSafeArrayBase::Unlock()
+{
+    wxCHECK_MSG( m_array, false, wxS("Uninitialized safe array") );
+
+    HRESULT hr = SafeArrayUnlock(m_array);
+    if ( FAILED(hr) )
+    {
+        wxLogApiError(wxS("SafeArrayUnlock()"), hr);
+        return false;
+    }
+    return true;
+}
+
+