Exemple #1
0
        /// <summary>
        /// Processes the inner TLV list in TLV 0x0005 and returns a new DirectConnection
        /// </summary>
        private DirectConnection ProcessChannel2Tlv05(ByteStream stream, UserInfo ui, DataPacket dp)
        {
            byte[] invitemessage;
                    Encoding encoding = Encoding.ASCII;
                    string language = "en";

                    DirectConnection directconn = null;

                    // Pull the type, cookie, and capability array
                    RendezvousType rtype = RendezvousData.TypeFromUshort(stream.ReadUshort());
                    Cookie cookie = Cookie.GetReceivedCookie(stream.ReadByteArray(8));
                    byte[] capabilitiesArray = stream.ReadByteArray(16);
                    Capabilities capabilities = CapabilityProcessor.ProcessCLSIDList(capabilitiesArray);

                    // Create the correct type of connection based on the capability
                    if (capabilities == Capabilities.SendFiles)
                    {
                        if ((directconn = parent.Connections.GetDirectConnectionByCookie(cookie)) == null)
                        {
                            directconn = parent.Connections.CreateNewFileTransferConnection(
                                DirectConnectionMethod.Direct, DirectConnectRole.Receiver);
                        }
                    }
                    else if (capabilities == Capabilities.DirectIM)
                    {
                        if ((directconn = parent.Connections.GetDirectConnectionByCookie(cookie)) == null)
                        {
                            directconn = parent.Connections.CreateNewDirectIMConnection(
                                DirectConnectionMethod.Direct, DirectConnectRole.Receiver);
                        }
                    }
                    else if (capabilities == Capabilities.Chat)
                    {
                        directconn = parent.Connections.CreateNewChatInvitationConnection(DirectConnectRole.Receiver);
                    }
                    else
                    {
                        // Currently unsupported
                        parent.OnWarning(ServerErrorCode.UnknownRendezvousChannel, dp);
                        return null;
                    }

                    directconn.Other = ui;
                    directconn.Cookie = cookie;
                    directconn.Type = rtype;

                    ByteStream serviceData = null;
                    Encoding serviceDataEncoding = Encoding.ASCII;

                    // Process the inner TLV list
                    using (TlvBlock tlvs = new TlvBlock(stream.ReadByteArrayToEnd()))
                    {
                        directconn.AOLProxyIP = tlvs.ReadIPAddress(DC_PROXY_IP_ADDRESS);        // proxy ip
                        directconn.ClientIP = tlvs.ReadIPAddress(DC_CLIENT_IP_ADDRESS);         // internal ip
                        directconn.VerifiedIP = tlvs.ReadIPAddress(0x0004);                     // external ip
                        directconn.Port = tlvs.ReadUshort(DC_PORT);
                        directconn.Sequence = RendezvousData.SequenceFromUshort(tlvs.ReadUshort(DC_SEQUENCE_NUMBER));
                        invitemessage = tlvs.ReadByteArray(DC_MESSAGE);
                        if (tlvs.HasTlv(0x000D))
                        {
                            encoding = Encoding.GetEncoding(tlvs.ReadString(0x000D, Encoding.ASCII));
                        }
                        language = tlvs.ReadString(0x000E, Encoding.ASCII);
                        directconn.Method = (tlvs.HasTlv(DC_USE_PROXY_FLAG))
                            ?
                            DirectConnectionMethod.Proxied
                            : DirectConnectionMethod.Direct;

                        serviceData = new ByteStream(tlvs.ReadByteArray(0x2711));
                        if (tlvs.HasTlv(0x2712))
                        {
                            serviceDataEncoding = Encoding.GetEncoding(tlvs.ReadString(0x2712, Encoding.ASCII));
                        }
                    }

                    if (invitemessage != null)
                    {
                        directconn.Message = encoding.GetString(invitemessage, 0, invitemessage.Length);
                    }

                    // Process the extra data, if necessary
                    if (directconn is FileTransferConnection || directconn is DirectIMConnection)
                    {
                        ProcessDirectConnectionRequest(directconn, serviceData);
                    }
                    else if (directconn is ChatInvitationConnection)
                    {
                        ChatInvitationConnection cic = directconn as ChatInvitationConnection;
                        cic.ChatInvite = new ChatInvitation();
                        cic.ChatInvite.Message = directconn.Message;
                        cic.ChatInvite.Encoding = encoding;
                        cic.ChatInvite.Language = language;
                        ProcessChatInvitationRequest(cic, serviceData);
                    }

                    return directconn;
        }