Example #1
0
 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);
 }
Example #2
0
        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));
            }
        }
Example #3
0
        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);
            }
        }