/* * This file is part of QMI-RIL. * * Copyright (C) 2010-2011 Joerie de Gram * Copyright (C) 2011-2014 Paul Kocialkowski * Copyright (C) 2017 Wolfgang Wiedmeyer * * QMI-RIL is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QMI-RIL 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. * * You should have received a copy of the GNU General Public License * along with QMI-RIL. If not, see . */ #ifndef _QMI_RIL_H_ #define _QMI_RIL_H_ #include #include #include #include #include #include #include /* * Values */ #define RIL_VERSION_STRING "QMI-RIL" /* * Macros */ #ifdef ALOGI #define RIL_LOGI ALOGI #else #define RIL_LOGI LOGI #endif #ifdef ALOGD #define RIL_LOGD ALOGD #else #define RIL_LOGD LOGD #endif #ifdef ALOGE #define RIL_LOGE ALOGE #else #define RIL_LOGE LOGE #endif #define RIL_REQUEST_LOCK() pthread_mutex_lock(&ril_data->request_mutex) #define RIL_REQUEST_UNLOCK() pthread_mutex_unlock(&ril_data->request_mutex) /* * RIL request */ enum { RIL_REQUEST_PENDING, RIL_REQUEST_HANDLED, RIL_REQUEST_UNHANDLED, RIL_REQUEST_COMPLETED, }; struct ril_request_handler { int request; int (*handler)(void *data, size_t size, RIL_Token token); }; struct ril_request { int request; void *data; size_t size; RIL_Token token; int status; }; extern struct ril_request_handler ril_request_handlers[]; extern unsigned int ril_request_handlers_count; int ril_request_register(int request, void *data, size_t size, RIL_Token token); int ril_request_unregister(struct ril_request *request); int ril_request_flush(void); struct ril_request *ril_request_find(void); struct ril_request *ril_request_find_request_status(int request, int status); struct ril_request *ril_request_find_request(int request); struct ril_request *ril_request_find_token(RIL_Token token); struct ril_request *ril_request_find_status(int status); int ril_request_complete(RIL_Token token, RIL_Errno error, void *data, size_t size); int ril_request_unsolicited(int request, void *data, size_t size); int ril_request_timed_callback(RIL_TimedCallback callback, void *data, const struct timeval *time); /* * RIL request data */ struct ril_request_data { int request; void *data; size_t size; }; int ril_request_data_register(int request, void *data, size_t size); int ril_request_data_unregister(struct ril_request_data *request_data); int ril_request_data_flush(void); struct ril_request_data *ril_request_data_find_request(int request); int ril_request_data_free(int request); int ril_request_data_set(int request, void *data, size_t size); int ril_request_data_set_uniq(int request, void *data, size_t size); size_t ril_request_data_size_get(int request); void *ril_request_data_get(int request); /* * RIL radio state */ int ril_radio_state_update(RIL_RadioState radio_state); int ril_radio_state_check(RIL_RadioState radio_state); /* * RIL data */ struct ril_data_connection { guint32 packet_data_handle; gboolean raw_ip_mode; int status; int active; const char *iface; char *type; char *ip_addr; char *subnet_mask; char *gateway; char *dns1; char *dns2; }; struct ril_data { const struct RIL_Env *env; RIL_RadioState radio_state; char *sim_pin; struct list_head *requests; struct list_head *requests_data; struct ril_data_connection data_connection; pthread_t request_thread; pthread_mutex_t request_mutex; }; extern struct ril_data *ril_data; int ril_data_create(void); int ril_data_destroy(void); /* Context */ typedef struct { GFile *file; QmiDevice *device; QmiClientDms *DmsClient; QmiClientNas *NasClient; QmiClientUim *UimClient; QmiClientWds *WdsClient; QmiClientWda *WdaClient; GCancellable *cancellable; guint dms_event_report_indication_id; guint serving_system_indication_id; guint nas_event_report_indication_id; guint packet_status_timeout_id; } Context; Context *ctx; int create_qmi_clients(void); int all_clients_running(void); /* * Power */ void dms_event_report_indication_cb(QmiClientDms *client, QmiIndicationDmsEventReportOutput *output); int ril_request_radio_power(void *data, size_t size, RIL_Token token); /* * Call */ int ril_request_get_current_calls(void *data, size_t size, RIL_Token token); /* * SIM */ int ril_request_get_sim_status(void *data, size_t size, RIL_Token token); int ril_request_query_facility_lock(void *data, size_t size, RIL_Token token); int ril_request_sim_io(void *data, size_t size, RIL_Token token); /* * Network */ void serving_system_indication_cb(QmiClientNas *client, QmiIndicationNasServingSystemOutput *output); void nas_event_report_indication_cb(QmiClientNas *client, QmiIndicationNasEventReportOutput *output); int ril_request_signal_strength(void *data, size_t size, RIL_Token token); int ril_request_query_network_selection_mode(void *data, size_t size, RIL_Token token); int ril_request_operator(void *data, size_t size, RIL_Token token); int ril_request_registration_state(void *data, size_t size, RIL_Token token); int ril_request_set_preferred_network_type(void *data, size_t size, RIL_Token token); void qmi_set_raw_ip_mode(void); /* * Misc */ int ril_request_baseband_version(void *data, size_t size, RIL_Token token); int ril_request_get_imsi(void *data, size_t size, RIL_Token token); int ril_request_get_imei(void *data, size_t size, RIL_Token token); int ril_request_get_imeisv(void *data, size_t size, RIL_Token token); int ril_request_screen_state(void *data, size_t size, RIL_Token token); /* * Data */ int ril_request_setup_data_call(void *data, size_t size, RIL_Token token); #endif