/// <summary>
        /// Received a DNA update from the client.   Save the DNA via the AvatarManagerServiceAPI and broadcast to other clients
        /// TODO:  Verify the dna is valid
        /// </summary>
        /// <param name="message"></param>
        private void RecvDnaUpdate(Message message)
        {
            string      newDnaString = CheckType.TryAssignType <string>(message.Data[0]);
            XmlDocument newDna       = new XmlDocument();

            newDna.LoadXml(newDnaString);
            mLogger.Info("RecvDnaUpdate: " + mAvatarId.ToString() + ": " + newDnaString);

            // Get list of ItemIds from DNA
            List <ItemId> itemIds;

            AvatarXmlUtil.GetItemIdsFromAvatarDnaNode(newDna, out itemIds);

            // Get XML of assets from ItemIds
            XmlDocument assetXml = mServerAssetRepository.GetXmlDna(itemIds);

            // Replace the DNA in the message with the asset xml
            message.Data[0] = assetXml.OuterXml;
            mObjectData[3]  = assetXml.InnerXml;

            // Broadcast the change out
            BroadcastMessage(message);

            // Save the dna to the DB
            AvatarManagerServiceAPI.UpdateAvatarDna(mAvatarId, newDna, delegate(XmlDocument xmlResponse)
            {
                mLogger.Info("RecvDnaUpdate, DNA saved: " + mAvatarId.ToString() + "\n" + xmlResponse.OuterXml);
            });
        }
Example #2
0
        private void GetAvatarServiceResponse(XmlNode avatarXmlNode, string nickname, Guid sessionId, ZoneId zoneId, Action <bool> gotAvatarServiceResponse)
        {
            List <ItemId> itemIds = null;
            AvatarId      avatarId;

            try
            {
                if (AvatarXmlUtil.GetAvatarInfoFromAvatarXmlNode(avatarXmlNode, out avatarId, out itemIds))
                {
                    Dna savedDna = mServerAssetRepository.GetDna(itemIds);

                    // Create an updated dna by starting with the reference dna and updating it with the savedDna
                    GetReferenceAvatar(delegate(Dna referenceAvatarDna)
                    {
                        Dna avatarDna = new Dna(mReferenceAvatarDna);
                        avatarDna.UpdateDna(savedDna);
                        // TODO?  If UpdateDna overwrites something or fills in missing data we should save the dna back to the db

                        // Get xml from updated avatar dna
                        XmlDocument dnaXml = mServerAssetRepository.GetXmlDna(avatarDna.GetItemIdList());

                        DistributedObjectId distributedObjectId = mDistributedObjectIdManager.GetNewId();

                        ServerAccount serverAccount = mServerStateMachine.SessionManager.GetServerAccountFromSessionId(sessionId);
                        ServerDistributedAvatar serverDistributedAvatar = new ServerDistributedAvatar(distributedObjectId, avatarId, sessionId, nickname, dnaXml, serverAccount, mServerObjectRepository, mServerAssetRepository);
                        //register object with object repository
                        mServerObjectRepository.AddObjectToSessionId(sessionId, serverDistributedAvatar);
                        //register object with session manager
                        mServerEngine.ProcessZoneChange(serverDistributedAvatar, zoneId);
                        gotAvatarServiceResponse(true);
                    });
                }
                else
                {
                    gotAvatarServiceResponse(false);
                }
            }
            catch (System.Exception ex)
            {
                StateServerAssert.Assert(ex);
                gotAvatarServiceResponse(false);
            }
        }
Example #3
0
        /// <summary>
        /// Get a reference system avatar.  This avatar is used to fill in missing required info when pulling an avatar from the db
        /// </summary>
        private void GetReferenceAvatar(Action <Dna> gotReferenceAvatarFinished)
        {
            Action <XmlDocument> systemAvatarCallback = delegate(XmlDocument xmlResponse)
            {
                // Get the avatars for the friends without Hangout Avatars
                XmlNode       avatarXmlNode = xmlResponse.SelectSingleNode("/Avatars/Avatar[@AvatarId='1']");
                AvatarId      avatarId;
                List <ItemId> itemIds = null;
                if (AvatarXmlUtil.GetAvatarInfoFromAvatarXmlNode(avatarXmlNode, out avatarId, out itemIds))
                {
                    //use the ServerAssetRepo to composite the List<ItemId> into an XmlNode
                    XmlDocument itemsXml = mServerAssetRepository.GetXmlDna(itemIds);

                    // Get a list of AssetInfos from this xml
                    IEnumerable <AssetInfo> assetInfoList = ServerAssetInfo.Parse(itemsXml);

                    // Make dna
                    mReferenceAvatarDna = new Dna();
                    mReferenceAvatarDna.UpdateDna(assetInfoList);
                    gotReferenceAvatarFinished(mReferenceAvatarDna);
                    mLogger.Debug("System avatar xml = " + xmlResponse.OuterXml);
                }
                else
                {
                    StateServerAssert.Assert(new Exception("Didn't get a valid system avatar for reference avatar, using an empty DNA"));
                    mReferenceAvatarDna = new Dna();
                    gotReferenceAvatarFinished(mReferenceAvatarDna);
                }
            };

            if (mReferenceAvatarDna == null)
            {
                AvatarManagerServiceAPI.GetSystemAvatars(systemAvatarCallback);
            }
            else
            {
                gotReferenceAvatarFinished(mReferenceAvatarDna);
            }
        }
Example #4
0
        private void ReplaceItemIdsWithDna(XmlElement avatarNode)
        {
            if (avatarNode == null)
            {
                throw new ArgumentNullException("avatarNode");
            }

            if (HasResolvedAssets(avatarNode))
            {
                return;
            }

            XmlDocument avatarXmlDoc = avatarNode.OwnerDocument;

            List <ItemId> avatarItemIds;

            if (AvatarXmlUtil.GetItemIdsFromAvatarXmlNode(avatarNode, out avatarItemIds))
            {
                XmlDocument assetsXml = mServerStateMachine.ServerAssetRepository.GetXmlDna(avatarItemIds);
                XmlNode     dnaNode   = avatarNode.SelectSingleNode("AvatarDna");

                if (dnaNode == null)
                {
                    throw new Exception("avatarNode is not in the expected format.\n" + avatarNode.OuterXml);
                }

                dnaNode.RemoveAll();
                dnaNode.AppendChild(avatarXmlDoc.ImportNode(assetsXml.SelectSingleNode("//Items"), true));
            }
            else
            {
                XmlNode errorNode = avatarXmlDoc.CreateElement("Error");
                errorNode.InnerText = "avatarNode does not have the expected format";
                avatarNode.AppendChild(errorNode);
            }
        }