// Copyright 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/telephony/modem_init.h"

#include "android/telephony/modem_driver.h"
#include "android-qemu2-glue/utils/stream.h"

#include "qemu/osdep.h"
#include "hw/hw.h"

#include <assert.h>

#define MODEM_DEV_STATE_SAVE_VERSION 1

static void modem_state_save(QEMUFile* file, void* opaque)
{
    Stream* const s = stream_from_qemufile(file);
    amodem_state_save((AModem)opaque, (SysFile*)s);
    stream_free(s);
}

static int modem_state_load(QEMUFile* file, void* opaque, int version_id)
{
    if (version_id != MODEM_DEV_STATE_SAVE_VERSION)
        return -1;

    Stream* const s = stream_from_qemufile(file);
    const int res = amodem_state_load((AModem)opaque, (SysFile*)s);
    stream_free(s);

    return res;
}


void qemu_android_modem_init(int base_port) {
    android_modem_init(base_port);

    assert(android_modem_serial_line != NULL);

    register_savevm(NULL,
                    "android_modem",
                    0,
                    MODEM_DEV_STATE_SAVE_VERSION,
                    modem_state_save,
                    modem_state_load,
                    android_modem);
}
