Browse Source

Merge branch 'ticket/15'

closes #15
tickets/15/15/2
rarified 3 years ago
parent
commit
13e3022087
  1. 2
      Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp
  2. 4
      Sources/Plasma/PubUtilLib/plNetClientComm/plNetClientComm.cpp
  3. 103
      Sources/Plasma/PubUtilLib/plVault/plVaultClientApi.cpp
  4. 20
      Sources/Plasma/PubUtilLib/plVault/plVaultClientApi.h

2
Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp

@ -385,7 +385,7 @@ bool plNCAgeJoiner::MsgReceive (plMessage * msg) {
} }
else if (unsigned ageVaultId = NetCommGetAge()->ageVaultId) { else if (unsigned ageVaultId = NetCommGetAge()->ageVaultId) {
// Download the age vault // Download the age vault
VaultDownload( VaultDownloadNoCallbacks(
L"AgeJoin", L"AgeJoin",
ageVaultId, ageVaultId,
AgeVaultDownloadCallback, AgeVaultDownloadCallback,

4
Sources/Plasma/PubUtilLib/plNetClientComm/plNetClientComm.cpp

@ -318,7 +318,7 @@ static void INetCliAuthSetPlayerRequestCallback (
else { else {
s_needAvatarLoad = true; s_needAvatarLoad = true;
VaultDownload( VaultDownloadNoCallbacks(
L"SetActivePlayer", L"SetActivePlayer",
s_player->playerInt, s_player->playerInt,
PlayerInitCallback, PlayerInitCallback,
@ -374,7 +374,7 @@ static void INetCliAuthLoginSetPlayerRequestCallback (
msg->Send(); msg->Send();
} }
else { else {
VaultDownload( VaultDownloadNoCallbacks(
L"SetActivePlayer", L"SetActivePlayer",
s_player->playerInt, s_player->playerInt,
LoginPlayerInitCallback, LoginPlayerInitCallback,

103
Sources/Plasma/PubUtilLib/plVault/plVaultClientApi.cpp

@ -181,7 +181,23 @@ struct VaultDownloadTrans {
unsigned vaultId; unsigned vaultId;
ENetError result; ENetError result;
VaultDownloadTrans (); VaultDownloadTrans()
: callback(), cbParam(), progressCallback(), cbProgressParam(),
nodeCount(), nodesLeft(), vaultId(), result(kNetSuccess)
{
}
VaultDownloadTrans(const wchar_t* _tag, FVaultDownloadCallback _callback,
void* _cbParam, FVaultProgressCallback _progressCallback,
void* _cbProgressParam, unsigned _vaultId)
: callback(_callback), cbParam(_cbParam), progressCallback(_progressCallback),
cbProgressParam(_cbProgressParam), nodeCount(), nodesLeft(),
vaultId(_vaultId), result(kNetSuccess)
{
StrCopy(tag, _tag, arrsize(tag));
}
virtual ~VaultDownloadTrans() { }
static void VaultNodeFetched ( static void VaultNodeFetched (
ENetError result, ENetError result,
@ -196,6 +212,28 @@ struct VaultDownloadTrans {
); );
}; };
struct VaultDownloadNoCallbacksTrans : VaultDownloadTrans {
VaultDownloadNoCallbacksTrans()
: VaultDownloadTrans()
{
VaultSuppressCallbacks();
}
VaultDownloadNoCallbacksTrans(const wchar_t* _tag, FVaultDownloadCallback _callback,
void* _cbParam, FVaultProgressCallback _progressCallback,
void* _cbProgressParam, unsigned _vaultId)
: VaultDownloadTrans(_tag, _callback, _cbParam, _progressCallback, _cbProgressParam, _vaultId)
{
VaultSuppressCallbacks();
}
~VaultDownloadNoCallbacksTrans()
{
VaultEnableCallbacks();
}
};
struct VaultAgeInitTrans { struct VaultAgeInitTrans {
FVaultInitAgeCallback callback; FVaultInitAgeCallback callback;
void * cbState; void * cbState;
@ -262,6 +300,8 @@ static HASHTABLEDECL(
static bool s_processPlayerInbox = false; static bool s_processPlayerInbox = false;
static long s_suppressCallbacks = 0;
/***************************************************************************** /*****************************************************************************
* *
* Local functions * Local functions
@ -303,10 +343,12 @@ static void VaultNodeAddedDownloadCallback(ENetError result, void * param) {
VaultProcessUnvisitNote(childLink->node); VaultProcessUnvisitNote(childLink->node);
} }
if (s_suppressCallbacks == 0) {
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentLink->node, childLink->node); cb->cb->AddedChildNode(parentLink->node, childLink->node);
} }
} }
}
DEL(notify); DEL(notify);
} }
@ -377,10 +419,12 @@ static void BuildNodeTree (
parentNode->state->children.Add(childLink); parentNode->state->children.Add(childLink);
if (notifyNow || childNode->nodeType != 0) { if (notifyNow || childNode->nodeType != 0) {
if (s_suppressCallbacks == 0) {
// We made a new link, so make the callbacks // We made a new link, so make the callbacks
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentNode, childNode); cb->cb->AddedChildNode(parentNode, childNode);
} }
}
else { else {
INotifyAfterDownload* notify = NEWZERO(INotifyAfterDownload)(parentNode->nodeId, childNode->nodeId); INotifyAfterDownload* notify = NEWZERO(INotifyAfterDownload)(parentNode->nodeId, childNode->nodeId);
s_notifyAfterDownload.Add(notify); s_notifyAfterDownload.Add(notify);
@ -543,6 +587,10 @@ static void ChangedVaultNodeFetched (
RelVaultNodeLink* savedLink = s_nodes.Find(node->nodeId); RelVaultNodeLink* savedLink = s_nodes.Find(node->nodeId);
// Yeah, we are purposefully allowing this global callback to go out,
// even if callback suppression has been enabled. The intent behind
// that is to suppress spurious callbacks, but node changes are
// probably not spurious.
if (savedLink) { if (savedLink) {
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->ChangedNode(savedLink->node); cb->cb->ChangedNode(savedLink->node);
@ -638,7 +686,7 @@ static void VaultNodeAdded (
RelVaultNodeLink* parentLink = s_nodes.Find(parentId); RelVaultNodeLink* parentLink = s_nodes.Find(parentId);
RelVaultNodeLink* childLink = s_nodes.Find(childId); RelVaultNodeLink* childLink = s_nodes.Find(childId);
if (childLink->node->nodeType != 0) { if (childLink->node->nodeType != 0 && s_suppressCallbacks == 0) {
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentLink->node, childLink->node); cb->cb->AddedChildNode(parentLink->node, childLink->node);
} }
@ -660,7 +708,7 @@ static void VaultNodeRemoved (
if (!childLink) if (!childLink)
break; break;
if (parentLink->node->IsParentOf(childId, 1)) { if (parentLink->node->IsParentOf(childId, 1) && s_suppressCallbacks == 0) {
// We have the relationship, so make the callbacks // We have the relationship, so make the callbacks
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(parentLink->node, childLink->node); cb->cb->RemovingChildNode(parentLink->node, childLink->node);
@ -831,11 +879,6 @@ void VaultFindNodeTrans::VaultNodeFound (
* *
***/ ***/
//============================================================================
VaultDownloadTrans::VaultDownloadTrans () {
ASSERT(!nodeCount); // must be alloced with
}
//============================================================================ //============================================================================
void VaultDownloadTrans::VaultNodeFetched ( void VaultDownloadTrans::VaultNodeFetched (
ENetError result, ENetError result,
@ -1047,8 +1090,10 @@ void IRelVaultNode::UnlinkFromRelatives () {
next = parents.Next(link); next = parents.Next(link);
// We have the relationship, so make the callbacks // We have the relationship, so make the callbacks
if (s_suppressCallbacks == 0) {
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(link->node, this->node); cb->cb->RemovingChildNode(link->node, this->node);
}
link->node->state->Unlink(node); link->node->state->Unlink(node);
} }
@ -1478,6 +1523,16 @@ void VaultUnregisterCallback (VaultCallback * cb) {
cb->internal = nil; cb->internal = nil;
} }
//============================================================================
void VaultSuppressCallbacks() {
AtomicAdd(&s_suppressCallbacks, 1);
}
//============================================================================
void VaultEnableCallbacks() {
long prevValue = AtomicAdd(&s_suppressCallbacks, -1);
hsAssert(prevValue > 0, "Hmm... A negative vault callback suppression count?");
}
/***************************************************************************** /*****************************************************************************
* *
@ -1772,9 +1827,11 @@ void VaultRemoveChildNode (
if (parentLink->node->IsParentOf(childId, 1)) { if (parentLink->node->IsParentOf(childId, 1)) {
// We have the relationship, so make the callbacks // We have the relationship, so make the callbacks
if (s_suppressCallbacks == 0) {
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb)) for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(parentLink->node, childLink->node); cb->cb->RemovingChildNode(parentLink->node, childLink->node);
} }
}
parentLink->node->state->Unlink(childLink->node); parentLink->node->state->Unlink(childLink->node);
childLink->node->state->Unlink(parentLink->node); childLink->node->state->Unlink(parentLink->node);
@ -4945,13 +5002,27 @@ void VaultDownload (
FVaultProgressCallback progressCallback, FVaultProgressCallback progressCallback,
void * cbProgressParam void * cbProgressParam
) { ) {
VaultDownloadTrans * trans = NEWZERO(VaultDownloadTrans); VaultDownloadTrans * trans = new VaultDownloadTrans(tag, callback, cbParam,
StrCopy(trans->tag, tag, arrsize(trans->tag)); progressCallback, cbProgressParam, vaultId);
trans->callback = callback;
trans->cbParam = cbParam; NetCliAuthVaultFetchNodeRefs(
trans->progressCallback = progressCallback; vaultId,
trans->cbProgressParam = cbProgressParam; VaultDownloadTrans::VaultNodeRefsFetched,
trans->vaultId = vaultId; trans
);
}
//============================================================================
void VaultDownloadNoCallbacks (
const wchar tag[],
unsigned vaultId,
FVaultDownloadCallback callback,
void* cbParam,
FVaultProgressCallback progressCallback,
void* cbProgressParam
) {
VaultDownloadNoCallbacksTrans* trans = new VaultDownloadNoCallbacksTrans(tag, callback,
cbParam, progressCallback, cbProgressParam, vaultId);
NetCliAuthVaultFetchNodeRefs( NetCliAuthVaultFetchNodeRefs(
vaultId, vaultId,
@ -5001,6 +5072,8 @@ void VaultDownloadAndWait (
//============================================================================ //============================================================================
void VaultCull (unsigned vaultId) { void VaultCull (unsigned vaultId) {
VaultCallbackSuppressor suppress;
// Remove the node from the global table // Remove the node from the global table
if (RelVaultNodeLink * link = s_nodes.Find(vaultId)) { if (RelVaultNodeLink * link = s_nodes.Find(vaultId)) {
LogMsg(kLogDebug, L"Vault: Culling node %u", link->node->nodeId); LogMsg(kLogDebug, L"Vault: Culling node %u", link->node->nodeId);

20
Sources/Plasma/PubUtilLib/plVault/plVaultClientApi.h

@ -82,6 +82,18 @@ struct VaultCallback {
void VaultRegisterCallback (VaultCallback * cb); void VaultRegisterCallback (VaultCallback * cb);
void VaultUnregisterCallback (VaultCallback * cb); void VaultUnregisterCallback (VaultCallback * cb);
void VaultSuppressCallbacks();
void VaultEnableCallbacks();
class VaultCallbackSuppressor
{
VaultCallbackSuppressor(const VaultCallbackSuppressor&) { }
VaultCallbackSuppressor(VaultCallbackSuppressor&&) { }
public:
VaultCallbackSuppressor() { VaultSuppressCallbacks(); }
~VaultCallbackSuppressor() { VaultEnableCallbacks(); }
};
/***************************************************************************** /*****************************************************************************
* *
@ -476,6 +488,14 @@ void VaultDownload (
FVaultProgressCallback progressCallback, FVaultProgressCallback progressCallback,
void * cbProgressParam void * cbProgressParam
); );
void VaultDownloadNoCallbacks(
const wchar tag[],
unsigned vaultId,
FVaultDownloadCallback callback,
void* cbParam,
FVaultProgressCallback progressCallback,
void* cbProgressParam
);
void VaultDownloadAndWait ( void VaultDownloadAndWait (
const wchar tag[], const wchar tag[],
unsigned vaultId, unsigned vaultId,

Loading…
Cancel
Save