public static void broadcastGetKeepAlives(List <InventoryItemKeepAlive> ka_list, RemoteEndpoint endpoint) { int ka_count = ka_list.Count; int max_ka_per_chunk = CoreConfig.maximumKeepAlivesPerChunk; for (int i = 0; i < ka_count;) { using (MemoryStream mOut = new MemoryStream(max_ka_per_chunk * 570)) { using (BinaryWriter writer = new BinaryWriter(mOut)) { int next_ka_count; if (ka_count - i > max_ka_per_chunk) { next_ka_count = max_ka_per_chunk; } else { next_ka_count = ka_count - i; } writer.WriteIxiVarInt(next_ka_count); for (int j = 0; j < next_ka_count && i < ka_count; j++) { InventoryItemKeepAlive ka = ka_list[i]; i++; if (ka == null) { break; } long rollback_len = mOut.Length; writer.WriteIxiVarInt(ka.address.Length); writer.Write(ka.address); writer.WriteIxiVarInt(ka.deviceId.Length); writer.Write(ka.deviceId); if (mOut.Length > CoreConfig.maxMessageSize) { mOut.SetLength(rollback_len); i--; break; } } } endpoint.sendData(ProtocolMessageCode.getKeepAlives, mOut.ToArray(), null); } } }
private bool handleKeepAlive(InventoryItem item, RemoteEndpoint endpoint) { if (endpoint == null) { return(false); } InventoryItemKeepAlive iika = (InventoryItemKeepAlive)item; Presence p = PresenceList.getPresenceByAddress(iika.address); if (p == null) { using (MemoryStream mw = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(mw)) { writer.WriteIxiVarInt(iika.address.Length); writer.Write(iika.address); endpoint.sendData(ProtocolMessageCode.getPresence2, mw.ToArray(), null); } } return(false); } else { var pa = p.addresses.Find(x => x.device.SequenceEqual(iika.deviceId)); if (pa == null || iika.lastSeen > pa.lastSeenTime) { byte[] address_len_bytes = ((ulong)iika.address.Length).GetIxiVarIntBytes(); byte[] device_len_bytes = ((ulong)iika.deviceId.Length).GetIxiVarIntBytes(); byte[] data = new byte[1 + address_len_bytes.Length + iika.address.Length + device_len_bytes.Length + iika.deviceId.Length]; data[0] = 1; Array.Copy(address_len_bytes, 0, data, 1, address_len_bytes.Length); Array.Copy(iika.address, 0, data, 1 + address_len_bytes.Length, iika.address.Length); Array.Copy(device_len_bytes, 0, data, 1 + address_len_bytes.Length + iika.address.Length, device_len_bytes.Length); Array.Copy(iika.deviceId, 0, data, 1 + address_len_bytes.Length + iika.address.Length + device_len_bytes.Length, iika.deviceId.Length); endpoint.sendData(ProtocolMessageCode.getKeepAlives, data, null); return(true); } } return(false); }