/// <summary>
        /// Creates an AbandonRequest packet.
        /// </summary>
        /// <param name="context">The user context which contains message ID.</param>
        /// <param name="messageId">The ID of message to be abandoned.</param>
        /// <returns>The packet that contains the request.</returns>
        internal override AdtsAbandonRequestPacket CreateAbandonRequest(AdtsLdapContext context, long messageId)
        {
            AbandonRequest abandonRequest = new AbandonRequest(messageId);

            LDAPMessage_protocolOp operation = new LDAPMessage_protocolOp();

            operation.SetData(LDAPMessage_protocolOp.abandonRequest, abandonRequest);

            LDAPMessage message             = new LDAPMessage(new MessageID(context.MessageId), operation);
            AdtsAbandonRequestPacket packet = new AdtsAbandonRequestPacket();

            packet.ldapMessagev2 = message;
            packet.messageId     = context.MessageId;

            return(packet);
        }
        public static DERProtocolOperation Extract(ICollection <byte> buffer)
        {
            var result = new DERProtocolOperation();

            result.ExtractTagAndLength(buffer);
            switch (result.Tag.LdapCommand)
            {
            case LdapCommands.SearchRequest:
                result.Operation = SearchRequest.Extract(buffer);
                break;

            case LdapCommands.BindRequest:
                result.Operation = BindRequest.Extract(buffer);
                break;

            case LdapCommands.UnbindRequest:
                result.Operation = UnbindRequest.Extract(buffer);
                break;

            case LdapCommands.AddRequest:
                result.Operation = AddRequest.Extract(buffer);
                break;

            case LdapCommands.DelRequest:
                result.Operation = DelRequest.Extract(buffer, result.Length);
                break;

            case LdapCommands.ModifyDNRequest:
                result.Operation = ModifyDNRequest.Extract(buffer);
                break;

            case LdapCommands.CompareRequest:
                result.Operation = CompareRequest.Extract(buffer);
                break;

            case LdapCommands.AbandonRequest:
                result.Operation = AbandonRequest.Extract(buffer);
                break;

            case LdapCommands.ModifyRequest:
                result.Operation = ModifyRequest.Extract(buffer);
                break;

            case LdapCommands.SearchResultDone:
                result.Operation = SearchResultDone.Extract(buffer);
                break;

            case LdapCommands.BindResponse:
                result.Operation = BindResponse.Extract(buffer);
                break;

            case LdapCommands.AddResponse:
                result.Operation = AddResponse.Extract(buffer);
                break;

            case LdapCommands.SearchResultEntry:
                result.Operation = SearchResultEntry.Extract(buffer);
                break;
            }

            return(result);
        }