mirror of https://github.com/icedream/npsharp.git
Refactoring RPC.Packets namespace to RPC.Messages and adding support for friends messages.
parent
bc1e9ef662
commit
7724c5b221
|
@ -1,4 +1,5 @@
|
||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue">ID</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NP/@EntryIndexedValue">NP</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NP/@EntryIndexedValue">NP</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NPID/@EntryIndexedValue">NPID</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NPID/@EntryIndexedValue">NPID</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RPC/@EntryIndexedValue">RPC</s:String></wpf:ResourceDictionary>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RPC/@EntryIndexedValue">RPC</s:String></wpf:ResourceDictionary>
|
|
@ -6,7 +6,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using log4net;
|
using log4net;
|
||||||
using NPSharp.RPC;
|
using NPSharp.RPC;
|
||||||
using NPSharp.RPC.Packets;
|
using NPSharp.RPC.Messages;
|
||||||
|
|
||||||
namespace NPSharp
|
namespace NPSharp
|
||||||
{
|
{
|
||||||
|
@ -88,7 +88,7 @@ namespace NPSharp
|
||||||
_log.Debug("Disconnect() start");
|
_log.Debug("Disconnect() start");
|
||||||
|
|
||||||
_cancellationTokenSource.Cancel(true); // TODO: Find a cleaner way to cancel _processingTask (focus: _rpc.Read)
|
_cancellationTokenSource.Cancel(true); // TODO: Find a cleaner way to cancel _processingTask (focus: _rpc.Read)
|
||||||
_procTask.Wait(_cancellationToken);
|
//_procTask.Wait(_cancellationToken);
|
||||||
_rpc.Close();
|
_rpc.Close();
|
||||||
|
|
||||||
LoginId = 0;
|
LoginId = 0;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1006)]
|
[Packet(1006)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class AuthenticateExternalStatusMessage : RPCServerMessage
|
public sealed class AuthenticateExternalStatusMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public int Status { get; set; }
|
public int Status { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1010)]
|
[Packet(1010)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class AuthenticateResultMessage : RPCServerMessage
|
public sealed class AuthenticateResultMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public int Result { get; set; }
|
public int Result { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1003)]
|
[Packet(1003)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class AuthenticateWithTokenMessage : RPCClientMessage
|
public sealed class AuthenticateWithTokenMessage : RPCClientMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public string Token { get; set; }
|
public string Token { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(2001)]
|
[Packet(2001)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class CloseAppMessage : RPCServerMessage
|
public sealed class CloseAppMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public string Reason { get; set; }
|
public string Reason { get; set; }
|
|
@ -0,0 +1,17 @@
|
||||||
|
using System;
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
public sealed class FriendDetails
|
||||||
|
{
|
||||||
|
internal FriendDetails() { }
|
||||||
|
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public UInt64 NPID { get; set; }
|
||||||
|
|
||||||
|
[ProtoMember(2)]
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1202)]
|
||||||
|
public sealed class FriendsGetProfileDataMessage : RPCClientMessage
|
||||||
|
{
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public UInt64[] IDs { get; set; }
|
||||||
|
|
||||||
|
[ProtoMember(2)]
|
||||||
|
public string ProfileType { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1203)]
|
||||||
|
public sealed class FriendsGetProfileDataResultMessage : RPCServerMessage
|
||||||
|
{
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public ProfileDataResult[] Results { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
using System;
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1214)]
|
||||||
|
public sealed class FriendsGetUserAvatarMessage : RPCClientMessage
|
||||||
|
{
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public Int32 Guid { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1215)]
|
||||||
|
public sealed class FriendsGetUserAvatarResultMessage : RPCServerMessage
|
||||||
|
{
|
||||||
|
internal FriendsGetUserAvatarResultMessage() { }
|
||||||
|
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public int Result { get; internal set; }
|
||||||
|
|
||||||
|
[ProtoMember(2)]
|
||||||
|
public int Guid { get; internal set; }
|
||||||
|
|
||||||
|
[ProtoMember(3)]
|
||||||
|
public byte[] FileData { get; internal set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
public sealed class FriendsPresence
|
||||||
|
{
|
||||||
|
internal FriendsPresence()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public string Key { get; set; }
|
||||||
|
|
||||||
|
[ProtoMember(2)]
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System;
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1212)]
|
||||||
|
public sealed class FriendsPresenceMessage
|
||||||
|
{
|
||||||
|
internal FriendsPresenceMessage()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public UInt64 Friend { get; internal set; }
|
||||||
|
|
||||||
|
[ProtoMember(2)]
|
||||||
|
public Int32 PresenceState { get; internal set; }
|
||||||
|
|
||||||
|
[ProtoMember(3)]
|
||||||
|
public UInt64 CurrentServer { get; internal set; }
|
||||||
|
|
||||||
|
[ProtoMember(4)]
|
||||||
|
public FriendsPresence[] Presence { get; internal set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1211)]
|
||||||
|
public sealed class FriendsRosterMessage : RPCServerMessage
|
||||||
|
{
|
||||||
|
internal FriendsRosterMessage() { }
|
||||||
|
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public FriendDetails[] Friends { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1213)]
|
||||||
|
public sealed class FriendsSetPresenceMessage : RPCClientMessage
|
||||||
|
{
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public FriendsPresence[] Presence { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
using System;
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
[Packet(1201)]
|
||||||
|
public sealed class FriendsSetSteamIDMessage : RPCClientMessage
|
||||||
|
{
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public UInt64 SteamID { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1000)]
|
[Packet(1000)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class HelloMessage : RPCServerMessage
|
public sealed class HelloMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
// I seriously have no idea where in the code this is used but whatever
|
// I seriously have no idea where in the code this is used but whatever
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(2002)]
|
[Packet(2002)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class MessagingSendDataMessage : RPCClientMessage
|
public sealed class MessagingSendDataMessage : RPCClientMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public ulong NPID { get; set; }
|
public ulong NPID { get; set; }
|
|
@ -1,8 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
class PacketAttribute : Attribute
|
internal sealed class PacketAttribute : Attribute
|
||||||
{
|
{
|
||||||
public PacketAttribute(uint type)
|
public PacketAttribute(uint type)
|
||||||
{
|
{
|
|
@ -0,0 +1,17 @@
|
||||||
|
using System;
|
||||||
|
using ProtoBuf;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
[ProtoContract]
|
||||||
|
public sealed class ProfileDataResult
|
||||||
|
{
|
||||||
|
internal ProfileDataResult() { }
|
||||||
|
|
||||||
|
[ProtoMember(1)]
|
||||||
|
public UInt64 NPID { get; set; }
|
||||||
|
|
||||||
|
[ProtoMember(2)]
|
||||||
|
public byte[] Profile { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using log4net;
|
||||||
|
|
||||||
|
namespace NPSharp.RPC.Messages
|
||||||
|
{
|
||||||
|
public abstract class RPCClientMessage : RPCMessage
|
||||||
|
{
|
||||||
|
|
||||||
|
private static readonly ILog _log;
|
||||||
|
|
||||||
|
static RPCClientMessage()
|
||||||
|
{
|
||||||
|
_log = LogManager.GetLogger("RPCClientMessage");
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Serialize(uint id)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
foreach (var prop in GetType().GetProperties())
|
||||||
|
{
|
||||||
|
Console.WriteLine("\t{0} = {1}", prop.Name, prop.GetValue(this));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
byte[] content;
|
||||||
|
using (var bufferStream = new MemoryStream())
|
||||||
|
{
|
||||||
|
ProtoBuf.Serializer.Serialize(bufferStream, this);
|
||||||
|
bufferStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
content = bufferStream.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
_log.DebugFormat("Serialized packet to {0} bytes", content.Length);
|
||||||
|
|
||||||
|
byte[] buffArray;
|
||||||
|
using (var ms = new MemoryStream())
|
||||||
|
{
|
||||||
|
using (var bw = new BinaryWriter(ms))
|
||||||
|
{
|
||||||
|
bw.Write(Signature);
|
||||||
|
bw.Write((uint)content.Length);
|
||||||
|
bw.Write(GetTypeId());
|
||||||
|
bw.Write(id);
|
||||||
|
bw.Write(content);
|
||||||
|
bw.Flush();
|
||||||
|
|
||||||
|
ms.Seek(0, SeekOrigin.Begin);
|
||||||
|
buffArray = ms.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
Console.Write("\t");
|
||||||
|
|
||||||
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
Console.Write(BitConverter.ToString(buffArray, 0, sizeof(uint)).Replace("-", ""));
|
||||||
|
|
||||||
|
Console.ResetColor();
|
||||||
|
Console.ForegroundColor = ConsoleColor.DarkRed;
|
||||||
|
Console.Write(BitConverter.ToString(buffArray, 1 * sizeof(uint), sizeof(uint)).Replace("-", ""));
|
||||||
|
|
||||||
|
Console.ResetColor();
|
||||||
|
Console.ForegroundColor = ConsoleColor.Green;
|
||||||
|
Console.Write(BitConverter.ToString(buffArray, 2 * sizeof(uint), sizeof(uint)).Replace("-", ""));
|
||||||
|
|
||||||
|
Console.ResetColor();
|
||||||
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||||
|
Console.Write(BitConverter.ToString(buffArray, 3 * sizeof(uint), sizeof(uint)).Replace("-", ""));
|
||||||
|
|
||||||
|
Console.ResetColor();
|
||||||
|
Console.ForegroundColor = ConsoleColor.Magenta;
|
||||||
|
Console.Write(BitConverter.ToString(buffArray, 4 * sizeof(uint)).Replace("-", ""));
|
||||||
|
|
||||||
|
Console.ResetColor();
|
||||||
|
Console.WriteLine();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return buffArray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
public class RPCMessage
|
public abstract class RPCMessage
|
||||||
{
|
{
|
||||||
internal const uint Signature = 0xDEADC0DE; // I wonder if aiw3 changed this since kernal noted it in his source code.
|
internal const uint Signature = 0xDEADC0DE; // I wonder if aiw3 changed this since kernal noted it in his source code.
|
||||||
|
|
|
@ -1,34 +1,64 @@
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using log4net;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
public class RPCServerMessage : RPCMessage
|
public abstract class RPCServerMessage : RPCMessage
|
||||||
{
|
{
|
||||||
|
|
||||||
|
private static readonly ILog Log;
|
||||||
|
|
||||||
|
static RPCServerMessage()
|
||||||
|
{
|
||||||
|
Log = LogManager.GetLogger("RPCServerMessage");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internal constructor to make classes unconstructible from outside
|
||||||
|
internal RPCServerMessage() { }
|
||||||
|
|
||||||
public uint MessageId { get; private set; }
|
public uint MessageId { get; private set; }
|
||||||
|
|
||||||
public static RPCServerMessage Deserialize(NetworkStream ns)
|
public static RPCServerMessage Deserialize(NetworkStream ns)
|
||||||
{
|
{
|
||||||
var header = new byte[16];
|
var header = new byte[4 * sizeof(uint)];
|
||||||
|
Log.Debug("Reading...");
|
||||||
var l = ns.Read(header, 0, header.Length);
|
var l = ns.Read(header, 0, header.Length);
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
|
{
|
||||||
|
Log.Debug("Received 0 bytes");
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
if (l < 16)
|
if (l < 16)
|
||||||
|
{
|
||||||
|
Log.ErrorFormat("Received incomplete header ({0} bytes of 16 wanted bytes)", l);
|
||||||
throw new ProtocolViolationException("Received incomplete header");
|
throw new ProtocolViolationException("Received incomplete header");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint signature, length, type, pid;
|
||||||
|
using (var ms = new MemoryStream(header))
|
||||||
|
{
|
||||||
|
using (var br = new BinaryReader(ms))
|
||||||
|
{
|
||||||
|
signature = br.ReadUInt32();
|
||||||
|
length = br.ReadUInt32();
|
||||||
|
type = br.ReadUInt32();
|
||||||
|
pid = br.ReadUInt32();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var signature = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToUInt32(header, 0));
|
|
||||||
var length = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToUInt32(header, 4));
|
|
||||||
var type = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToUInt32(header, 8));
|
|
||||||
var buffer = new byte[length];
|
var buffer = new byte[length];
|
||||||
ns.Read(buffer, 0, buffer.Length);
|
ns.Read(buffer, 0, buffer.Length);
|
||||||
|
|
||||||
if (signature != Signature)
|
if (signature != Signature)
|
||||||
|
{
|
||||||
|
Log.Error("Received invalid signature");
|
||||||
throw new ProtocolViolationException("Received packet with invalid signature");
|
throw new ProtocolViolationException("Received packet with invalid signature");
|
||||||
|
}
|
||||||
|
|
||||||
RPCServerMessage packet;
|
RPCServerMessage packet;
|
||||||
|
|
||||||
|
@ -42,14 +72,13 @@ namespace NPSharp.RPC.Packets
|
||||||
).ToArray();
|
).ToArray();
|
||||||
if (!types.Any())
|
if (!types.Any())
|
||||||
{
|
{
|
||||||
throw new ProtocolViolationException("Received packet of unknown type");
|
throw new ProtocolViolationException(string.Format("Received packet of unknown type ({0})", type));
|
||||||
}
|
}
|
||||||
if (types.Count() > 1)
|
if (types.Count() > 1)
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
Debug.Fail(string.Format("Bug in program code: Found more than 1 type for packet ID {0}", type));
|
Debug.Fail(string.Format("Bug in program code: Found more than 1 type for packet ID {0}", type));
|
||||||
#else
|
#else
|
||||||
// TODO: log4net
|
|
||||||
return null;
|
return null;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -59,7 +88,7 @@ namespace NPSharp.RPC.Packets
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
packet.MessageId = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToUInt32(header, 12));
|
packet.MessageId = pid;
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
[Packet(1101)]
|
[Packet(1101)]
|
||||||
class StorageGetPublisherFileMessage : RPCClientMessage
|
public sealed class StorageGetPublisherFileMessage : RPCClientMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public string FileName { get; set; }
|
public string FileName { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1102)]
|
[Packet(1102)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class StorageGetUserFileMessage : RPCClientMessage
|
public sealed class StorageGetUserFileMessage : RPCClientMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public string FileName { get; set; }
|
public string FileName { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1111)]
|
[Packet(1111)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class StoragePublisherFileMessage : RPCServerMessage
|
public sealed class StoragePublisherFileMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public int Result { get; set; }
|
public int Result { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1104)]
|
[Packet(1104)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class StorageSendRandomStringMessage : RPCClientMessage
|
public sealed class StorageSendRandomStringMessage : RPCClientMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public string RandomString { get; set; }
|
public string RandomString { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1112)]
|
[Packet(1112)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class StorageUserFileMessage : RPCServerMessage
|
public sealed class StorageUserFileMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public int Result { get; set; }
|
public int Result { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1103)]
|
[Packet(1103)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class StorageWriteUserFileMessage : RPCClientMessage
|
public sealed class StorageWriteUserFileMessage : RPCClientMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public string FileName { get; set; }
|
public string FileName { get; set; }
|
|
@ -1,10 +1,10 @@
|
||||||
using ProtoBuf;
|
using ProtoBuf;
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
namespace NPSharp.RPC.Messages
|
||||||
{
|
{
|
||||||
[Packet(1113)]
|
[Packet(1113)]
|
||||||
[ProtoContract]
|
[ProtoContract]
|
||||||
class StorageWriteUserFileResultMessage : RPCServerMessage
|
public sealed class StorageWriteUserFileResultMessage : RPCServerMessage
|
||||||
{
|
{
|
||||||
[ProtoMember(1)]
|
[ProtoMember(1)]
|
||||||
public int Result { get; set; }
|
public int Result { get; set; }
|
|
@ -1,30 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net;
|
|
||||||
|
|
||||||
namespace NPSharp.RPC.Packets
|
|
||||||
{
|
|
||||||
public class RPCClientMessage : RPCMessage
|
|
||||||
{
|
|
||||||
public byte[] Serialize(uint id)
|
|
||||||
{
|
|
||||||
byte[] content;
|
|
||||||
using (var bufferStream = new MemoryStream())
|
|
||||||
{
|
|
||||||
ProtoBuf.Serializer.Serialize(bufferStream, this);
|
|
||||||
bufferStream.Seek(0, SeekOrigin.Begin);
|
|
||||||
content = bufferStream.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
var buffer = new List<byte>();
|
|
||||||
buffer.AddRange(BitConverter.GetBytes((uint)IPAddress.HostToNetworkOrder(Signature)));
|
|
||||||
buffer.AddRange(BitConverter.GetBytes((uint)IPAddress.HostToNetworkOrder(content.Length)));
|
|
||||||
buffer.AddRange(BitConverter.GetBytes((uint)IPAddress.HostToNetworkOrder(GetTypeId())));
|
|
||||||
buffer.AddRange(BitConverter.GetBytes((uint)IPAddress.HostToNetworkOrder(id)));
|
|
||||||
buffer.AddRange(content);
|
|
||||||
|
|
||||||
return buffer.ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,7 +2,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using log4net;
|
using log4net;
|
||||||
using NPSharp.RPC.Packets;
|
using NPSharp.RPC.Messages;
|
||||||
|
|
||||||
namespace NPSharp.RPC
|
namespace NPSharp.RPC
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ namespace NPSharp.RPC
|
||||||
{
|
{
|
||||||
private NetworkStream _ns;
|
private NetworkStream _ns;
|
||||||
private uint _id;
|
private uint _id;
|
||||||
private ILog _log;
|
private readonly ILog _log;
|
||||||
|
|
||||||
private readonly string _host;
|
private readonly string _host;
|
||||||
private readonly ushort _port;
|
private readonly ushort _port;
|
||||||
|
@ -38,6 +38,8 @@ namespace NPSharp.RPC
|
||||||
/// <returns>True if the connection succeeded, otherwise false.</returns>
|
/// <returns>True if the connection succeeded, otherwise false.</returns>
|
||||||
public bool Open()
|
public bool Open()
|
||||||
{
|
{
|
||||||
|
_log.Debug("Open() start");
|
||||||
|
|
||||||
// Connection already established?
|
// Connection already established?
|
||||||
if (_ns != null)
|
if (_ns != null)
|
||||||
throw new InvalidOperationException("Connection already opened");
|
throw new InvalidOperationException("Connection already opened");
|
||||||
|
@ -52,6 +54,8 @@ namespace NPSharp.RPC
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_ns = tcp.GetStream();
|
_ns = tcp.GetStream();
|
||||||
|
|
||||||
|
_log.Debug("Open() end");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +86,7 @@ namespace NPSharp.RPC
|
||||||
/// <param name="callback">The method to call when we receive a response to the next message</param>
|
/// <param name="callback">The method to call when we receive a response to the next message</param>
|
||||||
public void AttachCallback(Action<RPCServerMessage> callback)
|
public void AttachCallback(Action<RPCServerMessage> callback)
|
||||||
{
|
{
|
||||||
|
_log.DebugFormat("AttachCallback for packet id {0}", _id);
|
||||||
if (_callbacks.ContainsKey(_id))
|
if (_callbacks.ContainsKey(_id))
|
||||||
throw new Exception("There is already a callback for the current message. You can only add max. one callback.");
|
throw new Exception("There is already a callback for the current message. You can only add max. one callback.");
|
||||||
_callbacks.Add(_id, callback);
|
_callbacks.Add(_id, callback);
|
||||||
|
@ -120,7 +125,12 @@ namespace NPSharp.RPC
|
||||||
var message = RPCServerMessage.Deserialize(_ns);
|
var message = RPCServerMessage.Deserialize(_ns);
|
||||||
|
|
||||||
if (message == null)
|
if (message == null)
|
||||||
|
{
|
||||||
|
_log.Debug("Recv NULL message");
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_log.DebugFormat("Received packet ID {1} (type {0})", message.GetType().Name, message.MessageId);
|
||||||
|
|
||||||
if (!_callbacks.ContainsKey(message.MessageId))
|
if (!_callbacks.ContainsKey(message.MessageId))
|
||||||
return message;
|
return message;
|
||||||
|
@ -128,8 +138,6 @@ namespace NPSharp.RPC
|
||||||
_callbacks[message.MessageId].Invoke(message);
|
_callbacks[message.MessageId].Invoke(message);
|
||||||
_callbacks.Remove(message.MessageId);
|
_callbacks.Remove(message.MessageId);
|
||||||
|
|
||||||
_log.DebugFormat("Received packet ID {1} (type {0})", message.GetType().Name, message.MessageId);
|
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,24 +56,35 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="NPClient.cs" />
|
<Compile Include="NPClient.cs" />
|
||||||
<Compile Include="NPFileException.cs" />
|
<Compile Include="NPFileException.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendDetails.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsSetSteamIDMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsGetProfileDataMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsGetProfileDataResultMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsGetUserAvatarMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsGetUserAvatarResultMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsPresence.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsPresenceMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsRosterMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\FriendsSetPresenceMessage.cs" />
|
||||||
|
<Compile Include="RPC\Messages\ProfileDataResult.cs" />
|
||||||
<Compile Include="RPC\RPCClientStream.cs" />
|
<Compile Include="RPC\RPCClientStream.cs" />
|
||||||
<Compile Include="RPC\Packets\AuthenticateExternalStatusMessage.cs" />
|
<Compile Include="RPC\Messages\AuthenticateExternalStatusMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\AuthenticateResultMessage.cs" />
|
<Compile Include="RPC\Messages\AuthenticateResultMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\AuthenticateWithTokenMessage.cs" />
|
<Compile Include="RPC\Messages\AuthenticateWithTokenMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\CloseAppMessage.cs" />
|
<Compile Include="RPC\Messages\CloseAppMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\HelloMessage.cs" />
|
<Compile Include="RPC\Messages\HelloMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\MessagingSendDataMessage.cs" />
|
<Compile Include="RPC\Messages\MessagingSendDataMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\RPCMessage.cs" />
|
<Compile Include="RPC\Messages\RPCMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\PacketAttribute.cs" />
|
<Compile Include="RPC\Messages\PacketAttribute.cs" />
|
||||||
<Compile Include="RPC\Packets\RPCClientMessage.cs" />
|
<Compile Include="RPC\Messages\RPCClientMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\RPCServerMessage.cs" />
|
<Compile Include="RPC\Messages\RPCServerMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StorageGetUserFileMessage.cs" />
|
<Compile Include="RPC\Messages\StorageGetUserFileMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StorageGetPublisherFileMessage.cs" />
|
<Compile Include="RPC\Messages\StorageGetPublisherFileMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StoragePublisherFileMessage.cs" />
|
<Compile Include="RPC\Messages\StoragePublisherFileMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StorageSendRandomStringMessage.cs" />
|
<Compile Include="RPC\Messages\StorageSendRandomStringMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StorageUserFileMessage.cs" />
|
<Compile Include="RPC\Messages\StorageUserFileMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StorageWriteUserFileMessage.cs" />
|
<Compile Include="RPC\Messages\StorageWriteUserFileMessage.cs" />
|
||||||
<Compile Include="RPC\Packets\StorageWriteUserFileResultMessage.cs" />
|
<Compile Include="RPC\Messages\StorageWriteUserFileResultMessage.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Authentication\AuthenticationHelper.cs" />
|
<Compile Include="Authentication\AuthenticationHelper.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
Loading…
Reference in New Issue