void SyncManagerImpl::AddCreateOpForElementRecurs(RemoteSyncPeer& peer, const ElementPtr& element)
{
	// Construct a CreateOperation for this element
	XGuid parentGuid = kInvalidXGuid;
	ElementPtr parent = element->GetParent();
	if (parent)
	{
		parentGuid = parent->GetGUID();
	}

	{
		CreateOperationPtr createOp = new CreateOperation(
			element->GetElementType(),
			element->GetName(),
			element->GetGUID(),
			parentGuid,
			element->GetXValue(),
			m_syncContext->GetAuthorityLevel(),
			m_syncContext);

		// Add to the list of outgoing ops
		peer.SendOp(createOp);
	}

	// If this is an object element...
	ObjectElementPtr objElement = ObjectElement::Cast(element);
	if (objElement)
	{
		// Recurs to the children of this element
		for (int32 i = 0; i < objElement->GetElementCount(); ++i)
		{
			AddCreateOpForElementRecurs(peer, objElement->GetElementAt(i));
		}
	}
	else
	{
		// If the element is an array, add Insert operations for all its entries
		ArrayElement* arrayElement = reflection_cast<ArrayElement>(element);
		if (arrayElement != nullptr)
		{
			int32 numEntries = arrayElement->GetCount();
			for (int32 i = 0; i < numEntries; ++i)
			{
				InsertOperationPtr insertOp = new InsertOperation(
					element->GetGUID(),
					i,
					arrayElement->GetXValue(i),
					m_syncContext->GetAuthorityLevel(),
					m_syncContext);

				// Add to the list of outgoing ops
				peer.SendOp(insertOp);
			}
		}
	}
}
示例#2
0
	void SyncTestbed::CompareElementRecurs(const ElementPtr& element1, const ElementPtr& element2) const
	{
		Assert::AreEqual(element1->GetName()->GetString(), element2->GetName()->GetString());
		Assert::IsTrue(element1->GetGUID() == element2->GetGUID());
		Assert::IsTrue(element1->GetElementType() == element2->GetElementType());
		Assert::IsTrue(element1->GetXValue() == element2->GetXValue());

		if (element1->GetElementType() == ElementType::ObjectType)
		{
			ObjectElementPtr objElement1 = ObjectElement::Cast(element1);
			Assert::IsNotNull(objElement1.get());
			ObjectElementPtr objElement2 = ObjectElement::Cast(element2);
			Assert::IsNotNull(objElement2.get());

			Assert::AreEqual(objElement1->GetElementCount(), objElement2->GetElementCount());

			for (int32 i = 0; i < objElement1->GetElementCount(); ++i)
			{
				ElementPtr childElement1 = objElement1->GetElementAt(i);

				ElementPtr childElement2 = objElement2->GetElement(childElement1->GetName());
				Assert::IsNotNull(childElement2.get());

				CompareElementRecurs(childElement1, childElement2);
			}
		}
		else if (IsFrom<ArrayElement>(element1))
		{
			ArrayElement* arrayElement1 = reflection_cast<ArrayElement>(element1);
			Assert::IsNotNull(arrayElement1);

			ArrayElement* arrayElement2 = reflection_cast<ArrayElement>(element2);
			Assert::IsNotNull(arrayElement2);

			Assert::AreEqual(arrayElement1->GetCount(), arrayElement2->GetCount());

			for (int32 i = 0; i < arrayElement1->GetCount(); ++i)
			{
				Assert::IsTrue(arrayElement1->GetXValue(i) == arrayElement2->GetXValue(i));
			}
		}
	}