diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp index 15c8cea2..c6a88646 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp @@ -504,25 +504,56 @@ bool plNetLinkingMgr::IProcessVaultNotifyMsg(plVaultNotifyMsg* msg) return false; } - if (cVaultLink != nil) - { - // This is something that Cyan does... >.< - // It's very useful though... + if (cVaultLink != nil) { + // Verify that if the Age vault already exists that it matches the requested + // deferred link. If it doesn't exist, well, I hope you're happy with the result. VaultAgeLinkNode accLink(cVaultLink); - accLink.CopyTo(cur); - if (RelVaultNode* rvnInfo = cVaultLink->GetChildNodeIncRef(plVault::kNodeType_AgeInfo, 1)) - { + if (RelVaultNode* rvnInfo = cVaultLink->GetChildNodeIncRef(plVault::kNodeType_AgeInfo, 1)) { + plAgeInfoStruct dest; + VaultAgeInfoNode accInfo(rvnInfo); - accInfo.CopyTo(cur->GetAgeInfo()); + accInfo.CopyTo(&dest); + if (!dest.IsEqualTo(fDeferredLink->GetAgeLink()->GetAgeInfo())) { + hsLogEntry( + plNetClientMgr::GetInstance()->DebugMsg( + "Waiting for a deferred link to '%s' but got AgeInfo for '%s' instead.", + fDeferredLink->GetAgeLink()->AsStdString().c_str(), + dest.AsStdString().c_str() + ); + ); + + rvnInfo->DecRef(); + return false; + } + rvnInfo->DecRef(); } + // If we're still here, that means the links match. Set the vault copy as our current + // AgeLink and AgeInfo. Note this mainly copies the AgeInfo. + accLink.CopyTo(cur); + hsLogEntry( + plNetClientMgr::GetInstance()->DebugMsg( + "Performing deferred link to '%s'", + cur->AsStdString().c_str() + ); + ); + + // Steals fDeferredLink IDoLink(fDeferredLink); fDeferredLink = nil; - return true; cVaultLink->DecRef(); - } + + return true; + } else { + hsLogEntry( + plNetClientMgr::GetInstance()->ErrorMsg( + "Waiting for a deferred link to '%s' but got a garbage link?", + fDeferredLink->GetAgeLink()->AsStdString().c_str() + ) + ); + } return false; }