# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
This module implements the classes for information structures encapsulated in
either |MBIMCommandMessage| or |MBIMCommandDone|.

Reference:
    [1] Universal Serial Bus Communications Class Subclass Specification for
        Mobile Broadband Interface Model
        http://www.usb.org/developers/docs/devclass_docs/
        MBIM10Errata1_073013.zip
"""
from autotest_lib.client.cros.cellular.mbim_compliance import mbim_constants
from autotest_lib.client.cros.cellular.mbim_compliance \
        import mbim_message_request
from autotest_lib.client.cros.cellular.mbim_compliance \
        import mbim_message_response


class MBIMSetConnect(mbim_message_request.MBIMCommand):
    """ The class for MBIM_SET_CONNECT structure. """

    _FIELDS = (('I', 'session_id', ''),
               ('I', 'activation_command', ''),
               ('I', 'access_string_offset', ''),
               ('I', 'access_string_size', ''),
               ('I', 'user_name_offset', ''),
               ('I', 'user_name_size', ''),
               ('I', 'password_offset', ''),
               ('I', 'password_size', ''),
               ('I', 'compression', ''),
               ('I', 'auth_protocol', ''),
               ('I', 'ip_type', ''),
               ('16s', 'context_type', ''))
    _DEFAULTS = {'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
                 'cid' : mbim_constants.MBIM_CID_CONNECT,
                 'command_type' : mbim_constants.COMMAND_TYPE_SET}


class MBIMConnectQuery(mbim_message_request.MBIMCommand):
    """ The class for MBIM_CONNECT_QUERY structure. """

    _FIELDS = (('I', 'session_id', ''),
               ('I', 'activation_state', ''),
               ('I', 'voice_call_state', ''),
               ('I', 'ip_type', ''),
               ('16s', 'context_type', ''),
               ('I', 'nw_error', ''))
    _DEFAULTS = {'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
                 'cid' : mbim_constants.MBIM_CID_CONNECT,
                 'command_type' : mbim_constants.COMMAND_TYPE_QUERY,
                 'information_buffer_length' : 36,
                 'activation_state' : 0,
                 'voice_call_state' : 0,
                 'ip_type' : 0,
                 'context_type' : mbim_constants.MBIM_CONTEXT_TYPE_NONE.bytes,
                 'nw_error' : 0}


class MBIMConnectInfo(mbim_message_response.MBIMCommandDone):
    """ The class for MBIM_CONNECT_INFO structure. """

    _FIELDS = (('I', 'session_id', ''),
               ('I', 'activation_state', ''),
               ('I', 'voice_call_state', ''),
               ('I', 'ip_type', ''),
               ('16s', 'context_type', ''),
               ('I', 'nw_error', ''))
    _IDENTIFIERS = {
            'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
            'cid' : mbim_constants.MBIM_CID_CONNECT}


class MBIMDeviceCapsQuery(mbim_message_request.MBIMCommand):
    """ The class for MBIM_DEVICE_CAPS_QUERY structure. """

    _DEFAULTS = {'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
                 'cid' : mbim_constants.MBIM_CID_DEVICE_CAPS,
                 'command_type' : mbim_constants.COMMAND_TYPE_QUERY,
                 'information_buffer_length' : 0}


class MBIMDeviceCapsInfo(mbim_message_response.MBIMCommandDone):
    """ The class for MBIM_DEVICE_CAPS_INFO structure. """

    _FIELDS = (('I', 'device_type', ''),
               ('I', 'cellular_class', ''),
               ('I', 'voice_class', ''),
               ('I', 'sim_class', ''),
               ('I', 'data_class', ''),
               ('I', 'sms_caps', ''),
               ('I', 'control_caps', ''),
               ('I', 'max_sessions', ''),
               ('I', 'custom_data_class_offset', ''),
               ('I', 'custom_data_class_size', ''),
               ('I', 'device_id_offset', ''),
               ('I', 'device_id_size', ''),
               ('I', 'firmware_info_offset', ''),
               ('I', 'firmware_info_size', ''),
               ('I', 'hardware_info_offset', ''),
               ('I', 'hardware_info_size', ''))
    _IDENTIFIERS = {
            'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
            'cid' : mbim_constants.MBIM_CID_DEVICE_CAPS}


class MBIMDeviceServicesQuery(mbim_message_request.MBIMCommand):
    """ The class for MBIM_DEVICE_SERVICES_QUERY structure. """

    _DEFAULTS = {'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
                 'cid' : mbim_constants.MBIM_CID_DEVICE_SERVICES,
                 'command_type' : mbim_constants.COMMAND_TYPE_QUERY,
                 'information_buffer_length' : 0}


class MBIMDeviceServicesInfo(mbim_message_response.MBIMCommandDone):
    """ The class for MBIM_DEVICE_SERVICES_INFO structure. """

    # The length of |device_services_ref_list| depends on the value of
    # |device_services_count|.
    _FIELDS = (('I', 'device_services_count', ''),
               ('I', 'max_dss_sessions', ''))
               #('Q', 'device_services_ref_list', ''))
    _IDENTIFIERS = {
            'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
            'cid' : mbim_constants.MBIM_CID_DEVICE_SERVICES}


class MBIMRadioStateInfo(mbim_message_response.MBIMCommandDone):
    """ The class for MBIM_RADIO_STATE_INFO structure. """

    _FIELDS = (('I', 'hw_radio_state', ''),
               ('I', 'sw_radio_state', ''))


class MBIMIPConfigurationQuery(mbim_message_request.MBIMCommand):
    """ The class for MBIM_IP_CONFIGURATION_INFO structure. """

    _FIELDS = (('I', 'session_id', ''),
               ('I', 'ipv4_configuration_available', ''),
               ('I', 'ipv6_configuration_available', ''),
               ('I', 'ipv4_address_count', ''),
               ('I', 'ipv4_address_offset', ''),
               ('I', 'ipv6_address_count', ''),
               ('I', 'ipv6_address_offset', ''),
               ('I', 'ipv4_gateway_offset', ''),
               ('I', 'ipv6_gateway_offset', ''),
               ('I', 'ipv4_dns_server_count', ''),
               ('I', 'ipv4_dns_server_offset', ''),
               ('I', 'ipv6_dns_server_count', ''),
               ('I', 'ipv6_dns_server_offset', ''),
               ('I', 'ipv4_mtu', ''),
               ('I', 'ipv6_mtu', ''))
    _DEFAULTS = {'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
                 'cid' : mbim_constants.MBIM_CID_IP_CONFIGURATION,
                 'command_type' : mbim_constants.COMMAND_TYPE_QUERY,
                 'information_buffer_length' : 60,
                 'ipv4_configuration_available' : 0,
                 'ipv6_configuration_available' : 0,
                 'ipv4_address_count' : 0,
                 'ipv4_address_offset' : 0,
                 'ipv6_address_count' : 0,
                 'ipv6_address_offset' : 0,
                 'ipv4_gateway_offset' : 0,
                 'ipv6_gateway_offset' : 0,
                 'ipv4_dns_server_count' : 0,
                 'ipv4_dns_server_offset' : 0,
                 'ipv6_dns_server_count' : 0,
                 'ipv6_dns_server_offset' : 0,
                 'ipv4_mtu' : 0,
                 'ipv6_mtu' : 0}


class MBIMIPConfigurationInfo(mbim_message_response.MBIMCommandDone):
    """ The class for MBIM_IP_CONFIGURATION_INFO structure. """

    _FIELDS = (('I', 'session_id', ''),
               ('I', 'ipv4_configuration_available', ''),
               ('I', 'ipv6_configuration_available', ''),
               ('I', 'ipv4_address_count', ''),
               ('I', 'ipv4_address_offset', ''),
               ('I', 'ipv6_address_count', ''),
               ('I', 'ipv6_address_offset', ''),
               ('I', 'ipv4_gateway_offset', ''),
               ('I', 'ipv6_gateway_offset', ''),
               ('I', 'ipv4_dns_server_count', ''),
               ('I', 'ipv4_dns_server_offset', ''),
               ('I', 'ipv6_dns_server_count', ''),
               ('I', 'ipv6_dns_server_offset', ''),
               ('I', 'ipv4_mtu', ''),
               ('I', 'ipv6_mtu', ''))
    _IDENTIFIERS = {
            'device_service_id' : mbim_constants.UUID_BASIC_CONNECT.bytes,
            'cid' : mbim_constants.MBIM_CID_IP_CONFIGURATION}