[KS]
[reactos.git] / reactos / drivers / ksfilter / ks / bag.c
index 8c41807..87f7a2b 100644 (file)
@@ -41,7 +41,7 @@ KsAllocateObjectBag(
         return STATUS_INSUFFICIENT_RESOURCES;
 
     /* get device interface */
-    KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
+    KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown;
 
     /* initialize object bag */
     return KsDevice->lpVtbl->InitializeObjectBag(KsDevice, Bag, NULL);
@@ -89,6 +89,8 @@ KsAddItemToObjectBag(
     PKSIOBJECT_BAG Bag;
     PKSIOBJECT_BAG_ENTRY BagEntry;
 
+    DPRINT("KsAddItemToObjectBag\n");
+
     /* get real object bag */
     Bag = (PKSIOBJECT_BAG)ObjectBag;
 
@@ -127,7 +129,7 @@ KsAddItemToObjectBag(
         BagEntry->Free = ExFreePool;
 
     /* insert item */
-    InsertTailList(&Bag->ObjectList, &Bag->Entry);
+    InsertTailList(&Bag->ObjectList, &BagEntry->Entry);
 
     /* release mutex */
     KeReleaseMutex(Bag->BagMutex, FALSE);
@@ -235,7 +237,7 @@ KsRemoveItemFromObjectBag(
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 NTSTATUS
@@ -244,8 +246,55 @@ KsCopyObjectBagItems(
     IN KSOBJECT_BAG ObjectBagDestination,
     IN KSOBJECT_BAG ObjectBagSource)
 {
-    UNIMPLEMENTED
-    return STATUS_NOT_IMPLEMENTED;
+    PKSIOBJECT_BAG ObjectBagDest, ObjectBagSrc;
+    PLIST_ENTRY Entry;
+    PKSIOBJECT_BAG_ENTRY BagEntry;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    /* get object bag src */
+    ObjectBagSrc = (PKSIOBJECT_BAG)ObjectBagSource;
+
+    /* get object bag dst */
+    ObjectBagDest = (PKSIOBJECT_BAG)ObjectBagDestination;
+
+    /* acquire source mutex */
+    KeWaitForSingleObject(ObjectBagSrc->BagMutex, Executive, KernelMode, FALSE, NULL);
+
+    if (ObjectBagSrc->BagMutex != ObjectBagDest->BagMutex)
+    {
+        /* acquire destination mutex */
+        KeWaitForSingleObject(ObjectBagDest->BagMutex, Executive, KernelMode, FALSE, NULL);
+    }
+
+    /* point to first item */
+    Entry = ObjectBagSrc->ObjectList.Flink;
+    /* first scan the list if the item is already inserted */
+    while(Entry != &ObjectBagSrc->ObjectList)
+    {
+        /* get bag entry */
+        BagEntry = (PKSIOBJECT_BAG_ENTRY)CONTAINING_RECORD(Entry, KSIOBJECT_BAG_ENTRY, Entry);
+
+        /* add the item */
+        Status = KsAddItemToObjectBag(ObjectBagDestination, BagEntry->Item, BagEntry->Free);
+
+        /* check for success */
+        if (!NT_SUCCESS(Status))
+            break;
+
+        /* move to next entry */
+        Entry = Entry->Flink;
+    }
+
+    if (ObjectBagSrc->BagMutex != ObjectBagDest->BagMutex)
+    {
+        /* release destination mutex */
+        KeReleaseMutex(ObjectBagDest->BagMutex, FALSE);
+    }
+
+    /* release source mutex */
+     KeReleaseMutex(ObjectBagSrc->BagMutex, FALSE);
+
+    return Status;
 }
 
 /*
@@ -316,6 +365,8 @@ _KsEdit(
     PVOID Item;
     NTSTATUS Status;
 
+    DPRINT("_KsEdit\n");
+
     /* get real object bag */
     Bag = (PKSIOBJECT_BAG)ObjectBag;