/* Copyright (C) 2015 The Android Open Source Project
 **
 ** This software is licensed under the terms of the GNU General Public
 ** License version 2, as published by the Free Software Foundation, and
 ** may be copied, distributed, and modified under those terms.
 **
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 */

#include "android-qemu2-glue/qemu-control-impl.h"

#include "android/android.h"
#include "android/emulation/control/cellular_agent.h"
#include "android/network/globals.h"
#include "android/shaper.h"
#include "android/telephony/modem_driver.h"

static void cellular_setSignalStrength(int zeroTo31)
{
    // (See do_gsm_signal() in android-qemu1-glue/console.c)

    if (android_modem) {
        if (zeroTo31 <  0) zeroTo31 =  0;
        if (zeroTo31 > 31) zeroTo31 = 31;

        amodem_set_signal_strength(android_modem, zeroTo31, 99);
    }
}

static void cellular_setSignalStrengthProfile(enum CellularSignal signal)
{
    // (See do_gsm_signal_profile() in android-qemu1-glue/console.c)
    if (android_modem) {
        int signalQuality = -1;
        switch (signal) {
            case Cellular_Signal_None: signalQuality = 0; break;
            case Cellular_Signal_Poor: signalQuality = 1; break;
            case Cellular_Signal_Moderate: signalQuality = 2; break;
            case Cellular_Signal_Good: signalQuality = 3; break;
            case Cellular_Signal_Great: signalQuality = 4; break;
        }
        if (signalQuality >= 0) {
            amodem_set_signal_strength_profile(android_modem, signalQuality);
        }
    }
}

static void cellular_setVoiceStatus(enum CellularStatus voiceStatus)
{
    // (See do_gsm_voice() in android-qemu1-glue/console.c)
    ARegistrationState  state = A_REGISTRATION_UNKNOWN;

    if (android_modem) {
        switch (voiceStatus) {
            case Cellular_Stat_Home:          state = A_REGISTRATION_HOME;          break;
            case Cellular_Stat_Roaming:       state = A_REGISTRATION_ROAMING;       break;
            case Cellular_Stat_Searching:     state = A_REGISTRATION_SEARCHING;     break;
            case Cellular_Stat_Denied:        state = A_REGISTRATION_DENIED;        break;
            case Cellular_Stat_Unregistered:  state = A_REGISTRATION_UNREGISTERED;  break;
        }

        amodem_set_voice_registration(android_modem, state);
    }
}

static void cellular_setDataStatus(enum CellularStatus dataStatus)
{
    // (See do_gsm_data() in android-qemu1-glue/console.c)
    ARegistrationState  state = A_REGISTRATION_UNKNOWN;

    switch (dataStatus) {
        case Cellular_Stat_Home:          state = A_REGISTRATION_HOME;          break;
        case Cellular_Stat_Roaming:       state = A_REGISTRATION_ROAMING;       break;
        case Cellular_Stat_Searching:     state = A_REGISTRATION_SEARCHING;     break;
        case Cellular_Stat_Denied:        state = A_REGISTRATION_DENIED;        break;
        case Cellular_Stat_Unregistered:  state = A_REGISTRATION_UNREGISTERED;  break;
    }

    if (android_modem) {
        amodem_set_data_registration(android_modem, state);
    }

    android_net_disable = (state != A_REGISTRATION_HOME    &&
                        state != A_REGISTRATION_ROAMING );
}

static void cellular_setStandard(enum CellularStandard cStandard)
{
    // (See do_network_speed() in android-qemu1-glue/console.c)
    char *speedName;

    switch (cStandard) {
        case Cellular_Std_GSM:    speedName = "gsm";    break;
        case Cellular_Std_HSCSD:  speedName = "hscsd";  break;
        case Cellular_Std_GPRS:   speedName = "gprs";   break;
        case Cellular_Std_EDGE:   speedName = "edge";   break;
        case Cellular_Std_UMTS:   speedName = "umts";   break;
        case Cellular_Std_HSDPA:  speedName = "hsdpa";  break;
        case Cellular_Std_LTE:    speedName = "lte";    break;
        case Cellular_Std_full:   speedName = "full";   break;

        default:
            return; // Error
    }

    // Find this entry in the speed table and set
    // android_net_download_speed and android_net_upload_speed
    if (android_parse_network_speed(speedName) < 0) {
        return;
    }

    // Tell the network shaper the new rates
    netshaper_set_rate(android_net_shaper_in,  android_net_download_speed);
    netshaper_set_rate(android_net_shaper_out, android_net_upload_speed);

    if (android_modem) {
        // Tell the guest about the new network type.
        amodem_set_data_network_type(android_modem,
                                     android_parse_network_type(speedName));
    }
}

static const QAndroidCellularAgent sQAndroidCellularAgent = {
    .setSignalStrength = cellular_setSignalStrength,
    .setSignalStrengthProfile = cellular_setSignalStrengthProfile,
    .setVoiceStatus = cellular_setVoiceStatus,
    .setDataStatus = cellular_setDataStatus,
    .setStandard = cellular_setStandard};
const QAndroidCellularAgent* const gQAndroidCellularAgent =
        &sQAndroidCellularAgent;
