private void HandleAuthInfo(PD data) { DataReader dr = new DataReader(data.Data); dr.Seek(4); m_serverToken = dr.ReadInt32(); m_oldAuthInfo(data); }
private void HandleQueryRealms2(PD data) { DataReader dr = new DataReader(data.Data); dr.Seek(4); int count = dr.ReadInt32(); RealmServer[] realms = new RealmServer[count]; for (int i = 0; i < count; i++) { dr.Seek(4); string title = dr.ReadCString(); string desc = dr.ReadCString(); realms[i] = new RealmServer(title, desc); } AvailableRealmsEventArgs args = new AvailableRealmsEventArgs(realms) { EventData = data }; OnRealmsRetrieved(args); }
internal Warcraft3Stats(byte[] stats) { m_literal = Encoding.ASCII.GetString(stats); DataReader dr = new DataReader(stats); string productCode = dr.ReadDwordString(0); m_prod = Product.GetByProductCode(productCode); if (m_prod == null) m_prod = Product.UnknownProduct; if (stats.Length > 4) { dr.Seek(1); string iconInfo = dr.ReadDwordString((byte)' '); char raceID = iconInfo[2]; if (RaceMap.ContainsKey(raceID)) { m_race = RaceMap[raceID]; } else m_race = Warcraft3IconRace.Unknown; m_iconTier = (int)(iconInfo[3] - '0'); dr.Seek(1); string sLevel = dr.ReadTerminatedString(' ', Encoding.ASCII); int.TryParse(sLevel, out m_level); if (m_level == 0) m_level = 1; try { if (dr.Position < dr.Length) m_clanTag = dr.ReadDwordString((byte)' '); } catch { } } }
private void HandleClanInfo(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(1); string clanTag = dr.ReadDwordString(0); ClanRank rank = (ClanRank)dr.ReadByte(); ClanMembershipEventArgs args = new ClanMembershipEventArgs(clanTag, rank); args.EventData = pd; OnClanMembershipReceived(args); BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanMemberList); pck.InsertInt32(Interlocked.Increment(ref m_clanCookie)); Send(pck); }
private static FriendUser __ParseNewFriend(DataReader dr, int i) { string acct = dr.ReadCString(); FriendStatus status = (FriendStatus)dr.ReadByte(); FriendLocation location = (FriendLocation)dr.ReadByte(); string productID = dr.ReadDwordString(0); Product prod = null; string locationName = string.Empty; if (location == FriendLocation.Offline) { dr.Seek(1); } else { prod = Product.GetByProductCode(productID); locationName = dr.ReadCString(); } FriendUser friend = new FriendUser(i, acct, status, location, prod, locationName); return friend; }
public override void ExecuteRequest() { DataBuffer buf1 = new DataBuffer(); buf1.InsertInt16(20); buf1.InsertInt16(0x0200); buf1.InsertDwordString("IX86"); buf1.InsertDwordString(Product); if (m_ad) { buf1.InsertInt32(m_adId); buf1.InsertDwordString(m_adExt); } else { buf1.InsertInt64(0); } Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sck.Connect(Server, 6112); sck.Send(new byte[] { 2 }); sck.Send(buf1.UnderlyingBuffer, 0, buf1.Count, SocketFlags.None); NetworkStream ns = new NetworkStream(sck, false); DataReader rdr = new DataReader(ns, 4); int serverToken = rdr.ReadInt32(); DataBuffer buf2 = new DataBuffer(); buf2.InsertInt32(0); // no resuming if (FileTime.HasValue) { buf2.InsertInt64(FileTime.Value.ToFileTimeUtc()); } else { buf2.InsertInt64(0); } int clientToken = new Random().Next(); buf2.InsertInt32(clientToken); buf2.InsertInt32(m_key.Key.Length); buf2.InsertInt32(m_key.Product); buf2.InsertInt32(m_key.Value1); buf2.InsertInt32(0); buf2.InsertByteArray(m_key.GetHash(clientToken, serverToken)); buf2.InsertCString(FileName); sck.Send(buf2.UnderlyingBuffer, 0, buf2.Count, SocketFlags.None); rdr = new DataReader(ns, 4); int msg2Size = rdr.ReadInt32() - 4; rdr = new DataReader(ns, msg2Size); this.FileSize = rdr.ReadInt32(); rdr.Seek(8); long fileTime = rdr.ReadInt64(); DateTime time = DateTime.FromFileTimeUtc(fileTime); string name = rdr.ReadCString(); if (string.Compare(name, FileName, StringComparison.OrdinalIgnoreCase) != 0 || FileSize == 0) { throw new FileNotFoundException(Resources.bnftp_filenotfound); } byte[] data = ReceiveLoop(sck, FileSize); sck.Close(); FileStream fs = new FileStream(LocalFileName, FileMode.OpenOrCreate, FileAccess.Write); fs.Write(data, 0, FileSize); fs.Flush(); fs.Close(); }
/// <summary> /// Executes the BnFTP request, downloading the file to where <see cref="BnFtpRequestBase.LocalFileName">LocalFileName</see> /// specifies, and closes the connection. /// </summary> /// <remarks> /// <para>By default, <c>LocalFileName</c> is the same name as the remote file, which will cause the file /// to be saved in the local application path. The desired location of the file must be set before /// <b>ExecuteRequest</b> is called.</para> /// </remarks> /// <exception cref="IOException">Thrown if the local file cannot be written.</exception> /// <exception cref="SocketException">Thrown if the remote host closes the connection prematurely.</exception> public override void ExecuteRequest() { DataBuffer buffer = new DataBuffer(); buffer.InsertInt16((short)(33 + FileName.Length)); buffer.InsertInt16(0x0100); buffer.InsertDwordString("IX86"); buffer.InsertDwordString(Product); if (m_ad) { buffer.InsertInt32(m_adId); buffer.InsertDwordString(m_adExt); } else { buffer.InsertInt64(0); } // currently resuming is not supported buffer.InsertInt32(0); if (FileTime.HasValue) { buffer.InsertInt64(FileTime.Value.ToFileTimeUtc()); } else { buffer.InsertInt64(0); } buffer.InsertCString(FileName); Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sck.Connect(Server, 6112); sck.Send(new byte[] { 2 }); sck.Send(buffer.UnderlyingBuffer, 0, buffer.Count, SocketFlags.None); BattleNetClientResources.OutgoingBufferPool.FreeBuffer(buffer.UnderlyingBuffer); byte[] hdrLengthBytes = new byte[2]; sck.Receive(hdrLengthBytes, 2, SocketFlags.None); int hdrLen = BitConverter.ToInt16(hdrLengthBytes, 0); Debug.WriteLine(hdrLen, "Header Length"); byte[] hdrBytes = new byte[hdrLen - 2]; sck.Receive(hdrBytes, hdrLen - 2, SocketFlags.None); DataReader rdr = new DataReader(hdrBytes); rdr.Seek(2); int fileSize = rdr.ReadInt32(); this.FileSize = fileSize; rdr.Seek(8); long fileTime = rdr.ReadInt64(); string name = rdr.ReadCString(); if (string.Compare(name, FileName, StringComparison.OrdinalIgnoreCase) != 0 || FileSize == 0) { throw new FileNotFoundException(Resources.bnftp_filenotfound); } Debug.WriteLine(fileSize, "File Size"); byte[] data = ReceiveLoop(sck, fileSize); sck.Close(); FileStream fs = new FileStream(LocalFileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None); fs.SetLength(fileSize); fs.Write(data, 0, fileSize); fs.Flush(); fs.Close(); DateTime time = DateTime.FromFileTimeUtc(fileTime); File.SetLastWriteTimeUtc(LocalFileName, time); }
private void HandleClanMemberList(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(4); byte memCount = dr.ReadByte(); for (int i = 0; i < memCount; i++) { string userName = dr.ReadCString(); ClanRank rank = (ClanRank)dr.ReadByte(); ClanMemberStatus status = (ClanMemberStatus)dr.ReadByte(); string location = dr.ReadCString(); m_clanList.Add(userName, new ClanMember(userName, rank, status, location)); } ClanMember[] members = new ClanMember[m_clanList.Count]; m_clanList.Values.CopyTo(members, 0); ClanMemberListEventArgs args = new ClanMemberListEventArgs(members); args.EventData = pd; OnClanMemberListReceived(args); }
private void HandleClanMotd(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(8); string motd = dr.ReadCString(); InformationEventArgs args = new InformationEventArgs(motd); args.EventData = pd; OnClanMessageOfTheDay(args); }
private void HandleClanFindCandidates(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(4); // skip the cookie ClanCandidatesSearchStatus status = (ClanCandidatesSearchStatus)dr.ReadByte(); int numCandidates = dr.ReadByte(); string[] usernames = new string[numCandidates]; for (int i = 0; i < numCandidates; i++) { usernames[i] = dr.ReadCString(); } ClanCandidatesSearchEventArgs args = new ClanCandidatesSearchEventArgs(status, usernames); args.EventData = pd; OnClanCandidatesSearchCompleted(args); }
private void HandleClanMakeChieftan(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(4); ClanChieftanChangeResult result = (ClanChieftanChangeResult)dr.ReadByte(); ClanChieftanChangeEventArgs args = new ClanChieftanChangeEventArgs(result); args.EventData = pd; OnClanChangeChieftanCompleted(args); }
// 0x73 private void HandleDisbandClan(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(4); ClanResponseCode status = (ClanResponseCode)dr.ReadByte(); ClanDisbandEventArgs args = new ClanDisbandEventArgs(status == ClanResponseCode.Success); args.EventData = pd; OnClanDisbandCompleted(args); }
// 0x71 private void HandleClanInviteMultiple(ParseData pd) { DataReader dr = new DataReader(pd.Data); dr.Seek(4); // cookie ClanResponseCode response = (ClanResponseCode)dr.ReadByte(); ClanFormationEventArgs args = null; if (response == ClanResponseCode.Success) { args = new ClanFormationEventArgs(); } else { List<string> names = new List<string>(); int nextByte = dr.Peek(); while (nextByte > 0) { names.Add(dr.ReadCString()); nextByte = dr.Peek(); } args = new ClanFormationEventArgs(response == ClanResponseCode.InvitationDeclined, response == ClanResponseCode.Decline, names.ToArray()); } args.EventData = pd; OnClanFormationCompleted(args); }
private void HandleChatEvent(ParseData data) { DataReader dr = new DataReader(data.Data); ChatEventType type = (ChatEventType)dr.ReadInt32(); int flags = dr.ReadInt32(); int ping = dr.ReadInt32(); dr.Seek(12); string user = dr.ReadCString(); byte[] userInfo = dr.ReadNullTerminatedByteArray(); string text = Encoding.ASCII.GetString(userInfo); switch (type) { case ChatEventType.UserInChannel: case ChatEventType.UserJoinedChannel: ChatUser newUser = new ChatUser(user, ping, (UserFlags)flags, UserStats.Parse(user, userInfo)); if (m_namesToUsers.ContainsKey(user)) { m_namesToUsers.Remove(user); } m_namesToUsers.Add(user, newUser); UserEventArgs uArgs = new UserEventArgs(type, newUser); HandleUserChatEvent(uArgs); break; case ChatEventType.UserFlagsChanged: if (m_namesToUsers.ContainsKey(user)) { ChatUser changedUser = m_namesToUsers[user]; changedUser.Flags = (UserFlags)flags; UserEventArgs updatedArgs = new UserEventArgs(type, changedUser); HandleUserChatEvent(updatedArgs); } else if (m_channelName.Equals("The Void", StringComparison.OrdinalIgnoreCase)) { ChatUser voidUser = new ChatUser(user, ping, (UserFlags)flags, UserStats.Parse(user, userInfo)); m_namesToUsers.Add(user, voidUser); UserEventArgs voidArgs = new UserEventArgs(type, voidUser); HandleUserChatEvent(voidArgs); } break; case ChatEventType.UserLeftChannel: if (m_namesToUsers.ContainsKey(user)) { ChatUser goneUser = m_namesToUsers[user]; UserEventArgs leftArgs = new UserEventArgs(type, goneUser); HandleUserChatEvent(leftArgs); } break; case ChatEventType.Emote: case ChatEventType.Talk: case ChatEventType.WhisperReceived: case ChatEventType.WhisperSent: ChatMessageEventArgs cmArgs = new ChatMessageEventArgs(type, (UserFlags)flags, user, Encoding.UTF8.GetString(userInfo)); HandleChatMessageEvent(cmArgs); break; case ChatEventType.NewChannelJoined: ServerChatEventArgs joinArgs = new ServerChatEventArgs(type, flags, text); m_channelName = text; m_namesToUsers.Clear(); OnJoinedChannel(joinArgs); break; case ChatEventType.Broadcast: case ChatEventType.ChannelDNE: case ChatEventType.ChannelFull: case ChatEventType.ChannelRestricted: case ChatEventType.Error: case ChatEventType.Information: ServerChatEventArgs scArgs = new ServerChatEventArgs(type, flags, text); HandleServerChatEvent(scArgs); break; } BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); }
private void HandleCheckAd(ParseData data) { DataReader dr = new DataReader(data.Data); int adID = dr.ReadInt32(); dr.Seek(4); // extension long filetime = dr.ReadInt64(); DateTime ft = DateTime.FromFileTimeUtc(filetime); string filename = dr.ReadCString(Encoding.ASCII); string link = dr.ReadCString(Encoding.ASCII); AdChangedEventArgs args = new AdChangedEventArgs(adID, ft, filename, link); m_lastAd = adID; OnAdChanged(args); BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); }
private void HandleNewsInfo(ParseData data) { DateTime UNIX_EPOCH = new DateTime(1970, 1, 1).ToUniversalTime(); DataReader dr = new DataReader(data.Data); int numEntriesInPacket = dr.ReadByte(); dr.ReadInt32(); // last login timestamp dr.Seek(8); // oldest news, newest news timestamps. //int oldestNews = dr.ReadInt32(); //int newestNews = dr.ReadInt32(); //DateTime oldestNewsDateUtc = UNIX_EPOCH + TimeSpan.FromSeconds(oldestNews); //DateTime oldestNewsDateLocal = oldestNewsDateUtc.ToLocalTime(); //DateTime newestNewsDateUtc = UNIX_EPOCH + TimeSpan.FromSeconds(newestNews); //DateTime newestNewsDateLocal = newestNewsDateUtc.ToLocalTime(); lock (m_news) { for (int i = 0; i < numEntriesInPacket; i++) { int newsTS = dr.ReadInt32(); DateTime newsDateUtc = UNIX_EPOCH + TimeSpan.FromSeconds(newsTS); if (newsTS == 0) newsDateUtc = DateTime.UtcNow; string text = dr.ReadCString(); NewsEntry news = new NewsEntry(newsDateUtc, text); OnServerNews(new ServerNewsEventArgs(news)); } BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); } }