Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 17255)
@@ -733,8 +733,9 @@
                 ComPtr<IHost> host;
                 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
-                ComPtr<IHostFloppyDriveCollection> hostFloppies;
-                CHECK_ERROR(host, COMGETTER(FloppyDrives)(hostFloppies.asOutParam()));
+                com::SafeIfaceArray <IHostFloppyDrive> hostFloppies;
+                rc = host->COMGETTER(FloppyDrives)(ComSafeArrayAsOutParam(hostFloppies));
+				CheckComRCReturnRC (rc);
                 ComPtr<IHostFloppyDrive> hostFloppyDrive;
-                rc = hostFloppies->FindByName(Bstr(a->argv[2] + 5), hostFloppyDrive.asOutParam());
+                host->FindHostFloppyDrive(Bstr(a->argv[2] + 5), hostFloppyDrive.asOutParam());
                 if (!hostFloppyDrive)
                 {
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp	(revision 17255)
@@ -264,15 +264,11 @@
             ComPtr<IHost> host;
             CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
-            ComPtr<IHostFloppyDriveCollection> coll;
-            ComPtr<IHostFloppyDriveEnumerator> enumerator;
-            CHECK_ERROR(host, COMGETTER(FloppyDrives)(coll.asOutParam()));
-            if (SUCCEEDED(rc) && coll)
-            {
-                CHECK_ERROR(coll, Enumerate(enumerator.asOutParam()));
-                BOOL hasMore;
-                while (SUCCEEDED(enumerator->HasMore(&hasMore)) && hasMore)
-                {
-                    ComPtr<IHostFloppyDrive> floppyDrive;
-                    CHECK_ERROR_BREAK(enumerator, GetNext(floppyDrive.asOutParam()));
+            com::SafeIfaceArray <IHostFloppyDrive> coll;
+            CHECK_ERROR(host, COMGETTER(FloppyDrives)(ComSafeArrayAsOutParam(coll)));
+            if (SUCCEEDED(rc))
+            {
+                for (size_t i = 0; i < coll.size(); ++i)
+                {
+                    ComPtr<IHostFloppyDrive> floppyDrive = coll[i];
                     Bstr name;
                     floppyDrive->COMGETTER(Name)(name.asOutParam());
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 17255)
@@ -1196,8 +1196,8 @@
                     ComPtr<IHost> host;
                     CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
-                    ComPtr<IHostFloppyDriveCollection> hostFloppies;
-                    CHECK_ERROR(host, COMGETTER(FloppyDrives)(hostFloppies.asOutParam()));
+                    com::SafeIfaceArray <IHostFloppyDrive> hostFloppies;
+                    CHECK_ERROR(host, COMGETTER(FloppyDrives)(ComSafeArrayAsOutParam(hostFloppies)));
                     ComPtr<IHostFloppyDrive> hostFloppyDrive;
-                    rc = hostFloppies->FindByName(Bstr(floppy + 5), hostFloppyDrive.asOutParam());
+                    rc = host->FindHostFloppyDrive(Bstr(floppy + 5), hostFloppyDrive.asOutParam());
                     if (!hostFloppyDrive)
                     {
Index: /trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp	(revision 17255)
@@ -1711,8 +1711,8 @@
             ComPtr <IHost> host;
             CHECK_ERROR_BREAK (virtualBox, COMGETTER(Host)(host.asOutParam()));
-            ComPtr <IHostFloppyDriveCollection> coll;
-            CHECK_ERROR_BREAK (host, COMGETTER(FloppyDrives)(coll.asOutParam()));
+            com::SafeIfaceArray <IHostFloppyDrive> coll;
+            CHECK_ERROR_BREAK (host, COMGETTER(FloppyDrives)(ComSafeArrayAsOutParam(coll)));
             ComPtr <IHostFloppyDrive> hostDrive;
-            rc = coll->FindByName (medium, hostDrive.asOutParam());
+            rc = host->FindHostFloppyDrive (medium, hostDrive.asOutParam());
             if (SUCCEEDED (rc))
             {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleWnd.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleWnd.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleWnd.cpp	(revision 17255)
@@ -3017,9 +3017,9 @@
 
     hostFloppyMap.clear();
-    CHostFloppyDriveEnumerator en =
-        vboxGlobal().virtualBox().GetHost().GetFloppyDrives().Enumerate();
-    while (en.HasMore())
-    {
-        CHostFloppyDrive hostFloppy = en.GetNext();
+    CHostFloppyDriveVector drvvec =
+        vboxGlobal().virtualBox().GetHost().GetFloppyDrives();
+    for (int i = 0; i < drvvec.size(); ++i)
+    {
+        CHostFloppyDrive hostFloppy = drvvec[i];
         /** @todo set icon */
         QString drvName = hostFloppy.GetName();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMFirstRunWzd.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMFirstRunWzd.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMFirstRunWzd.cpp	(revision 17255)
@@ -198,12 +198,11 @@
     {
         /* Search for the host floppy-drives */
-        CHostFloppyDriveCollection coll =
+        CHostFloppyDriveVector coll =
             vboxGlobal().virtualBox().GetHost().GetFloppyDrives();
-        mHostFloppys.resize (coll.GetCount());
-        int id = 0;
-        CHostFloppyDriveEnumerator en = coll.Enumerate();
-        while (en.HasMore())
-        {
-            CHostFloppyDrive hostFloppy = en.GetNext();
+        mHostFloppys.resize (coll.size());
+
+        for (int id = 0; id < coll.size(); ++id)
+        {
+            CHostFloppyDrive hostFloppy = coll[id];
             QString name = hostFloppy.GetName();
             QString description = hostFloppy.GetDescription();
@@ -212,5 +211,4 @@
             mCbHost->insertItem (id, fullName);
             mHostFloppys [id] = hostFloppy;
-            ++ id;
         }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsFD.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsFD.cpp	(revision 17254)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsFD.cpp	(revision 17255)
@@ -6,5 +6,5 @@
 
 /*
- * Copyright (C) 2006-2008 Sun Microsystems, Inc.
+ * Copyright (C) 2006-2009 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -60,13 +60,12 @@
 
     /* Read out the host floppy drive list and prepare the combobox */
-    CHostFloppyDriveCollection coll =
+    CHostFloppyDriveVector coll =
         vboxGlobal().virtualBox().GetHost().GetFloppyDrives();
-    mHostFDs.resize (coll.GetCount());
+    mHostFDs.resize (coll.size());
     mCbHostFD->clear();
-    int id = 0;
-    CHostFloppyDriveEnumerator en = coll.Enumerate();
-    while (en.HasMore())
-    {
-        CHostFloppyDrive hostFloppy = en.GetNext();
+
+    for (int id = 0; id < coll.size(); ++id)
+    {
+        CHostFloppyDrive hostFloppy = coll[id];
         /** @todo set icon? */
         QString name = hostFloppy.GetName();
@@ -77,5 +76,4 @@
         mCbHostFD->insertItem (id, fullName);
         mHostFDs [id] = hostFloppy;
-        ++ id;
     }
 
@@ -91,5 +89,5 @@
                 name :
                 QString ("%1 (%2)").arg (description, name);
-            if (coll.FindByName (name).isNull())
+            if (vboxGlobal().virtualBox().GetHost().FindHostFloppyDrive (name).isNull())
             {
                 /* If the floppy drive is not currently available, add it to
Index: /trunk/src/VBox/Main/FloppyDriveImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/FloppyDriveImpl.cpp	(revision 17254)
+++ /trunk/src/VBox/Main/FloppyDriveImpl.cpp	(revision 17255)
@@ -7,5 +7,5 @@
 
 /*
- * Copyright (C) 2006-2007 Sun Microsystems, Inc.
+ * Copyright (C) 2006-2009 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -459,13 +459,14 @@
         Bstr src = typeNode.stringValue ("src");
 
-        /* find the correspoding object */
+        /* find the corresponding object */
         ComObjPtr <Host> host = mParent->virtualBox()->host();
 
-        ComPtr <IHostFloppyDriveCollection> coll;
-        rc = host->COMGETTER(FloppyDrives) (coll.asOutParam());
+        com::SafeIfaceArray <IHostFloppyDrive> coll;
+        rc = host->COMGETTER(FloppyDrives) (ComSafeArrayAsOutParam(coll));
         AssertComRC (rc);
 
         ComPtr <IHostFloppyDrive> drive;
-        rc = coll->FindByName (src, drive.asOutParam());
+        rc = host->FindHostFloppyDrive (src, drive.asOutParam());
+
         if (SUCCEEDED (rc))
         {
Index: /trunk/src/VBox/Main/HostImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/HostImpl.cpp	(revision 17254)
+++ /trunk/src/VBox/Main/HostImpl.cpp	(revision 17255)
@@ -410,5 +410,5 @@
  * @param drives address of result pointer
  */
-STDMETHODIMP Host::COMGETTER(FloppyDrives) (IHostFloppyDriveCollection **aDrives)
+STDMETHODIMP Host::COMGETTER(FloppyDrives) (ComSafeArrayOut (IHostFloppyDrive *, aDrives))
 {
     CheckComArgOutPointerValid(aDrives);
@@ -462,8 +462,6 @@
 #endif
 
-    ComObjPtr<HostFloppyDriveCollection> collection;
-    collection.createObject();
-    collection->init (list);
-    collection.queryInterfaceTo(aDrives);
+    SafeIfaceArray<IHostFloppyDrive> collection (list);
+    collection.detachTo(ComSafeArrayOutArg (aDrives));
     return rc;
 }
@@ -3355,4 +3353,38 @@
 }
 
+STDMETHODIMP Host::FindHostFloppyDrive(IN_BSTR aName, IHostFloppyDrive **aDrive)
+{
+    CheckComArgNotNull(aName);
+    CheckComArgOutPointerValid(aDrive);
+
+    *aDrive = NULL;
+
+    SafeIfaceArray <IHostFloppyDrive> drivevec;
+    HRESULT rc = COMGETTER(FloppyDrives) (ComSafeArrayAsOutParam(drivevec));
+    CheckComRCReturnRC (rc);
+
+    for (size_t i = 0; i < drivevec.size(); ++i)
+    {
+        Bstr name;
+        rc = drivevec[i]->COMGETTER(Name) (name.asOutParam());
+        CheckComRCReturnRC (rc);
+        if (name == aName)
+        {
+            ComObjPtr<HostFloppyDrive> found;
+            found.createObject();
+            Bstr udi, description;
+            rc = drivevec[i]->COMGETTER(Udi) (udi.asOutParam());
+            CheckComRCReturnRC (rc);
+            rc = drivevec[i]->COMGETTER(Description) (description.asOutParam());
+            CheckComRCReturnRC (rc);
+            found->init(name, udi, description);
+            return found.queryInterfaceTo(aDrive);
+        }
+    }
+
+    return setError (VBOX_E_OBJECT_NOT_FOUND, HostFloppyDrive::tr (
+        "The host floppy drive named '%ls' could not be found"), aName);
+}
+
 STDMETHODIMP Host::FindHostNetworkInterfaceByName(IN_BSTR name, IHostNetworkInterface **networkInterface)
 {
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 17254)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 17255)
@@ -6374,32 +6374,4 @@
   </interface>
 
-  <enumerator
-     name="IHostFloppyDriveEnumerator" type="IHostFloppyDrive"
-     uuid="ce04c924-4f54-432a-9dec-11fddc3ea875"
-     />
-
-  <collection
-     name="IHostFloppyDriveCollection" type="IHostFloppyDrive"
-     enumerator="IHostFloppyDriveEnumerator"
-     uuid="fd84bb86-c59a-4037-a557-755ff263a460"
-     readonly="yes"
-     >
-    <method name="findByName">
-      <desc>
-        Searches this collection for a host drive with the given name.
-        <note>
-          The method returns an error if the given name does not
-          correspond to any host drive in the collection.
-        </note>
-      </desc>
-      <param name="name" type="wstring" dir="in">
-        <desc>Name of the host drive to search for</desc>
-      </param>
-      <param name="drive" type="IHostFloppyDrive" dir="return">
-        <desc>Found host drive object</desc>
-      </param>
-    </method>
-  </collection>
-
   <enum
     name="HostNetworkInterfaceType"
@@ -6534,5 +6506,5 @@
     </attribute>
 
-    <attribute name="floppyDrives" type="IHostFloppyDriveCollection" readonly="yes">
+    <attribute name="floppyDrives" type="IHostFloppyDrive" readonly="yes" safearray="yes">
       <desc>List of floppy drives available on the host.</desc>
     </attribute>
@@ -6819,4 +6791,21 @@
       <param name="drive" type="IHostDVDDrive" dir="return">
         <desc>Found host drive object</desc>
+      </param>
+    </method>
+
+    <method name="findHostFloppyDrive">
+      <desc>
+        Searches for a host floppy drive with the given @c name.
+
+        <result name="VBOX_E_OBJECT_NOT_FOUND">
+          Given @c name does not correspond to any host floppy drive.
+        </result>
+
+      </desc>
+      <param name="name" type="wstring" dir="in">
+        <desc>Name of the host floppy drive to search for</desc>
+      </param>
+      <param name="drive" type="IHostFloppyDrive" dir="return">
+        <desc>Found host floppy drive object</desc>
       </param>
     </method>
Index: /trunk/src/VBox/Main/include/HostFloppyDriveImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/HostFloppyDriveImpl.h	(revision 17254)
+++ /trunk/src/VBox/Main/include/HostFloppyDriveImpl.h	(revision 17255)
@@ -24,5 +24,4 @@
 
 #include "VirtualBoxBase.h"
-#include "Collection.h"
 
 class ATL_NO_VTABLE HostFloppyDrive :
@@ -83,34 +82,4 @@
 };
 
-COM_DECL_READONLY_ENUM_AND_COLLECTION_BEGIN (HostFloppyDrive)
-
-    STDMETHOD(FindByName) (IN_BSTR aName, IHostFloppyDrive **aDrive)
-    {
-        if (!aName)
-            return E_INVALIDARG;
-        if (!aDrive)
-            return E_POINTER;
-
-        *aDrive = NULL;
-        Vector::value_type found;
-        Vector::iterator it = vec.begin();
-        while (it != vec.end() && !found)
-        {
-            Bstr n;
-            (*it)->COMGETTER(Name) (n.asOutParam());
-            if (n == aName)
-                found = *it;
-            ++ it;
-        }
-
-        if (!found)
-            return setError (E_INVALIDARG, HostFloppyDriveCollection::tr (
-                "The host floppy drive named '%ls' could not be found"), aName);
-
-        return found.queryInterfaceTo (aDrive);
-    }
-
-COM_DECL_READONLY_ENUM_AND_COLLECTION_END (HostFloppyDrive)
-
 #endif // ____H_HOSTFLOPPYDRIVEIMPL
 /* vi: set tabstop=4 shiftwidth=4 expandtab: */
Index: /trunk/src/VBox/Main/include/HostImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/HostImpl.h	(revision 17254)
+++ /trunk/src/VBox/Main/include/HostImpl.h	(revision 17255)
@@ -82,5 +82,5 @@
     // IHost properties
     STDMETHOD(COMGETTER(DVDDrives))(ComSafeArrayOut (IHostDVDDrive*, drives));
-    STDMETHOD(COMGETTER(FloppyDrives))(IHostFloppyDriveCollection **drives);
+    STDMETHOD(COMGETTER(FloppyDrives))(ComSafeArrayOut (IHostFloppyDrive*, drives));
     STDMETHOD(COMGETTER(USBDevices))(IHostUSBDeviceCollection **aUSBDevices);
     STDMETHOD(COMGETTER(USBDeviceFilters))(IHostUSBDeviceFilterCollection ** aUSBDeviceFilters);
@@ -112,4 +112,5 @@
 
     STDMETHOD(FindHostDVDDrive) (IN_BSTR aName, IHostDVDDrive **aDrive);
+    STDMETHOD(FindHostFloppyDrive) (IN_BSTR aName, IHostFloppyDrive **aDrive);
     STDMETHOD(FindHostNetworkInterfaceByName) (IN_BSTR aName, IHostNetworkInterface **networkInterface);
     STDMETHOD(FindHostNetworkInterfaceById) (IN_GUID id, IHostNetworkInterface **networkInterface);
Index: /trunk/src/VBox/Main/xpcom/server.cpp
===================================================================
--- /trunk/src/VBox/Main/xpcom/server.cpp	(revision 17254)
+++ /trunk/src/VBox/Main/xpcom/server.cpp	(revision 17255)
@@ -243,5 +243,4 @@
 
 COM_IMPL_READONLY_ENUM_AND_COLLECTION(Snapshot)
-COM_IMPL_READONLY_ENUM_AND_COLLECTION(HostFloppyDrive)
 #ifdef VBOX_WITH_USB
 COM_IMPL_READONLY_ENUM_AND_COLLECTION(HostUSBDevice)
