implemented large parts of WCF standard endpoints and configuration support.
[mono.git] / mcs / class / CustomMarshalers / System.Runtime.InteropServices.CustomMarshalers / EnumeratorToEnumVariantMarshaler.cs
index 514eed5ea0d348fc5029c6a93dbec93577d54ca5..54f8bcb99154bc8e76c51dab89ef15cc12ea2ae1 100644 (file)
@@ -3,8 +3,10 @@
 //
 // 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
                }
        }
 }