示例#1
0
        public async void Handle(IGluonSession session, DataServiceWrapperPDU packet)
        {
            try //data service throws exceptions (SecurityException, etc) when invalid requests are made. These should not crash the server...
            {
                if (packet.Body is cTSOTopicUpdateMessage)
                {
                    //Client wants to update a value in the data service
                    var update = packet.Body as cTSOTopicUpdateMessage;
                    DataService.ApplyUpdate(update, session);

                    List <uint> resultDotPath = new List <uint>();
                    foreach (var item in update.DotPath)
                    {
                        resultDotPath.Add(item);
                        if (item == packet.RequestTypeID)
                        {
                            break;
                        }
                    }

                    try
                    {
                        var result = await DataService.SerializePath(resultDotPath.ToArray());

                        if (result != null)
                        {
                            session.Write(new DataServiceWrapperPDU()
                            {
                                SendingAvatarID = packet.SendingAvatarID,
                                RequestTypeID   = packet.RequestTypeID,
                                Body            = result
                            });
                        }
                    } catch (Exception e)
                    {
                        //TODO
                        //keep this silent for now - bookmarks tend to spam errors.
                    }
                }
            }
            catch (Exception e)
            {
                LOG.Error(e, "Gluon DataService request failed!");
            }
        }
示例#2
0
        public void Sync(object item, string[] fieldPaths)
        {
            var updates = new List <cTSOTopicUpdateMessage>();

            foreach (var fieldPath in fieldPaths)
            {
                var path    = fieldPath.Split('.');
                var dotPath = GetDotPath(item, fieldPath);
                var curObj  = item.GetType().GetProperty(path[0]).GetValue(item);

                for (int i = 1; i < path.Length; i++)
                {
                    var curField = GetFieldByName(curObj.GetType(), path[i]);
                    dotPath[i + 2] = curField.ID;
                    curObj         = curObj.GetType().GetProperty(path[i]).GetValue(curObj);
                }

                updates.Add(SerializeUpdate(curObj, dotPath));
            }

            if (updates.Count == 0)
            {
                return;
            }
            var packets = new DataServiceWrapperPDU[updates.Count];

            for (int i = 0; i < updates.Count; i++)
            {
                var messageId = NextMessageId();
                var update    = updates[i];
                packets[i] = new DataServiceWrapperPDU()
                {
                    Body            = update,
                    RequestTypeID   = 0,
                    SendingAvatarID = messageId
                };
            }

            CityClient.Write(packets);
        }
示例#3
0
        public Task <object> Request(MaskedStruct mask, uint id)
        {
            var messageId = NextMessageId();
            var request   = new DataServiceWrapperPDU()
            {
                RequestTypeID   = mask.GetID(),
                SendingAvatarID = messageId, //Reusing this field for easier callbacks rather than scoping them
                Body            = new cTSONetMessageStandard()
                {
                    DataServiceType = mask.GetID(),
                    Parameter       = id
                }
            };

            CityClient.Write(request);

            //TODO: Add timeouts
            var result = new PendingDataRequest(messageId, this, Get(mask, id));

            lock (PendingCallbacks) PendingCallbacks.Add(messageId, result);
            return(result.Task);
        }
示例#4
0
        public void Sync(IAriesSession target, T item)
        {
            var asObject = (object)item;
            var updates  = DataService.SerializeUpdate(Fields, asObject, (uint)KeyField.GetValue(asObject));

            if (updates.Count == 0)
            {
                return;
            }
            var packets = new DataServiceWrapperPDU[updates.Count];

            for (int i = 0; i < updates.Count; i++)
            {
                var update = updates[i];
                packets[i] = new DataServiceWrapperPDU()
                {
                    Body            = update,
                    RequestTypeID   = 0,
                    SendingAvatarID = 0
                };
            }

            target.Write(packets);
        }
示例#5
0
        /// <summary>
        /// The user is asking for some in RAM data
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        public async void Handle(IVoltronSession session, DataServiceWrapperPDU packet)
        {
            try //data service throws exceptions (SecurityException, etc) when invalid requests are made. These should not crash the server...
            {
                if (packet.Body is cTSONetMessageStandard)
                {
                    var msg = (cTSONetMessageStandard)packet.Body;
                    if (msg.ComplexParameter is cTSOTopicUpdateMessage)
                    {
                        var update = msg.ComplexParameter as cTSOTopicUpdateMessage;
                        DataService.ApplyUpdate(update, session);
                        return;
                    }

                    var type = MaskedStructUtils.FromID(packet.RequestTypeID);

                    if (!msg.Parameter.HasValue)
                    {
                        return;
                    }

                    //Lookup the entity, then process the request and send the response
                    var task = DataService.Get(type, msg.Parameter.Value);
                    if (task != null)
                    {
                        var entity = await task;

                        var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value);
                        for (int i = 0; i < serialized.Count; i++)
                        {
                            object serial = serialized[i];
                            session.Write(new DataServiceWrapperPDU()
                            {
                                SendingAvatarID = packet.SendingAvatarID,
                                RequestTypeID   = packet.RequestTypeID,
                                Body            = serial
                            });
                        }
                    }
                }
                else if (packet.Body is cTSOTopicUpdateMessage)
                {
                    //Client wants to update a value in the data service
                    var update = packet.Body as cTSOTopicUpdateMessage;
                    DataService.ApplyUpdate(update, session);

                    List <uint> resultDotPath = new List <uint>();
                    foreach (var item in update.DotPath)
                    {
                        var ires = item;
                        if (ires == 0x1095C1E1)
                        {
                            ires = 0x7EA285CD;                     //rewrite: filter id -> returns -> result list
                        }
                        resultDotPath.Add(ires);

                        if (ires == packet.RequestTypeID)
                        {
                            break;
                        }
                    }

                    var result = await DataService.SerializePath(resultDotPath.ToArray());

                    if (result != null)
                    {
                        session.Write(new DataServiceWrapperPDU()
                        {
                            SendingAvatarID = packet.SendingAvatarID,
                            RequestTypeID   = packet.RequestTypeID,
                            Body            = result
                        });
                    }

                    /*var task = DataService.Get(update.DotPath[0], update.DotPath[1]);
                     * if(task != null)
                     * {
                     *  var entity = await task;
                     *
                     *  var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value);
                     * }*/
                    /**/
                }
            }
            catch (Exception e)
            {
                //SerializePath throws generic exceptions.
                //plus we don't want weird special cases crashing the whole server.
                LOG.Error(e, "Voltron DataService request failed: from avatar " + session.AvatarId + ", \n" + e.ToString());
            }
        }
示例#6
0
        /// <summary>
        /// The user is asking for some in RAM data
        /// </summary>
        /// <param name="session"></param>
        /// <param name="packet"></param>
        public async void Handle(IVoltronSession session, DataServiceWrapperPDU packet)
        {
            try //data service throws exceptions (SecurityException, etc) when invalid requests are made. These should not crash the server...
            {
                if (packet.Body is cTSONetMessageStandard)
                {
                    var msg = (cTSONetMessageStandard)packet.Body;
                    if (msg.ComplexParameter is cTSOTopicUpdateMessage)
                    {
                        var update = msg.ComplexParameter as cTSOTopicUpdateMessage;
                        DataService.ApplyUpdate(update, session);
                        return;
                    }

                    var type = MaskedStructUtils.FromID(packet.RequestTypeID);

                    if (!msg.Parameter.HasValue)
                    {
                        return;
                    }

                    //if (type == MaskedStruct.MapView_NearZoom_Lot_Thumbnail || type == MaskedStruct.Thumbnail_Lot || type == MaskedStruct.MapView_NearZoom_Lot) { }

                    if (type != MaskedStruct.MyAvatar && type != MaskedStruct.SimPage_Main && type != MaskedStruct.MapView_RollOverInfo_Lot_Price &&
                        type != MaskedStruct.MapView_RollOverInfo_Lot && type != MaskedStruct.Unknown &&
                        type != MaskedStruct.SimPage_DescriptionPanel && type != MaskedStruct.PropertyPage_LotInfo &&
                        type != MaskedStruct.Messaging_Message_Avatar && type != MaskedStruct.Messaging_Icon_Avatar &&
                        type != MaskedStruct.MapView_NearZoom_Lot_Thumbnail && type != MaskedStruct.Thumbnail_Lot &&
                        type != MaskedStruct.CurrentCity && type != MaskedStruct.MapView_NearZoom_Lot &&
                        type != MaskedStruct.Thumbnail_Avatar && type != MaskedStruct.SimPage_MyLot &&
                        type != MaskedStruct.SimPage_JobsPanel && type != MaskedStruct.FriendshipWeb_Avatar &&
                        type != MaskedStruct.SimPage_SkillsPanel && type != MaskedStruct.AdmitInfo_Lot)
                    {
                        //Currently broken for some reason
                        return;
                    }

                    //Lookup the entity, then process the request and send the response
                    var task = DataService.Get(type, msg.Parameter.Value);
                    if (task != null)
                    {
                        var entity = await task;

                        var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value);
                        for (int i = 0; i < serialized.Count; i++)
                        {
                            object serial = serialized[i];
                            session.Write(new DataServiceWrapperPDU()
                            {
                                SendingAvatarID = packet.SendingAvatarID,
                                RequestTypeID   = packet.RequestTypeID,
                                Body            = serial
                            });
                        }
                    }
                }
                else if (packet.Body is cTSOTopicUpdateMessage)
                {
                    //Client wants to update a value in the data service
                    var update = packet.Body as cTSOTopicUpdateMessage;
                    DataService.ApplyUpdate(update, session);

                    List <uint> resultDotPath = new List <uint>();
                    foreach (var item in update.DotPath)
                    {
                        var ires = item;
                        if (ires == 0x1095C1E1)
                        {
                            ires = 0x7EA285CD;                     //rewrite: filter id -> returns -> result list
                        }
                        resultDotPath.Add(ires);

                        if (ires == packet.RequestTypeID)
                        {
                            break;
                        }
                    }

                    var result = await DataService.SerializePath(resultDotPath.ToArray());

                    if (result != null)
                    {
                        session.Write(new DataServiceWrapperPDU()
                        {
                            SendingAvatarID = packet.SendingAvatarID,
                            RequestTypeID   = packet.RequestTypeID,
                            Body            = result
                        });
                    }

                    /*var task = DataService.Get(update.DotPath[0], update.DotPath[1]);
                     * if(task != null)
                     * {
                     *  var entity = await task;
                     *
                     *  var serialized = DataService.SerializeUpdate(type, entity, msg.Parameter.Value);
                     * }*/
                    /**/
                }
            }
            catch (Exception e)
            {
                //SerializePath throws generic exceptions.
                //plus we don't want weird special cases crashing the whole server.
                LOG.Error(e, "Voltron DataService request failed!");
            }
        }