예제 #1
0
PyObject * pyVaultNodeRef::GetSaver () {
    if (!fParent || !fChild)
        return 0;

    RelVaultNode * saver = nil;
    if (RelVaultNode * child = VaultGetNodeIncRef(fChild->GetNodeId())) {
        if (unsigned saverId = child->GetRefOwnerId(fParent->GetNodeId())) {
            // Find the player info node representing the saver
            NetVaultNode * templateNode = new NetVaultNode;
            templateNode->IncRef();
            templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
            VaultPlayerInfoNode access(templateNode);
            access.SetPlayerId(saverId);
            saver = VaultGetNodeIncRef(templateNode);

            if (!saver) {
                ARRAY(unsigned) nodeIds;
                VaultFindNodesAndWait(templateNode, &nodeIds);
                if (nodeIds.Count() > 0) {
                    VaultFetchNodesAndWait(nodeIds.Ptr(), nodeIds.Count());
                    saver = VaultGetNodeIncRef(nodeIds[0]);
                }
            }

            templateNode->DecRef();
        }
        child->DecRef();
    }
    if (!saver)
        PYTHON_RETURN_NONE;
        
    PyObject * result = pyVaultPlayerInfoNode::New(saver);
    saver->DecRef();
    return result;
}
예제 #2
0
파일: pyVault.cpp 프로젝트: Asteral/Plasma
// finds the stats for the players vault
// ...such as how many pictures, notes and markers they have
PyObject* pyVault::GetKIUsage(void)
{
    uint32_t pictures = 0;
    uint32_t notes = 0;
    uint32_t markerGames = 0;

    for (;;) {
        RelVaultNode * rvnPlr = VaultGetPlayerNodeIncRef();
        if (!rvnPlr)
            break;

        for (;;) {
            RelVaultNode * rvnAgeJrnlz = rvnPlr->GetChildFolderNodeIncRef(plVault::kAgeJournalsFolder, 1);
            if (!rvnAgeJrnlz)
                break;

            // Get child nodes up to two levels deep
            ARRAY(RelVaultNode*) nodeArr;
            rvnAgeJrnlz->GetChildNodesIncRef(2, &nodeArr);
            
            RelVaultNode ** cur = nodeArr.Ptr();
            RelVaultNode ** end = nodeArr.Term();
            for (; cur != end; ++cur) {
                RelVaultNode * rvn = *cur;
                if (rvn->GetNodeType() == plVault::kNodeType_Image)
                    ++pictures;
                else if (rvn->GetNodeType() == plVault::kNodeType_TextNote)
                    ++notes;
                else if (rvn->GetNodeType() == plVault::kNodeType_MarkerGame)
                    ++markerGames;
                rvn->DecRef();
            }
            
            rvnAgeJrnlz->DecRef();
            break;
        }
        rvnPlr->DecRef();
        break;
    }       

    // create the tuple of usage numbers
    PyObject* retVal = PyTuple_New(4);
    PyTuple_SetItem(retVal, 0, PyLong_FromUnsignedLong(pictures));
    PyTuple_SetItem(retVal, 1, PyLong_FromUnsignedLong(notes));
    PyTuple_SetItem(retVal, 2, PyLong_FromUnsignedLong(markerGames));
    return retVal;
}
예제 #3
0
PyObject* pyAgeVault::GetAgeDevicesFolder( void )
{
    RelVaultNode * rvn = VaultGetAgeDevicesFolderIncRef();
    if (rvn) {
        PyObject * result = pyVaultFolderNode::New(rvn);
        rvn->DecRef();
        return result;
    }

    // just return a None object
    PYTHON_RETURN_NONE;
}
예제 #4
0
PyObject* pyAgeVault::GetAgeInfo()
{
    RelVaultNode * rvn = VaultGetAgeInfoNodeIncRef();
    if (rvn) {
        PyObject * result = pyVaultAgeInfoNode::New(rvn);
        rvn->DecRef();
        return result;
    }

    // just return a None object
    PYTHON_RETURN_NONE;
}
예제 #5
0
PyObject* pyAgeVault::GetSubAgeLink( const pyAgeInfoStruct & info )
{
    RelVaultNode * rvn = VaultFindAgeSubAgeLinkIncRef(info.GetAgeInfo());
    if (rvn) {
        PyObject * result = pyVaultAgeLinkNode::New(rvn);
        rvn->DecRef();
        return result;
    }

    // just return a None object
    PYTHON_RETURN_NONE;
}
예제 #6
0
const char* pyAgeVault::GetAgeGuid( void )
{
    RelVaultNode * rvn = VaultGetAgeInfoNodeIncRef();
    if (rvn) {
        VaultAgeInfoNode ageInfo(rvn);
        GuidToString(ageInfo.ageInstUuid, fAgeGuid, arrsize(fAgeGuid));
        rvn->DecRef();
    }
    else {
        fAgeGuid[0] = 0;
    }
    return fAgeGuid;
}
예제 #7
0
PyObject* pyAgeVault::FindNode( pyVaultNode* templateNode ) const
{
    if (RelVaultNode * rvn = VaultGetAgeNodeIncRef()) {
        RelVaultNode * find = rvn->GetChildNodeIncRef(templateNode->fNode, 1);
        rvn->DecRef();
        if (find) {
            PyObject * result = pyVaultNode::New(find);
            find->DecRef();
            return result;
        }
    }

    PYTHON_RETURN_NONE;
}
//==================================================================
// class RelVaultNode : public plVaultFolderNode
//
bool pyVaultPlayerInfoListNode::HasPlayer( uint32_t playerID )
{
    if (!fNode)
        return false;

    NetVaultNode * templateNode = NEWZERO(NetVaultNode);
    templateNode->IncRef();
    templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
    VaultPlayerInfoNode access(templateNode);
    access.SetPlayerId(playerID);
    
    RelVaultNode * rvn = fNode->GetChildNodeIncRef(templateNode, 1);
    if (rvn)
        rvn->DecRef();
    
    templateNode->DecRef();
    return (rvn != nil);
}
예제 #9
0
bool plNetLinkingMgr::IProcessVaultNotifyMsg(plVaultNotifyMsg* msg) 
{
    // No deferred link? Bye bye.
    if (fDeferredLink == nil)
        return false;

    plAgeLinkStruct* cur = GetAgeLink();
    RelVaultNode* cVaultLink = nil;
    switch (msg->GetType())
    {
        case plVaultNotifyMsg::kRegisteredChildAgeLink:
        case plVaultNotifyMsg::kRegisteredOwnedAge:
        case plVaultNotifyMsg::kRegisteredSubAgeLink:
            cVaultLink = VaultGetNodeIncRef(msg->GetArgs()->GetInt(plNetCommon::VaultTaskArgs::kAgeLinkNode));
            break;
        default:
            return false;
    }

    if (cVaultLink != nil)
    {
        // This is something that Cyan does... >.<
        // It's very useful though...
        VaultAgeLinkNode accLink(cVaultLink);
        accLink.CopyTo(cur);
        if (RelVaultNode* rvnInfo = cVaultLink->GetChildNodeIncRef(plVault::kNodeType_AgeInfo, 1))
        {
            VaultAgeInfoNode accInfo(rvnInfo);
            accInfo.CopyTo(cur->GetAgeInfo());
            rvnInfo->DecRef();
        }

        IDoLink(fDeferredLink);
        fDeferredLink = nil;
        return true;

        cVaultLink->DecRef();
    }

    return false;
}
예제 #10
0
void plNetLinkingMgr::IPostProcessLink( void )
{
    // Grab some useful things...
    plAgeLinkStruct* link = GetAgeLink();
    plAgeInfoStruct* info = link->GetAgeInfo();

    bool city = (info->GetAgeFilename().CompareI(kCityAgeFilename) == 0);
    bool hood = (info->GetAgeFilename().CompareI(kNeighborhoodAgeFilename) == 0);
    bool psnl = (info->GetAgeFilename().CompareI(kPersonalAgeFilename) == 0);

    // Update our online status 
    if (RelVaultNode* rvnInfo = VaultGetPlayerInfoNodeIncRef()) {
        VaultPlayerInfoNode accInfo(rvnInfo);
        wchar_t ageInstName[MAX_PATH];
        plUUID ageInstGuid = *info->GetAgeInstanceGuid();
        StrToUnicode(ageInstName, info->GetAgeInstanceName(), arrsize(ageInstName));
        accInfo.SetAgeInstName(ageInstName);
        accInfo.SetAgeInstUuid(ageInstGuid);
        accInfo.SetOnline(true);
        rvnInfo->DecRef();
    }
    
    switch (link->GetLinkingRules()) {

        case plNetCommon::LinkingRules::kOwnedBook: {
            // SPECIAL CASE: City: Every player ever created would be in the list; avoid that.
            if (city)
                break;
                
            {   // Ensure we're in the AgeOwners folder
                RelVaultNode* fldr = VaultGetAgeAgeOwnersFolderIncRef();
                RelVaultNode* info = VaultGetPlayerInfoNodeIncRef();
                
                if (fldr && info)
                    if (!fldr->IsParentOf(info->GetNodeId(), 1))
                        VaultAddChildNode(
                            fldr->GetNodeId(),
                            info->GetNodeId(),
                            NetCommGetPlayer()->playerInt,
                            nil,
                            nil
                        );
                
                if (fldr)
                    fldr->DecRef();
                if (info)
                    info->DecRef();
            }
        }
        break;  

        case plNetCommon::LinkingRules::kVisitBook: {
            // SPECIAL CASE: City: Every player ever created would be in the list; avoid that.
            if (city)
                break;
                
            {   // Ensure we're in the CanVisit folder
                RelVaultNode* fldr = VaultGetAgeCanVisitFolderIncRef();
                RelVaultNode* info = VaultGetPlayerInfoNodeIncRef();
                
                if (fldr && info)
                    if (!fldr->IsParentOf(info->GetNodeId(), 1))
                        VaultAddChildNode(
                            fldr->GetNodeId(),
                            info->GetNodeId(),
                            NetCommGetPlayer()->playerInt,
                            nil,
                            nil
                        );
                
                if (fldr)
                    fldr->DecRef();
                if (info)
                    info->DecRef();
            }
        }
        break;
        
        case plNetCommon::LinkingRules::kSubAgeBook: {
            // Register the previous age as a sub age of the current one so that we can link back to that instance
            plAgeLinkStruct subAgeLink;
            VaultAgeFindOrCreateSubAgeLink(GetPrevAgeLink()->GetAgeInfo(), &subAgeLink, NetCommGetAge()->ageInstId);
        }
        break;
    }
}