public void ProcessCall(Message.Call call) { var processCall = processors[call.MethodId].Call; if (processCall != null) { processCall(call); } else { var response = new Message(call.Data, MessageType.Exception); RemotingException x = new RemotingException(RemotingException.ExceptionType.UnknownMethod, "Invalid method id: '" + call.MethodId + "'"); response.Serializer.WriteI32(call.Id); x.Write(response.Serializer); response.Dispatch(); } }
public unsafe void DispatchChanges() { foreach (var reference in referencesChanged) { var bitFieldsCount = reference.DataObject.BaseDataObjectCount + 1; var bitFields = stackalloc BitField[bitFieldsCount]; reference.DataObject.GetResetChanges(bitFields); foreach (var peer in reference.Subscribers) { var peerData = new Message(peer, remotingManager, reference.LocalId, 0, MessageType.ReferenceChanges); // TODO: Optimize this. Dont't serialize again for each peer. reference.DataObject.Write(peerData.Serializer, bitFields, bitFieldsCount, peerData); peerData.Dispatch(); } } }
private void ProcessContextRequest(Message data) { var remoteId = data.Header.RemoteId; var contextId = Loader.ReadContextId(data); ContextInfo context; if (!contextIdToContext.TryGetValue(contextId, out context)) { //TODO: check data.Peer permissions var task = Loader.LoadContext(contextId); task.ContinueWith(t => { if(t.Result == null) throw new Exception("Context could not be loaded."); var cxt = GetCreateContext(t.Result); var res = new Message(data.Peer, remotingManager, cxt.LocalId, remoteId, MessageType.ContextResponse); res.Dispatch(); }); return; } var response = new Message(data.Peer, remotingManager, context.LocalId, remoteId, MessageType.ContextResponse); response.Dispatch(); }
public void RequestContext(RemotingPeer peer, Assembly assembly) { var context = GetCreateContext(assembly); var request = new Message(peer, remotingManager, context.LocalId, 0, MessageType.ContextRequest); context.ContextId.Write(request); request.Dispatch(); }
public void Subscribe(IObservableDataObject dataObject, RemotingPeer peer, int remoteId) { Reference reference; if (!dataObjectToReference.TryGetValue(dataObject, out reference)) reference = CreateReference(dataObject); reference.Subscription = new Subscription(peer, remoteId); subscriptionToReference.Add(reference.Subscription, reference); var data = new Message(peer, remotingManager, reference.LocalId, remoteId, MessageType.ReferenceSubscribe); data.Dispatch(); }