diff --git a/libnpsharp.sln.DotSettings b/libnpsharp.sln.DotSettings index 5b44f2a..300f99b 100644 --- a/libnpsharp.sln.DotSettings +++ b/libnpsharp.sln.DotSettings @@ -1,4 +1,5 @@  + ID NP NPID RPC \ No newline at end of file diff --git a/src/libnpsharp/NPClient.cs b/src/libnpsharp/NPClient.cs index d042bfc..63d40d4 100644 --- a/src/libnpsharp/NPClient.cs +++ b/src/libnpsharp/NPClient.cs @@ -6,7 +6,7 @@ using System.Threading; using System.Threading.Tasks; using log4net; using NPSharp.RPC; -using NPSharp.RPC.Packets; +using NPSharp.RPC.Messages; namespace NPSharp { @@ -88,7 +88,7 @@ namespace NPSharp _log.Debug("Disconnect() start"); _cancellationTokenSource.Cancel(true); // TODO: Find a cleaner way to cancel _processingTask (focus: _rpc.Read) - _procTask.Wait(_cancellationToken); + //_procTask.Wait(_cancellationToken); _rpc.Close(); LoginId = 0; diff --git a/src/libnpsharp/RPC/Packets/AuthenticateExternalStatusMessage.cs b/src/libnpsharp/RPC/Messages/AuthenticateExternalStatusMessage.cs similarity index 55% rename from src/libnpsharp/RPC/Packets/AuthenticateExternalStatusMessage.cs rename to src/libnpsharp/RPC/Messages/AuthenticateExternalStatusMessage.cs index 78f2f56..c3d7c70 100644 --- a/src/libnpsharp/RPC/Packets/AuthenticateExternalStatusMessage.cs +++ b/src/libnpsharp/RPC/Messages/AuthenticateExternalStatusMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1006)] [ProtoContract] - class AuthenticateExternalStatusMessage : RPCServerMessage + public sealed class AuthenticateExternalStatusMessage : RPCServerMessage { [ProtoMember(1)] public int Status { get; set; } diff --git a/src/libnpsharp/RPC/Packets/AuthenticateResultMessage.cs b/src/libnpsharp/RPC/Messages/AuthenticateResultMessage.cs similarity index 73% rename from src/libnpsharp/RPC/Packets/AuthenticateResultMessage.cs rename to src/libnpsharp/RPC/Messages/AuthenticateResultMessage.cs index 42cb81c..b089216 100644 --- a/src/libnpsharp/RPC/Packets/AuthenticateResultMessage.cs +++ b/src/libnpsharp/RPC/Messages/AuthenticateResultMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1010)] [ProtoContract] - class AuthenticateResultMessage : RPCServerMessage + public sealed class AuthenticateResultMessage : RPCServerMessage { [ProtoMember(1)] public int Result { get; set; } diff --git a/src/libnpsharp/RPC/Packets/AuthenticateWithTokenMessage.cs b/src/libnpsharp/RPC/Messages/AuthenticateWithTokenMessage.cs similarity index 57% rename from src/libnpsharp/RPC/Packets/AuthenticateWithTokenMessage.cs rename to src/libnpsharp/RPC/Messages/AuthenticateWithTokenMessage.cs index eff3199..58c5e9f 100644 --- a/src/libnpsharp/RPC/Packets/AuthenticateWithTokenMessage.cs +++ b/src/libnpsharp/RPC/Messages/AuthenticateWithTokenMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1003)] [ProtoContract] - class AuthenticateWithTokenMessage : RPCClientMessage + public sealed class AuthenticateWithTokenMessage : RPCClientMessage { [ProtoMember(1)] public string Token { get; set; } diff --git a/src/libnpsharp/RPC/Packets/CloseAppMessage.cs b/src/libnpsharp/RPC/Messages/CloseAppMessage.cs similarity index 60% rename from src/libnpsharp/RPC/Packets/CloseAppMessage.cs rename to src/libnpsharp/RPC/Messages/CloseAppMessage.cs index 2dd2710..c4a4524 100644 --- a/src/libnpsharp/RPC/Packets/CloseAppMessage.cs +++ b/src/libnpsharp/RPC/Messages/CloseAppMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(2001)] [ProtoContract] - class CloseAppMessage : RPCServerMessage + public sealed class CloseAppMessage : RPCServerMessage { [ProtoMember(1)] public string Reason { get; set; } diff --git a/src/libnpsharp/RPC/Messages/FriendDetails.cs b/src/libnpsharp/RPC/Messages/FriendDetails.cs new file mode 100644 index 0000000..b427869 --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendDetails.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsGetProfileDataMessage.cs b/src/libnpsharp/RPC/Messages/FriendsGetProfileDataMessage.cs new file mode 100644 index 0000000..032236c --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsGetProfileDataMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsGetProfileDataResultMessage.cs b/src/libnpsharp/RPC/Messages/FriendsGetProfileDataResultMessage.cs new file mode 100644 index 0000000..1150276 --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsGetProfileDataResultMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsGetUserAvatarMessage.cs b/src/libnpsharp/RPC/Messages/FriendsGetUserAvatarMessage.cs new file mode 100644 index 0000000..0b27a08 --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsGetUserAvatarMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsGetUserAvatarResultMessage.cs b/src/libnpsharp/RPC/Messages/FriendsGetUserAvatarResultMessage.cs new file mode 100644 index 0000000..721f10b --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsGetUserAvatarResultMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsPresence.cs b/src/libnpsharp/RPC/Messages/FriendsPresence.cs new file mode 100644 index 0000000..bc6f5c6 --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsPresence.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsPresenceMessage.cs b/src/libnpsharp/RPC/Messages/FriendsPresenceMessage.cs new file mode 100644 index 0000000..e37975e --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsPresenceMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsRosterMessage.cs b/src/libnpsharp/RPC/Messages/FriendsRosterMessage.cs new file mode 100644 index 0000000..4aaeb8c --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsRosterMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsSetPresenceMessage.cs b/src/libnpsharp/RPC/Messages/FriendsSetPresenceMessage.cs new file mode 100644 index 0000000..1f30973 --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsSetPresenceMessage.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/FriendsSetSteamIDMessage.cs b/src/libnpsharp/RPC/Messages/FriendsSetSteamIDMessage.cs new file mode 100644 index 0000000..7456a27 --- /dev/null +++ b/src/libnpsharp/RPC/Messages/FriendsSetSteamIDMessage.cs @@ -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; } + } +} diff --git a/src/libnpsharp/RPC/Packets/HelloMessage.cs b/src/libnpsharp/RPC/Messages/HelloMessage.cs similarity index 83% rename from src/libnpsharp/RPC/Packets/HelloMessage.cs rename to src/libnpsharp/RPC/Messages/HelloMessage.cs index 42cb333..03ab464 100644 --- a/src/libnpsharp/RPC/Packets/HelloMessage.cs +++ b/src/libnpsharp/RPC/Messages/HelloMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1000)] [ProtoContract] - class HelloMessage : RPCServerMessage + public sealed class HelloMessage : RPCServerMessage { // I seriously have no idea where in the code this is used but whatever [ProtoMember(1)] diff --git a/src/libnpsharp/RPC/Packets/MessagingSendDataMessage.cs b/src/libnpsharp/RPC/Messages/MessagingSendDataMessage.cs similarity index 66% rename from src/libnpsharp/RPC/Packets/MessagingSendDataMessage.cs rename to src/libnpsharp/RPC/Messages/MessagingSendDataMessage.cs index 360787c..5b1be59 100644 --- a/src/libnpsharp/RPC/Packets/MessagingSendDataMessage.cs +++ b/src/libnpsharp/RPC/Messages/MessagingSendDataMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(2002)] [ProtoContract] - class MessagingSendDataMessage : RPCClientMessage + public sealed class MessagingSendDataMessage : RPCClientMessage { [ProtoMember(1)] public ulong NPID { get; set; } diff --git a/src/libnpsharp/RPC/Packets/PacketAttribute.cs b/src/libnpsharp/RPC/Messages/PacketAttribute.cs similarity index 65% rename from src/libnpsharp/RPC/Packets/PacketAttribute.cs rename to src/libnpsharp/RPC/Messages/PacketAttribute.cs index ed5124b..fc272e2 100644 --- a/src/libnpsharp/RPC/Packets/PacketAttribute.cs +++ b/src/libnpsharp/RPC/Messages/PacketAttribute.cs @@ -1,8 +1,8 @@ using System; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { - class PacketAttribute : Attribute + internal sealed class PacketAttribute : Attribute { public PacketAttribute(uint type) { diff --git a/src/libnpsharp/RPC/Messages/ProfileDataResult.cs b/src/libnpsharp/RPC/Messages/ProfileDataResult.cs new file mode 100644 index 0000000..9d3ba7b --- /dev/null +++ b/src/libnpsharp/RPC/Messages/ProfileDataResult.cs @@ -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; } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Messages/RPCClientMessage.cs b/src/libnpsharp/RPC/Messages/RPCClientMessage.cs new file mode 100644 index 0000000..444adaa --- /dev/null +++ b/src/libnpsharp/RPC/Messages/RPCClientMessage.cs @@ -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; + } + } +} \ No newline at end of file diff --git a/src/libnpsharp/RPC/Packets/RPCMessage.cs b/src/libnpsharp/RPC/Messages/RPCMessage.cs similarity index 84% rename from src/libnpsharp/RPC/Packets/RPCMessage.cs rename to src/libnpsharp/RPC/Messages/RPCMessage.cs index 7712425..3d1f781 100644 --- a/src/libnpsharp/RPC/Packets/RPCMessage.cs +++ b/src/libnpsharp/RPC/Messages/RPCMessage.cs @@ -1,8 +1,8 @@ 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. diff --git a/src/libnpsharp/RPC/Packets/RPCServerMessage.cs b/src/libnpsharp/RPC/Messages/RPCServerMessage.cs similarity index 54% rename from src/libnpsharp/RPC/Packets/RPCServerMessage.cs rename to src/libnpsharp/RPC/Messages/RPCServerMessage.cs index 84de050..5590d6a 100644 --- a/src/libnpsharp/RPC/Packets/RPCServerMessage.cs +++ b/src/libnpsharp/RPC/Messages/RPCServerMessage.cs @@ -1,34 +1,64 @@ -using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; 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 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); if (l == 0) + { + Log.Debug("Received 0 bytes"); return null; + } if (l < 16) - throw new ProtocolViolationException("Received incomplete header"); + { + Log.ErrorFormat("Received incomplete header ({0} bytes of 16 wanted bytes)", l); + 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]; ns.Read(buffer, 0, buffer.Length); if (signature != Signature) + { + Log.Error("Received invalid signature"); throw new ProtocolViolationException("Received packet with invalid signature"); + } RPCServerMessage packet; @@ -42,14 +72,13 @@ namespace NPSharp.RPC.Packets ).ToArray(); 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 DEBUG Debug.Fail(string.Format("Bug in program code: Found more than 1 type for packet ID {0}", type)); #else - // TODO: log4net return null; #endif } @@ -59,7 +88,7 @@ namespace NPSharp.RPC.Packets ); } - packet.MessageId = (uint)IPAddress.NetworkToHostOrder(BitConverter.ToUInt32(header, 12)); + packet.MessageId = pid; return packet; } diff --git a/src/libnpsharp/RPC/Packets/StorageGetPublisherFileMessage.cs b/src/libnpsharp/RPC/Messages/StorageGetPublisherFileMessage.cs similarity index 58% rename from src/libnpsharp/RPC/Packets/StorageGetPublisherFileMessage.cs rename to src/libnpsharp/RPC/Messages/StorageGetPublisherFileMessage.cs index 86b6732..f4e3b86 100644 --- a/src/libnpsharp/RPC/Packets/StorageGetPublisherFileMessage.cs +++ b/src/libnpsharp/RPC/Messages/StorageGetPublisherFileMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [ProtoContract] [Packet(1101)] - class StorageGetPublisherFileMessage : RPCClientMessage + public sealed class StorageGetPublisherFileMessage : RPCClientMessage { [ProtoMember(1)] public string FileName { get; set; } diff --git a/src/libnpsharp/RPC/Packets/StorageGetUserFileMessage.cs b/src/libnpsharp/RPC/Messages/StorageGetUserFileMessage.cs similarity index 71% rename from src/libnpsharp/RPC/Packets/StorageGetUserFileMessage.cs rename to src/libnpsharp/RPC/Messages/StorageGetUserFileMessage.cs index 0b27e3b..4b0ffa6 100644 --- a/src/libnpsharp/RPC/Packets/StorageGetUserFileMessage.cs +++ b/src/libnpsharp/RPC/Messages/StorageGetUserFileMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1102)] [ProtoContract] - class StorageGetUserFileMessage : RPCClientMessage + public sealed class StorageGetUserFileMessage : RPCClientMessage { [ProtoMember(1)] public string FileName { get; set; } diff --git a/src/libnpsharp/RPC/Packets/StoragePublisherFileMessage.cs b/src/libnpsharp/RPC/Messages/StoragePublisherFileMessage.cs similarity index 72% rename from src/libnpsharp/RPC/Packets/StoragePublisherFileMessage.cs rename to src/libnpsharp/RPC/Messages/StoragePublisherFileMessage.cs index 77881b2..2fc58e1 100644 --- a/src/libnpsharp/RPC/Packets/StoragePublisherFileMessage.cs +++ b/src/libnpsharp/RPC/Messages/StoragePublisherFileMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1111)] [ProtoContract] - class StoragePublisherFileMessage : RPCServerMessage + public sealed class StoragePublisherFileMessage : RPCServerMessage { [ProtoMember(1)] public int Result { get; set; } diff --git a/src/libnpsharp/RPC/Packets/StorageSendRandomStringMessage.cs b/src/libnpsharp/RPC/Messages/StorageSendRandomStringMessage.cs similarity index 57% rename from src/libnpsharp/RPC/Packets/StorageSendRandomStringMessage.cs rename to src/libnpsharp/RPC/Messages/StorageSendRandomStringMessage.cs index 6943bf7..fb31206 100644 --- a/src/libnpsharp/RPC/Packets/StorageSendRandomStringMessage.cs +++ b/src/libnpsharp/RPC/Messages/StorageSendRandomStringMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1104)] [ProtoContract] - class StorageSendRandomStringMessage : RPCClientMessage + public sealed class StorageSendRandomStringMessage : RPCClientMessage { [ProtoMember(1)] public string RandomString { get; set; } diff --git a/src/libnpsharp/RPC/Packets/StorageUserFileMessage.cs b/src/libnpsharp/RPC/Messages/StorageUserFileMessage.cs similarity index 77% rename from src/libnpsharp/RPC/Packets/StorageUserFileMessage.cs rename to src/libnpsharp/RPC/Messages/StorageUserFileMessage.cs index 3a2b85a..e4f6d87 100644 --- a/src/libnpsharp/RPC/Packets/StorageUserFileMessage.cs +++ b/src/libnpsharp/RPC/Messages/StorageUserFileMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1112)] [ProtoContract] - class StorageUserFileMessage : RPCServerMessage + public sealed class StorageUserFileMessage : RPCServerMessage { [ProtoMember(1)] public int Result { get; set; } diff --git a/src/libnpsharp/RPC/Packets/StorageWriteUserFileMessage.cs b/src/libnpsharp/RPC/Messages/StorageWriteUserFileMessage.cs similarity index 72% rename from src/libnpsharp/RPC/Packets/StorageWriteUserFileMessage.cs rename to src/libnpsharp/RPC/Messages/StorageWriteUserFileMessage.cs index b9a9dd9..95e41b4 100644 --- a/src/libnpsharp/RPC/Packets/StorageWriteUserFileMessage.cs +++ b/src/libnpsharp/RPC/Messages/StorageWriteUserFileMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1103)] [ProtoContract] - class StorageWriteUserFileMessage : RPCClientMessage + public sealed class StorageWriteUserFileMessage : RPCClientMessage { [ProtoMember(1)] public string FileName { get; set; } diff --git a/src/libnpsharp/RPC/Packets/StorageWriteUserFileResultMessage.cs b/src/libnpsharp/RPC/Messages/StorageWriteUserFileResultMessage.cs similarity index 71% rename from src/libnpsharp/RPC/Packets/StorageWriteUserFileResultMessage.cs rename to src/libnpsharp/RPC/Messages/StorageWriteUserFileResultMessage.cs index 8c7f463..fb70565 100644 --- a/src/libnpsharp/RPC/Packets/StorageWriteUserFileResultMessage.cs +++ b/src/libnpsharp/RPC/Messages/StorageWriteUserFileResultMessage.cs @@ -1,10 +1,10 @@ using ProtoBuf; -namespace NPSharp.RPC.Packets +namespace NPSharp.RPC.Messages { [Packet(1113)] [ProtoContract] - class StorageWriteUserFileResultMessage : RPCServerMessage + public sealed class StorageWriteUserFileResultMessage : RPCServerMessage { [ProtoMember(1)] public int Result { get; set; } diff --git a/src/libnpsharp/RPC/Packets/RPCClientMessage.cs b/src/libnpsharp/RPC/Packets/RPCClientMessage.cs deleted file mode 100644 index d08ae6f..0000000 --- a/src/libnpsharp/RPC/Packets/RPCClientMessage.cs +++ /dev/null @@ -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(); - 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(); - } - } -} \ No newline at end of file diff --git a/src/libnpsharp/RPC/RPCClientStream.cs b/src/libnpsharp/RPC/RPCClientStream.cs index 87d3b8c..82396c1 100644 --- a/src/libnpsharp/RPC/RPCClientStream.cs +++ b/src/libnpsharp/RPC/RPCClientStream.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Net.Sockets; using log4net; -using NPSharp.RPC.Packets; +using NPSharp.RPC.Messages; namespace NPSharp.RPC { @@ -13,7 +13,7 @@ namespace NPSharp.RPC { private NetworkStream _ns; private uint _id; - private ILog _log; + private readonly ILog _log; private readonly string _host; private readonly ushort _port; @@ -38,6 +38,8 @@ namespace NPSharp.RPC /// True if the connection succeeded, otherwise false. public bool Open() { + _log.Debug("Open() start"); + // Connection already established? if (_ns != null) throw new InvalidOperationException("Connection already opened"); @@ -52,6 +54,8 @@ namespace NPSharp.RPC return false; } _ns = tcp.GetStream(); + + _log.Debug("Open() end"); return true; } @@ -82,6 +86,7 @@ namespace NPSharp.RPC /// The method to call when we receive a response to the next message public void AttachCallback(Action callback) { + _log.DebugFormat("AttachCallback for packet id {0}", _id); if (_callbacks.ContainsKey(_id)) throw new Exception("There is already a callback for the current message. You can only add max. one callback."); _callbacks.Add(_id, callback); @@ -120,7 +125,12 @@ namespace NPSharp.RPC var message = RPCServerMessage.Deserialize(_ns); if (message == null) + { + _log.Debug("Recv NULL message"); return null; + } + + _log.DebugFormat("Received packet ID {1} (type {0})", message.GetType().Name, message.MessageId); if (!_callbacks.ContainsKey(message.MessageId)) return message; @@ -128,8 +138,6 @@ namespace NPSharp.RPC _callbacks[message.MessageId].Invoke(message); _callbacks.Remove(message.MessageId); - _log.DebugFormat("Received packet ID {1} (type {0})", message.GetType().Name, message.MessageId); - return message; } } diff --git a/src/libnpsharp/libnpsharp.csproj b/src/libnpsharp/libnpsharp.csproj index 382cbd9..effa5d8 100644 --- a/src/libnpsharp/libnpsharp.csproj +++ b/src/libnpsharp/libnpsharp.csproj @@ -56,24 +56,35 @@ + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + +