public bool addFragment(BbTcpPacket_Fragment fragment) { if (m_liFragments == null) { m_liFragments = new List <BbTcpPacket_Fragment>(); m_liFragments.Add(this); } if (m_liFragments.Contains(fragment)) { return(false); } m_liFragments.Add(fragment); return(m_liFragments.Count == m_nTotalFragmentsCount); }
public BbTcpPacket assemblePacket() { if (m_liFragments.Count != m_nTotalFragmentsCount) { ParseError = "Not all fragments present"; return(null); } BbTcpPacket_Fragment[] aFragments = new BbTcpPacket_Fragment[m_nTotalFragmentsCount]; int nCompletedPacketSize = 0; foreach (BbTcpPacket_Fragment fragment in m_liFragments) { if (fragment.m_nFragmentNumber >= aFragments.Length) { ParseError = "Invalid fragment numbers present"; return(null); } aFragments[fragment.m_nFragmentNumber] = fragment; nCompletedPacketSize += (int)fragment.m_bbData.Remaining(); } m_liFragments.Clear(); using (BinaryWriter buf = new BinaryWriter(new MemoryStream(nCompletedPacketSize))) { for (int i = 0; i < m_nTotalFragmentsCount; i++) { if (aFragments[i] == null) { ParseError = "Invalid fragment numbers present / fragment missing"; return(null); } buf.Write(aFragments[i].m_bbData.GetBuffer(), (int)aFragments[i].m_bbData.Position, (int)aFragments[i].m_bbData.Remaining()); } BbTcpPacket res = new BbTcpPacket(m_byPayloadOpcode, nCompletedPacketSize); return(res.ReadPacket(((MemoryStream)buf.BaseStream).GetBuffer(), m_byProtocolVersion)); } }
public BbTcpPacket ReadPacket(byte[] byBody, byte byProtcolVersion) { IsValid = false; if (!IsComplete && (byBody == null || byBody.Length != BodyLength)) { ParseError = "Packet size doesn't match buffer size"; return(this); } IsComplete = true; m_byProtocolVersion = byProtcolVersion; if (Opcode != BBProtocol.OP_HELLO_ANSWER && (byProtcolVersion < BBProtocol.MIN_PROTOCOL_VERSION || byProtcolVersion > BBProtocol.CURRENT_PROTOCOL_VERSION)) { ParseError = "Protocolversion unsupported (" + byProtcolVersion + ")"; return(this); } try { using (BinaryReader data = new BinaryReader(new MemoryStream(byBody, 0, byBody.Length, false, true), Encoding.UTF8, true)) { switch (Opcode) { case BBProtocol.OP_FRAGMENT: { BbTcpPacket_Fragment bbFragment = new BbTcpPacket_Fragment(this); bbFragment.ProcessData(data); return(bbFragment); } case BBProtocol.OP_HELLO_ANSWER: { BbTcpPacket_Hello_Ans bbHelloAns = new BbTcpPacket_Hello_Ans(this); bbHelloAns.ProcessData(data); return(bbHelloAns); } case BBProtocol.OP_ATTACH_ANSWER: { BbTcpPacket_Attach_Ans bbAttachAns = new BbTcpPacket_Attach_Ans(this); bbAttachAns.ProcessData(data); return(bbAttachAns); } case BBProtocol.OP_INPUTFOCUSCHANGE: { BbTcpPacket_InputFocusChange bbFocusChange = new BbTcpPacket_InputFocusChange(this); bbFocusChange.ProcessData(data); return(bbFocusChange); } case BBProtocol.OP_SENDICON: { BbTcpPacket_SendIcon bbSendIcon = new BbTcpPacket_SendIcon(this); bbSendIcon.ProcessData(data); return(bbSendIcon); } case BBProtocol.OP_BATTERYSTATUS: { BbTcpPacket_BatteryStatus bbBattery = new BbTcpPacket_BatteryStatus(this); bbBattery.ProcessData(data); return(bbBattery); } case BBProtocol.OP_STARTSENDFILE: { BbTcpPacket_StartSendFile bbFile = new BbTcpPacket_StartSendFile(this); bbFile.ProcessData(data); return(bbFile); } case BBProtocol.OP_SENDFILECOMMAND: { BbTcpPacket_CommandSendFile bbFile = new BbTcpPacket_CommandSendFile(this); bbFile.ProcessData(data); return(bbFile); } case BBProtocol.OP_SENDFILEDATA: { BbTcpPacket_SendFileData bbFile = new BbTcpPacket_SendFileData(this); bbFile.ProcessData(data); return(bbFile); } case BBProtocol.OP_SHARETEXT: { BbTcpPacket_ShareText bbText = new BbTcpPacket_ShareText(this); bbText.ProcessData(data); return(bbText); } case BBProtocol.OP_ENCRYPTIONACK: { BbTcpPacket_EncryptionACK bbCrypt = new BbTcpPacket_EncryptionACK(this); bbCrypt.ProcessData(data); return(bbCrypt); } case BBProtocol.OP_ENCRYPTIONAUTHANS: { BbTcpPacket_Encryption_AuthAns bbAuth = new BbTcpPacket_Encryption_AuthAns(this); bbAuth.ProcessData(data); return(bbAuth); } case BBProtocol.OP_TEXTSYNCUPDATE: { BbTcpPacket_TextSyncUpdate bbTextSync = new BbTcpPacket_TextSyncUpdate(this); bbTextSync.ProcessData(data); return(bbTextSync); } case BBProtocol.OP_SHAREDCLIPBOARDCONTENT: { BbTcpPacket_ClipboardContent bbClipboard = new BbTcpPacket_ClipboardContent(this); bbClipboard.ProcessData(data); return(bbClipboard); } case BBProtocol.OP_PING_ACK: { BbTcpPacket_Pink_ACK bbPingACK = new BbTcpPacket_Pink_ACK(this); bbPingACK.ProcessData(data); return(bbPingACK); } case BBProtocol.OP_CAPTURESTATE: { BbTcpPacket_CaptureState bbCaptureState = new BbTcpPacket_CaptureState(this); bbCaptureState.ProcessData(data); return(bbCaptureState); } case BBProtocol.OP_CAPTUREDATA: { BbTcpPacket_SendScreenCaptureData bbCaptureData = new BbTcpPacket_SendScreenCaptureData(this); bbCaptureData.ProcessData(data); return(bbCaptureData); } default: { ParseError = "Opcode unsupported - " + Opcode; return(this); } } } } catch (IOException e) { ParseError = "Packet size unexpected short, discard - " + e.Message; return(this); } }