//
// Authors:
// Martin Willemoes Hansen (mwh@sysrq.dk)
+// Jonathan Chambers (joncham@gmail.com)
//
// (C) 2003 Martin Willemoes Hansen
+// (C) 2007 Jonathan Chambers
//
//
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+using System;
+using System.Collections;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
namespace System.Runtime.InteropServices.CustomMarshalers
{
- public class EnumeratorToEnumVariantMarshaler : ICustomMarshaler {
- [MonoTODO]
- public void CleanUpManagedData (object pManagedObj)
- {
- throw new NotImplementedException();
+ public class EnumeratorToEnumVariantMarshaler : ICustomMarshaler
+ {
+ static EnumeratorToEnumVariantMarshaler instance;
+ public void CleanUpManagedData (object pManagedObj) {
+ throw new NotImplementedException ();
}
- [MonoTODO]
- public void CleanUpNativeData (IntPtr pNativeData)
- {
- throw new NotImplementedException();
+ public void CleanUpNativeData (IntPtr pNativeData) {
+ Marshal.Release (pNativeData);
}
- [MonoTODO]
- public static ICustomMarshaler GetInstance (string pstrCookie)
- {
- throw new NotImplementedException();
+ public static ICustomMarshaler GetInstance (string pstrCookie) {
+ if (instance == null)
+ instance = new EnumeratorToEnumVariantMarshaler ();
+ return instance;
}
- [MonoTODO]
- public int GetNativeDataSize()
- {
- throw new NotImplementedException();
+ public int GetNativeDataSize () {
+ throw new NotImplementedException ();
+ }
+
+ public IntPtr MarshalManagedToNative (object pManagedObj) {
+ throw new NotImplementedException ();
}
- [MonoTODO]
- public IntPtr MarshalManagedToNative (object pManagedObj)
+ public object MarshalNativeToManaged (IntPtr pNativeData) {
+ IEnumVARIANT ienumvariant = (IEnumVARIANT)Marshal.GetObjectForIUnknown (pNativeData);
+ VARIANTEnumerator e = new VARIANTEnumerator (ienumvariant);
+ return e;
+ }
+
+ [ComImport]
+ [Guid ("00020404-0000-0000-C000-000000000046")]
+ [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
+ interface IEnumVARIANT
{
- throw new NotImplementedException();
+ [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+ void Next (int celt, [MarshalAs (UnmanagedType.Struct)]out object rgvar, out uint pceltFetched);
+ [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+ void Skip (uint celt);
+ [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+ void Reset ();
+ [return: MarshalAs (UnmanagedType.Interface)]
+ [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
+ IEnumVARIANT Clone ();
+
}
- [MonoTODO]
- public object MarshalNativeToManaged (IntPtr pNativeData)
+ class VARIANTEnumerator : IEnumerator
{
- throw new NotImplementedException();
+ IEnumVARIANT com_enum;
+ object current;
+ public VARIANTEnumerator (IEnumVARIANT com_enum) {
+ this.com_enum = com_enum;
+ }
+ #region IEnumerator Members
+
+ public object Current {
+ get {
+ return current;
+ }
+ }
+
+ public bool MoveNext () {
+ object val;
+ uint fetched = 0;
+ com_enum.Next (1, out val, out fetched);
+ if (fetched == 0)
+ return false;
+ current = val;
+ return true;
+ }
+
+ public void Reset () {
+ com_enum.Reset ();
+ }
+
+ #endregion
}
}
}