public int Send(BNetPacket packet) { if (packet == null) { throw new ArgumentNullException("packet"); } return(Send(packet.GetRawPacketData())); }
private static void SendResponse(IConnection client, int requestId, IMessage message) { var packet = new BNetPacket( new BNetHeader(0xfe, 0x0, requestId, (uint)message.SerializedSize, 0), message.ToByteArray()); client.Send(packet); }
public static void Identify(IConnection connection, CodedInputStream stream) { var header = new BNetHeader(stream); var payload = new byte[header.PayloadLength]; payload = stream.ReadRawBytes((int)header.PayloadLength); var packet = new BNetPacket(header, payload); var service = Service.GetByID(header.ServiceID); if (service == null) { Logger.Error("No service exists with id: 0x{0}", header.ServiceID.ToString("X2")); return; } //var method = service.DescriptorForType.Methods[(int)header.MethodID - 1]; //Logger.Warn("METHODID: {0}, from header: {1}", (uint)method.Options[bnet.protocol.Rpc.MethodId.Descriptor], header.MethodID); var method = service.DescriptorForType.Methods.Single(m => (uint)m.Options[bnet.protocol.Rpc.MethodId.Descriptor] == header.MethodID); var proto = service.GetRequestPrototype(method); var builder = proto.WeakCreateBuilderForType(); try { var message = builder.WeakMergeFrom(CodedInputStream.CreateInstance(packet.Payload.ToArray())).WeakBuild(); lock (service) // lock the service so that it's in-context client does not get changed.. { //Logger.Debug("service-call data:{0}", message.ToString()); ((IServerService)service).Client = (IBNetClient)connection.Client; service.CallMethod(method, null, message, (msg => SendResponse(connection, header.RequestID, msg))); } } catch (NotImplementedException) { Logger.Debug("Unimplemented service method: {0} {1}", service.GetType().Name, method.Name); } catch (UninitializedMessageException e) { Logger.Debug("Failed to parse message: {0}", e.Message); } catch (Exception e) { Logger.DebugException(e, string.Empty); } }
public static void Identify(IConnection connection, CodedInputStream stream) { var header = new BNetHeader(stream); var payload = new byte[header.PayloadLength]; payload = stream.ReadRawBytes((int)header.PayloadLength); var packet = new BNetPacket(header, payload); var service = Service.GetByID(header.ServiceID); if (service == null) { Logger.Error("No service exists with id: 0x{0}", header.ServiceID.ToString("X2")); return; } //var method = service.DescriptorForType.Methods[(int)header.MethodID - 1]; //Logger.Warn("METHODID: {0}, from header: {1}", (uint)method.Options[bnet.protocol.Rpc.MethodId.Descriptor], header.MethodID); var method = service.DescriptorForType.Methods.Single(m => (uint)m.Options[bnet.protocol.Rpc.MethodId.Descriptor] == header.MethodID); var proto = service.GetRequestPrototype(method); var builder = proto.WeakCreateBuilderForType(); try { var message = builder.WeakMergeFrom(CodedInputStream.CreateInstance(packet.Payload.ToArray())).WeakBuild(); lock (service) // lock the service so that it's in-context client does not get changed.. { //Logger.Debug("service-call data:{0}", message.ToString()); ((IServerService) service).Client = (IBNetClient)connection.Client; service.CallMethod(method, null, message, (msg => SendResponse(connection, header.RequestID, msg))); } } catch (NotImplementedException) { Logger.Debug("Unimplemented service method: {0} {1}", service.GetType().Name, method.Name); } catch (UninitializedMessageException e) { Logger.Debug("Failed to parse message: {0}", e.Message); } catch (Exception e) { Logger.DebugException(e, string.Empty); } }
public void CallMethod(MethodDescriptor method, IMessage request, ulong localObjectId) { var serviceName = method.Service.FullName; var serviceHash = StringHashHelper.HashIdentity(serviceName); if (!this.Services.ContainsKey(serviceHash)) { Logger.Error("Not bound to client service {0} [0x{1}] yet.", serviceName, serviceHash.ToString("X8")); return; } var serviceId = this.Services[serviceHash]; var remoteObjectId = GetRemoteObjectID(localObjectId); Logger.Debug("Calling {0} localObjectId={1}, remoteObjectId={2}", method.FullName, localObjectId, remoteObjectId); var packet = new BNetPacket( new BNetHeader((byte)serviceId, (uint)(method.Index + 1), this._requestCounter++, (uint)request.SerializedSize, remoteObjectId), request.ToByteArray()); this.Connection.Send(packet); }
public int Send(BNetPacket packet) { if (packet == null) throw new ArgumentNullException("packet"); return Send(packet.GetRawPacketData()); }