private void HandleClanMemberInformation(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); if (!m_warcraftProfileRequests.ContainsKey(cookie)) { Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unable to locate profile request with cookie {0:x2}", cookie)); return; } WarcraftProfileEventArgs args = m_warcraftProfileRequests[cookie]; byte success = dr.ReadByte(); if (success != 0) { m_warcraftProfileRequests.Remove(cookie); ProfileLookupFailedEventArgs profileFailed = new ProfileLookupFailedEventArgs(args.Username, args.Product) { EventData = pd }; OnProfileLookupFailed(profileFailed); return; } string clanName = dr.ReadCString(); ClanRank rank = (ClanRank)dr.ReadByte(); DateTime joined = DateTime.FromFileTime(dr.ReadInt64()); args.Clan = new ClanProfile(clanName, rank, joined); BncsPacket pck = new BncsPacket((byte)BncsPacketId.WarcraftGeneral); pck.InsertByte((byte)WarcraftCommands.ClanInfoRequest); pck.InsertInt32(cookie); pck.InsertDwordString(args.Profile.ClanTag, 0); pck.InsertDwordString(args.Product.ProductCode); Send(pck); BattleNetClientResources.IncomingBufferPool.FreeBuffer(pd.Data); }
private void HandleAuthInfo(PD data) { DataReader dr = new DataReader(data.Data); dr.Seek(4); m_serverToken = dr.ReadInt32(); m_oldAuthInfo(data); }
private void HandleLogonRealmEx(PD data) { DataReader dr = new DataReader(data.Data); m_mcpCookie = dr.ReadInt32(); int status = dr.ReadInt32(); m_mcpStatus = status; if (data.Length > 8) { m_mcpChunk1 = dr.ReadByteArray(8); byte[] ipAddress = dr.ReadByteArray(4); m_ip = new IPAddress(ipAddress); m_port = dr.ReadInt32(); m_mcpChunk2 = dr.ReadByteArray(48); m_uniqueBnetName = dr.ReadCString(); BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); } else { RealmFailedEventArgs args = new RealmFailedEventArgs((RealmFailureReason)status) { EventData = data }; OnRealmConnectionFailed(args); } }
private void HandleLogonResponse2(PD data) { DataReader dr = new DataReader(data.Data); int success = dr.ReadInt32(); if (success == 0) { m_events.OnLoginSucceeded(BaseEventArgs.GetEmpty(data)); BncsPacket pck = new BncsPacket((byte)BncsPacketId.QueryRealms2); } else { m_events.OnLoginFailed(new LoginFailedEventArgs(LoginFailureReason.AccountDoesNotExist, success)); } }
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); }
private void HandleClanRemoveMember(ParseData pd) { DataReader dr = new DataReader(pd.Data); int reqID = dr.ReadInt32(); ClanMemberRemovalResponse response = (ClanMemberRemovalResponse)dr.ReadByte(); ClanRemovalResponseEventArgs args = new ClanRemovalResponseEventArgs(reqID, response) { EventData = pd }; OnClanRemovalResponse(args); }
// 0x72 private void HandleClanCreationInvitation(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); string tag = dr.ReadDwordString(0); string name = dr.ReadCString(); string inviter = dr.ReadCString(); int inviteeCount = dr.ReadByte(); string[] invitees = new string[inviteeCount]; for (int i = 0; i < inviteeCount; i++) { invitees[i] = dr.ReadCString(); } ClanFormationInvitationEventArgs args = new ClanFormationInvitationEventArgs(cookie, tag, name, inviter, invitees) { EventData = pd }; OnClanFormationInvitationReceived(args); }
private void HandleClanInvitation(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); ClanInvitationResponse response = (ClanInvitationResponse)dr.ReadByte(); ClanInvitationResponseEventArgs args = new ClanInvitationResponseEventArgs(cookie, response) { EventData = pd }; OnClanInvitationResponseReceived(args); }
private void HandleUserProfileRequest(ParseData data) { DataReader dr = new DataReader(data.Data); int numAccounts = dr.ReadInt32(); // should always be 1; number of accounts if (numAccounts != 1) { Trace.WriteLine("BN# cannot handle more than one account per user profile request; quitting."); BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); return; } int numKeys = dr.ReadInt32(); int requestID = dr.ReadInt32(); // request ID string[] keyValues = new string[numKeys]; for (int i = 0; i < numKeys; i++) { keyValues[i] = dr.ReadCString(Encoding.UTF8); } if (m_profileRequests.ContainsKey(requestID)) { UserProfileRequest req = m_profileRequests[requestID]; int value = 0; foreach (UserProfileKey key in req.Keys) { req[key] = keyValues[value++]; } m_profileRequests.Remove(requestID); UserProfileEventArgs args = new UserProfileEventArgs(req) { EventData = data }; OnUserProfileReceived(args); } else { Debug.WriteLine(requestID, "Unknown profile request response."); BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); return; } }
private void HandleProfile(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); if (!m_warcraftProfileRequests.ContainsKey(cookie)) { Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unable to locate profile request with cookie {0:x2}", cookie)); return; } WarcraftProfileEventArgs args = m_warcraftProfileRequests[cookie]; byte success = dr.ReadByte(); if (success != 0) { m_warcraftProfileRequests.Remove(cookie); ProfileLookupFailedEventArgs profileFailed = new ProfileLookupFailedEventArgs(args.Username, args.Product) { EventData = pd }; OnProfileLookupFailed(profileFailed); return; } string desc = dr.ReadCString(); string location = dr.ReadCString(); string tag = dr.ReadDwordString(0); WarcraftProfile profile = new WarcraftProfile(desc, location, tag); args.Profile = profile; if (!string.IsNullOrEmpty(tag)) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanMemberInformation); pck.InsertInt32(cookie); pck.InsertDwordString(tag, 0); pck.InsertCString(args.Username); Send(pck); } else { BncsPacket pck = new BncsPacket((byte)BncsPacketId.WarcraftGeneral); pck.InsertByte((byte)WarcraftCommands.UserInfoRequest); pck.InsertInt32(cookie); pck.InsertCString(args.Username); pck.InsertDwordString(args.Product.ProductCode); Send(pck); } BattleNetClientResources.IncomingBufferPool.FreeBuffer(pd.Data); }
private void HandleAuthAccountCreate(ParseData data) { DataReader dr = new DataReader(data.Data); int status = dr.ReadInt32(); CreationFailureReason reason = CreationFailureReason.Unknown; switch (status) { case 0: AccountCreationEventArgs created = new AccountCreationEventArgs(m_settings.Username) { EventData = data }; OnAccountCreated(created); LoginAccountNLS(); break; case 7: reason = CreationFailureReason.NameTooShort; break; case 8: reason = CreationFailureReason.InvalidCharacters; break; case 9: reason = CreationFailureReason.InvalidWord; break; case 10: reason = CreationFailureReason.NotEnoughAlphanumerics; break; case 11: reason = CreationFailureReason.AdjacentPunctuation; break; case 12: reason = CreationFailureReason.TooMuchPunctuation; break; case 4: default: reason = CreationFailureReason.AccountAlreadyExists; break; } if (status != 0) { AccountCreationFailedEventArgs failed = new AccountCreationFailedEventArgs(m_settings.Username, reason) { EventData = data }; OnAccountCreationFailed(failed); } }
private void HandleWarcraftUserInfoRequest(ParseData data, DataReader dr) { int cookie = dr.ReadInt32(); if (!m_warcraftProfileRequests.ContainsKey(cookie)) { Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unable to locate profile request with cookie {0:x2}", cookie)); return; } WarcraftProfileEventArgs args = m_warcraftProfileRequests[cookie]; string iconID = dr.ReadDwordString(0); args.Profile.IconID = iconID; int recordCount = dr.ReadByte(); WarcraftLadderRecord[] ladderRecords = new WarcraftLadderRecord[recordCount]; for (int i = 0; i < recordCount; i++) { WarcraftLadderType ladderType = (WarcraftLadderType)dr.ReadInt32(); int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); int level = dr.ReadByte(); int hrs = dr.ReadByte(); int xp = dr.ReadInt16(); int rank = dr.ReadInt32(); WarcraftLadderRecord record = new WarcraftLadderRecord(ladderType, wins, losses, level, hrs, xp, rank); ladderRecords[i] = record; } int raceRecordCount = dr.ReadByte(); Warcraft3IconRace[] raceOrder = new Warcraft3IconRace[] { Warcraft3IconRace.Random, Warcraft3IconRace.Human, Warcraft3IconRace.Orc, Warcraft3IconRace.Undead, Warcraft3IconRace.NightElf, Warcraft3IconRace.Tournament }; WarcraftRaceRecord[] raceRecords = new WarcraftRaceRecord[raceRecordCount]; for (int i = 0; i < raceRecordCount; i++) { int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); WarcraftRaceRecord record = new WarcraftRaceRecord(raceOrder[i], wins, losses); raceRecords[i] = record; } int teamRecordsCount = dr.ReadByte(); ArrangedTeamRecord[] teamRecords = new ArrangedTeamRecord[teamRecordsCount]; for (int i = 0; i < teamRecordsCount; i++) { ArrangedTeamType teamType = (ArrangedTeamType)dr.ReadInt32(); int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); int level = dr.ReadByte(); int hrs = dr.ReadByte(); int xp = dr.ReadInt16(); int rank = dr.ReadInt32(); long ftLastGameplay = dr.ReadInt64(); DateTime lastGamePlayed = DateTime.FromFileTime(ftLastGameplay); int numPartners = dr.ReadByte(); string[] partnerList = new string[numPartners]; for (int p = 0; p < numPartners; p++) partnerList[p] = dr.ReadCString(); ArrangedTeamRecord record = new ArrangedTeamRecord(teamType, wins, losses, level, hrs, xp, rank, lastGamePlayed, partnerList); teamRecords[i] = record; } args.Profile.SetStats(ladderRecords, teamRecords, raceRecords); args.EventData = data; OnWarcraftProfileReceived(args); }
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 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 HandleLogonResponse(ParseData data) { DataReader dr = new DataReader(data.Data); int status = dr.ReadInt32(); if (status == 1) { OnLoginSucceeded(BaseEventArgs.GetEmpty(data)); Product product = Product.GetByProductCode(m_settings.Client); if (product.UsesUdpPing) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.UdpPingResponse); pck.InsertDwordString("bnet"); Send(pck); } EnterChat(); } else { LoginFailedEventArgs args = new LoginFailedEventArgs(LoginFailureReason.InvalidAccountOrPassword, status) { EventData = data }; OnLoginFailed(args); } }
/// <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 HandleAuthAccountLogonProof(ParseData data) { DataReader dr = new DataReader(data.Data); int status = dr.ReadInt32(); byte[] m2 = dr.ReadByteArray(20); // 0 = success // 2 = incorrect password // 14 = success; register e-mail // 15 = custom error switch (status) { case 0: // success if (!m_nls.VerifyServerProof(m2)) { //CloseWithError(BattleNet.LoginProofServerProofFailed); OnError(new ErrorEventArgs(ErrorType.LoginServerProofFailed, Strings.LoginProofServerProofFailed, false)); EnterChat(); } else { OnInformation(new InformationEventArgs(Strings.LoginProofSuccess)); OnLoginSucceeded(BaseEventArgs.GetEmpty(null)); EnterChat(); } break; case 2: CloseWithError(Strings.LoginProofClientProofFailed, ErrorType.InvalidUsernameOrPassword); break; case 14: if (!m_nls.VerifyServerProof(m2)) { OnError(new ErrorEventArgs(ErrorType.LoginServerProofFailed, Strings.LoginProofServerProofFailed, false)); EnterChat(); } else { OnInformation(new InformationEventArgs(Strings.LoginProofRegisterEmail)); EnterChat(); } break; case 15: CloseWithError( string.Format(CultureInfo.CurrentCulture, Strings.LoginProofCustomError, dr.ReadCString()), ErrorType.InvalidUsernameOrPassword ); break; } BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data); }
private void HandleAuthAccountLogon(ParseData data) { DataReader dr = new DataReader(data.Data); // 0x53 // status codes: // 0: accepted, proof needed // 1: no such account // 5: upgrade account // else: unknown failure int status = dr.ReadInt32(); if (status == 0) { byte[] salt = dr.ReadByteArray(32); byte[] serverKey = dr.ReadByteArray(32); BncsPacket pck0x54 = new BncsPacket((byte)BncsPacketId.AuthAccountLogonProof); m_nls.LoginProof(pck0x54, salt, serverKey); Send(pck0x54); } else { // create the account or error out. if (status == 1) { OnInformation(new InformationEventArgs( string.Format(CultureInfo.CurrentCulture, Strings.AccountDNECreating, m_settings.Username))); BncsPacket pck0x52 = new BncsPacket((byte)BncsPacketId.AuthAccountCreate); m_nls.CreateAccount(pck0x52); Send(pck0x52); } else if (status == 5) { OnError(new ErrorEventArgs(ErrorType.AccountUpgradeUnsupported, Strings.UpgradeRequestedUnsupported, true)); Close(); return; } else { OnError(new ErrorEventArgs(ErrorType.InvalidUsernameOrPassword, Strings.InvalidUsernameOrPassword, true)); Close(); return; } } }
private void HandleCreateAccount2(ParseData data) { DataReader dr = new DataReader(data.Data); int status = dr.ReadInt32(); CreationFailureReason reason = CreationFailureReason.Unknown; switch (status) { case 2: reason = CreationFailureReason.InvalidCharacters; break; case 3: reason = CreationFailureReason.InvalidWord; break; case 6: reason = CreationFailureReason.NotEnoughAlphanumerics; break; case 4: default: reason = CreationFailureReason.AccountAlreadyExists; break; } if (status == 0) { AccountCreationEventArgs created = new AccountCreationEventArgs(m_settings.Username) { EventData = data }; OnAccountCreated(created); LoginAccountOld(); } else { AccountCreationFailedEventArgs failed = new AccountCreationFailedEventArgs(m_settings.Username, reason) { EventData = data }; OnAccountCreationFailed(failed); } }
private void HandleClanInvitationResponse(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); string tag = dr.ReadDwordString(0); string name = dr.ReadCString(); string inviter = dr.ReadCString(); ClanInvitationEventArgs args = new ClanInvitationEventArgs(cookie, tag, name, inviter) { EventData = pd }; OnClanInvitationReceived(args); }
private void HandleWarcraftClanInfoRequest(DataReader dr) { int cookie = dr.ReadInt32(); if (!m_warcraftProfileRequests.ContainsKey(cookie)) { Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unable to locate profile request with cookie {0:x2}", cookie)); return; } WarcraftProfileEventArgs args = m_warcraftProfileRequests[cookie]; int recordCount = dr.ReadByte(); WarcraftClanLadderRecord[] ladderRecords = new WarcraftClanLadderRecord[recordCount]; for (int i = 0; i < recordCount; i++) { WarcraftClanLadderType ladderType = (WarcraftClanLadderType)dr.ReadInt32(); int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); int level = dr.ReadByte(); int hrs = dr.ReadByte(); int xp = dr.ReadInt16(); int rank = dr.ReadInt32(); WarcraftClanLadderRecord record = new WarcraftClanLadderRecord(ladderType, wins, losses, level, hrs, xp, rank); ladderRecords[i] = record; } int raceRecordCount = dr.ReadByte(); Warcraft3IconRace[] raceOrder = new Warcraft3IconRace[] { Warcraft3IconRace.Random, Warcraft3IconRace.Human, Warcraft3IconRace.Orc, Warcraft3IconRace.Undead, Warcraft3IconRace.NightElf, Warcraft3IconRace.Tournament }; WarcraftRaceRecord[] raceRecords = new WarcraftRaceRecord[raceRecordCount]; for (int i = 0; i < raceRecordCount; i++) { int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); WarcraftRaceRecord record = new WarcraftRaceRecord(raceOrder[i], wins, losses); raceRecords[i] = record; } args.Clan.SetStats(ladderRecords, raceRecords); BncsPacket pck = new BncsPacket((byte)BncsPacketId.WarcraftGeneral); pck.InsertByte((byte)WarcraftCommands.UserInfoRequest); pck.InsertInt32(cookie); pck.InsertCString(args.Username); pck.InsertDwordString(args.Product.ProductCode); Send(pck); }
private void HandleClanRankChange(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); string userName = m_clanRankChangeToMemberList[cookie]; m_clanRankChangeToMemberList.Remove(cookie); ClanRankChangeStatus status = (ClanRankChangeStatus)dr.ReadByte(); ClanRankChangeEventArgs args = new ClanRankChangeEventArgs(userName, status) { EventData = pd }; OnClanRankChangeResponseReceived(args); }
private void HandleLogonResponse2(ParseData data) { DataReader dr = new DataReader(data.Data); int success = dr.ReadInt32(); if (success == 0) { OnLoginSucceeded(BaseEventArgs.GetEmpty(data)); Product product = Product.GetByProductCode(m_settings.Client); if (product.UsesUdpPing) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.UdpPingResponse); pck.InsertDwordString("bnet"); Send(pck); } EnterChat(); } else { LoginFailureReason reason = LoginFailureReason.Unknown; switch (success) { case 1: // account DNE reason = LoginFailureReason.AccountDoesNotExist; break; case 2: // invalid password reason = LoginFailureReason.InvalidAccountOrPassword; break; case 6: // account closed reason = LoginFailureReason.AccountClosed; break; } LoginFailedEventArgs args = new LoginFailedEventArgs(reason, success, dr.ReadCString()) { EventData = data }; OnLoginFailed(args); } }
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(); }
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); } }