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); } } } }
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)); } } }
XTOOLS_NAMESPACE_BEGIN LongElementPtr LongElement::Cast(const ElementPtr& element) { if (element != NULL && element->GetElementType() == ElementType::Int64Type) { return static_cast<LongElement*>(element.get()); } else { return NULL; } }