From f4021846a428b3ae5a7c95bd5008815156457c11 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 22 Apr 2011 23:42:37 -0400 Subject: [PATCH] Make adding pyVaultNodeRefs async --- .../FeatureLib/pfPython/pyVaultNode.cpp | 33 ++++++++++++++----- .../Plasma/FeatureLib/pfPython/pyVaultNode.h | 2 ++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp index e5dc76c2..c69c8ac9 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp @@ -92,6 +92,7 @@ pyVaultNode::pyVaultNodeOperationCallback::~pyVaultNodeOperationCallback() void pyVaultNode::pyVaultNodeOperationCallback::VaultOperationStarted( UInt32 context ) { + fContext = context; if ( fCbObject ) { // Call the callback. @@ -391,6 +392,14 @@ void pyVaultNode::SetCreateAgeGuid( const char * v ) // Vault Node API // Add child node +void _AddNodeCallback(ENetError result, void* param) { + pyVaultNode::pyVaultNodeOperationCallback* cb = (pyVaultNode::pyVaultNodeOperationCallback*)param; + if (IS_NET_SUCCESS(result)) + cb->VaultOperationComplete(hsOK); + else + cb->VaultOperationComplete(hsFail); +} + PyObject* pyVaultNode::AddNode(pyVaultNode* pynode, PyObject* cbObject, UInt32 cbContext) { pyVaultNodeOperationCallback * cb = NEWZERO(pyVaultNodeOperationCallback)(cbObject); @@ -420,22 +429,24 @@ PyObject* pyVaultNode::AddNode(pyVaultNode* pynode, PyObject* cbObject, UInt32 c hsResult = hsFail; } } - - // Block here until we have the child node =( - VaultAddChildNodeAndWait(fNode->nodeId, pynode->fNode->nodeId, NetCommGetPlayer()->playerInt); + + VaultAddChildNode(fNode->nodeId, + pynode->fNode->nodeId, + NetCommGetPlayer()->playerInt, + (FVaultAddChildNodeCallback)_AddNodeCallback, + cb + ); PyObject * nodeRef = cb->fPyNodeRef = pyVaultNodeRef::New(fNode, pynode->fNode); Py_INCREF(nodeRef); // incref it, because we MUST return a new PyObject, and the callback "steals" the ref from us cb->SetNode(pynode->fNode); - cb->VaultOperationComplete(cbContext, hsResult); - return nodeRef; } else { // manually make the callback cb->VaultOperationStarted( cbContext ); - cb->VaultOperationComplete( cbContext, hsFail ); + cb->VaultOperationComplete(hsFail); } // just return a None object @@ -451,15 +462,19 @@ void pyVaultNode::LinkToNode(int nodeID, PyObject* cbObject, UInt32 cbContext) { // Hack the callbacks until vault notification is in place cb->VaultOperationStarted( cbContext ); - - VaultAddChildNodeAndWait(fNode->nodeId, nodeID, NetCommGetPlayer()->playerInt); + if (RelVaultNode * rvn = VaultGetNodeIncRef(nodeID)) { cb->SetNode(rvn); cb->fPyNodeRef = pyVaultNodeRef::New(fNode, rvn); rvn->DecRef(); } - cb->VaultOperationComplete( cbContext, hsOK ); + VaultAddChildNode(fNode->nodeId, + nodeID, + NetCommGetPlayer()->playerInt, + (FVaultAddChildNodeCallback)_AddNodeCallback, + cb + ); } else { diff --git a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.h b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.h index 41c21548..363ac165 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.h +++ b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.h @@ -69,12 +69,14 @@ public: PyObject * fCbObject; RelVaultNode * fNode; PyObject * fPyNodeRef; + UInt32 fContext; pyVaultNodeOperationCallback(PyObject * cbObject); ~pyVaultNodeOperationCallback(); void VaultOperationStarted(UInt32 context); void VaultOperationComplete(UInt32 context, int resultCode); + void VaultOperationComplete(int resultCode) { VaultOperationComplete(fContext, resultCode); } void SetNode (RelVaultNode * rvn); RelVaultNode * GetNode ();