一点点
This commit is contained in:
@@ -6,6 +6,105 @@
|
||||
#include <radio_types.h>
|
||||
#include "vendor_qti_types.h"
|
||||
|
||||
/* c(req,resp,callName,CALL_NAME) */
|
||||
#define IMS_RADIO_CALL_1_0(c) \
|
||||
c(2,1,dial,DIAL) \
|
||||
c(3,31,addParticipant,ADD_PARTICIPANT) \
|
||||
c(4,11,getRegistrationState,GET_REGISTRATION_STATE) \
|
||||
c(5,2,answer,ANSWER) \
|
||||
c(6,3,hangup,HANGUP) \
|
||||
c(7,4,requestRegistrationChange,REQUEST_REGISTRATION_CHANGE) \
|
||||
c(8,5,queryServiceStatus,QUERY_SERVICE_STATUS) \
|
||||
c(9,6,setServiceStatus,SET_SERVICE_STATUS) \
|
||||
c(10,7,hold,HOLD) \
|
||||
c(11,8,resume,RESUME) \
|
||||
c(12,9,setConfig,SET_CONFIG) \
|
||||
c(13,10,getConfig,GET_CONFIG) \
|
||||
c(14,13,conference,CONFERENCE) \
|
||||
c(15,14,getClip,GET_CLIP) \
|
||||
c(16,15,getClir,GET_CLIR) \
|
||||
c(17,16,setClir,SET_CLIR) \
|
||||
c(18,17,getColr,GET_COLR) \
|
||||
c(20,18,exitEmergencyCallbackMode,EXIT_EMERGENCY_CALLBACK_MODE) \
|
||||
c(21,19,sendDtmf,SEND_DTMF) \
|
||||
c(22,20,startDtmf,START_DTMF) \
|
||||
c(23,21,stopDtmf,STOP_DTMF) \
|
||||
c(24,22,setUiTtyMode,SET_UI_TTY_MODE) \
|
||||
c(25,23,modifyCallInitiate,MODIFY_CALL_INITIATE) \
|
||||
c(26,24,modifyCallConfirm,MODIFY_CALL_CONFIRM) \
|
||||
c(27,25,queryCallForwardStatus,QUERY_CALL_FORWARD_STATUS) \
|
||||
c(29,26,getCallWaiting,GET_CALL_WAITING) \
|
||||
c(31,28,setSuppServiceNotification,SET_SUPP_SERVICE_NOTIFICATION) \
|
||||
c(32,27,explicitCallTransfer,EXPLICIT_CALL_TRANSFER) \
|
||||
c(33,12,suppServiceStatus,SUPP_SERVICE_STATUS) \
|
||||
c(34,29,getRtpStatistics,GET_RTP_STATISTICS) \
|
||||
c(35,30,getRtpErrorStatistics,GET_RTP_ERROR_STATISTICS) \
|
||||
c(36,32,deflectCall,DEFLECT_CALL) \
|
||||
c(37,33,sendGeolocationInfo,SEND_GEOLOCATION_INFO) \
|
||||
c(38,34,getImsSubConfig,GET_IMS_SUB_CONFIG) \
|
||||
c(39,35,sendRttMessage,SEND_RTT_MESSAGE) \
|
||||
c(40,36,cancelModifyCall,CANCEL_MODIFY_CALL)
|
||||
|
||||
#define IMS_RADIO_CALL_1_2(c) /* Since 1.2.0 */ \
|
||||
c(43,37,sendImsSms,SEND_IMS_SMS)
|
||||
|
||||
typedef enum ims_radio_req {
|
||||
IMS_RADIO_REQ_ANY = 0,
|
||||
IMS_RADIO_REQ_NONE = 0,
|
||||
#define IMS_RADIO_REQ_(req,resp,Name,NAME) IMS_RADIO_REQ_##NAME = req,
|
||||
|
||||
/* vendor.qti.hardware.radio.ims@1.0::IImsRadio */
|
||||
IMS_RADIO_REQ_SET_CALLBACK = 1, /* setCallback */
|
||||
IMS_RADIO_CALL_1_0(IMS_RADIO_REQ_)
|
||||
IMS_RADIO_REQ_SET_COLR = 19,
|
||||
IMS_RADIO_1_0_REQ_LAST = IMS_RADIO_REQ_CANCEL_MODIFY_CALL,
|
||||
|
||||
/* vendor.qti.hardware.radio.ims@1.1::IImsRadio */
|
||||
IMS_RADIO_REQ_HANGUP_1_1 = 41,
|
||||
IMS_RADIO_1_1_REQ_LAST = IMS_RADIO_REQ_HANGUP_1_1,
|
||||
|
||||
/* vendor.qti.hardware.radio.ims@1.2::IImsRadio */
|
||||
IMS_RADIO_REQ_HANGUP_1_2 = 42,
|
||||
IMS_RADIO_CALL_1_2(IMS_RADIO_REQ_)
|
||||
IMS_RADIO_REQ_ACKNOWLEDGE_SMS = 44,
|
||||
IMS_RADIO_REQ_ACKNOWLEDGE_SMS_REPORT = 45,
|
||||
IMS_RADIO_REQ_UNKOWN_1 = 46,
|
||||
IMS_RADIO_REQ_UNKOWN_2 = 47,
|
||||
IMS_RADIO_1_2_REQ_LAST = IMS_RADIO_REQ_UNKOWN_2,
|
||||
#undef IMS_RADIO_REQ_
|
||||
} IMS_RADIO_REQ;
|
||||
G_STATIC_ASSERT(sizeof(IMS_RADIO_REQ) == 4);
|
||||
|
||||
typedef enum ims_radio_resp {
|
||||
IMS_RADIO_RESP_ANY = 0,
|
||||
IMS_RADIO_RESP_NONE = 0,
|
||||
#define IMS_RADIO_RESP_(req,resp,Name,NAME) IMS_RADIO_RESP_##NAME = resp,
|
||||
|
||||
/* vendor.qti.hardware.radio.ims@1.1::IImsRadioResponse */
|
||||
IMS_RADIO_CALL_1_0(IMS_RADIO_RESP_)
|
||||
IMS_RADIO_1_0_RESP_LAST = IMS_RADIO_RESP_CANCEL_MODIFY_CALL,
|
||||
|
||||
/* vendor.qti.hardware.radio.ims@1.1::IImsRadioResponse */
|
||||
IMS_RADIO_1_1_RESP_LAST = IMS_RADIO_1_0_RESP_LAST,
|
||||
|
||||
/* vendor.qti.hardware.radio.ims@1.1::IImsRadioResponse */
|
||||
IMS_RADIO_CALL_1_2(IMS_RADIO_RESP_)
|
||||
IMS_RADIO_1_2_RESP_LAST = IMS_RADIO_RESP_SEND_IMS_SMS,
|
||||
|
||||
#undef IMS_RADIO_RESP_
|
||||
} IMS_RADIO_RESP;
|
||||
G_STATIC_ASSERT(sizeof(IMS_RADIO_RESP) == 4);
|
||||
|
||||
|
||||
typedef enum ims_radio_interface {
|
||||
IMS_RADIO_INTERFACE_NONE = -1, /* Since 1.4.3 */
|
||||
IMS_RADIO_INTERFACE_1_0,
|
||||
IMS_RADIO_INTERFACE_1_1,
|
||||
IMS_RADIO_INTERFACE_1_2,
|
||||
IMS_RADIO_INTERFACE_COUNT
|
||||
} IMS_RADIO_INTERFACE; /* Since 1.2.0 */
|
||||
|
||||
|
||||
#define IMS_RADIO_IFACE_PREFIX "vendor.qti.hardware.radio.ims@"
|
||||
#define IMS_RADIO_IFACE "IImsRadio"
|
||||
#define IMS_RADIO_RESPONSE_IFACE "IImsRadioResponse"
|
||||
|
||||
@@ -18,7 +18,7 @@ typedef struct qti_plugin {
|
||||
|
||||
} VendorQtiExt;
|
||||
|
||||
GType qti_plugin_get_type();
|
||||
//GType qti_plugin_get_type();
|
||||
G_DEFINE_TYPE(VendorQtiExt, qti_plugin, BINDER_EXT_TYPE_PLUGIN)
|
||||
|
||||
#define THIS_TYPE qti_plugin_get_type()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include <ofono/log.h>
|
||||
#include "vendor_qti_types.h"
|
||||
#include <glib-object.h>
|
||||
|
||||
struct qti_ims_conf{
|
||||
GObject parent;
|
||||
|
||||
@@ -1,22 +1,117 @@
|
||||
#include <ofono/log.h>
|
||||
#include <gbinder.h>
|
||||
#include <glib.h>
|
||||
#include <gutil_idlepool.h>
|
||||
|
||||
#include "vendor_qti_ims_radio.h"
|
||||
|
||||
typedef struct radio_interface_desc {
|
||||
#define DEFAULT_INTERFACE IMS_RADIO_INTERFACE_1_2
|
||||
|
||||
static const GBinderClientIfaceInfo ims_radio_iface_info[] = {
|
||||
{IMS_RADIO_1_2, IMS_RADIO_1_2_REQ_LAST },
|
||||
{IMS_RADIO_1_1, IMS_RADIO_1_1_REQ_LAST },
|
||||
{IMS_RADIO_1_0, IMS_RADIO_1_0_REQ_LAST }
|
||||
};
|
||||
G_STATIC_ASSERT(G_N_ELEMENTS(ims_radio_iface_info) == IMS_RADIO_INTERFACE_COUNT);
|
||||
|
||||
static const char* const ims_radio_indication_ifaces[] = {
|
||||
IMS_RADIO_INDICATION_1_2,
|
||||
IMS_RADIO_INDICATION_1_1,
|
||||
IMS_RADIO_INDICATION_1_0,
|
||||
NULL
|
||||
};
|
||||
G_STATIC_ASSERT(G_N_ELEMENTS(ims_radio_indication_ifaces) == IMS_RADIO_INTERFACE_COUNT + 1);
|
||||
|
||||
static const char* const ims_radio_response_ifaces[] = {
|
||||
IMS_RADIO_RESPONSE_1_2,
|
||||
IMS_RADIO_RESPONSE_1_1,
|
||||
IMS_RADIO_RESPONSE_1_0,
|
||||
NULL
|
||||
};
|
||||
G_STATIC_ASSERT(G_N_ELEMENTS(ims_radio_response_ifaces) == IMS_RADIO_INTERFACE_COUNT + 1);
|
||||
|
||||
typedef struct ims_radio_interface_desc {
|
||||
RADIO_INTERFACE version;
|
||||
const char* radio_iface;
|
||||
const char* const* ind_ifaces;
|
||||
const char* const* resp_ifaces;
|
||||
} RadioInterfaceDesc;
|
||||
} ImsRadioInterfaceDesc;
|
||||
|
||||
#define IMS_RADIO_INTERFACE_INDEX(x) (IMS_RADIO_INTERFACE_COUNT - x - 1)
|
||||
|
||||
#define IMS_RADIO_INTERFACE_DESC(v) \
|
||||
IMS_RADIO_INTERFACE_##v, IMS_RADIO_##v, \
|
||||
ims_radio_indication_ifaces + IMS_RADIO_INTERFACE_INDEX(IMS_RADIO_INTERFACE_##v), \
|
||||
ims_radio_response_ifaces + IMS_RADIO_INTERFACE_INDEX(IMS_RADIO_INTERFACE_##v)
|
||||
|
||||
static const RadioInterfaceDesc ims_radio_interfaces[] = {
|
||||
{ IMS_RADIO_INTERFACE_DESC(1_2) },
|
||||
{ IMS_RADIO_INTERFACE_DESC(1_1) },
|
||||
{ IMS_RADIO_INTERFACE_DESC(1_0) }
|
||||
};
|
||||
G_STATIC_ASSERT(G_N_ELEMENTS(ims_radio_interfaces) == IMS_RADIO_INTERFACE_COUNT);
|
||||
|
||||
|
||||
typedef GObjectClass VendorQtiImsRadioClass;
|
||||
struct qti_ims_radio {
|
||||
GObject parent;
|
||||
int num;
|
||||
|
||||
char* name;
|
||||
GBinderClient* client;
|
||||
GBinderRemoteObject* remote;
|
||||
GBinderLocalObject* response;
|
||||
GBinderLocalObject* indication;
|
||||
GUtilIdlePool* idle;
|
||||
GHashTable* table;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE(VendorQtiImsRadio, qti_ims_radio, G_TYPE_OBJECT)
|
||||
|
||||
#define THIS_TYPE qti_ims_radio_get_type()
|
||||
#define THIS(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, THIS_TYPE, VendorQtiImsRadio)
|
||||
#define IS_THIS(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, THIS_TYPE)
|
||||
#define PARENT_CLASS qti_ims_radio_parent_class
|
||||
|
||||
/*==========================================================================*
|
||||
* Internals
|
||||
*==========================================================================*/
|
||||
static
|
||||
void
|
||||
qti_ims_radio_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
VendorQtiImsRadio* self = THIS(object);
|
||||
|
||||
g_hash_table_unref(self->table);
|
||||
gbinder_client_unref(self->client);
|
||||
gutil_idle_pool_destroy(self->idle);
|
||||
G_OBJECT_CLASS(PARENT_CLASS)->finalize(object);
|
||||
}
|
||||
|
||||
static void destroy_value(gpointer hash_data) {
|
||||
printf("destroy value:%s\n",hash_data);
|
||||
//因为我这里的值是数组形式不是指针所以不用释放内存。我就直接清空吧
|
||||
/* free(hash_data);
|
||||
hash_data = NULL;*/
|
||||
//memset(hash_data,0,sizeof(hash_data));
|
||||
}
|
||||
static
|
||||
void
|
||||
qti_ims_radio_init(
|
||||
VendorQtiImsRadio* self)
|
||||
{
|
||||
self->idle = gutil_idle_pool_new();
|
||||
self->table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_value);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
qti_ims_radio_class_init(
|
||||
VendorQtiImsRadioClass* klass)
|
||||
{
|
||||
G_OBJECT_CLASS(klass)->finalize = qti_ims_radio_finalize;
|
||||
// g_signal_new
|
||||
}
|
||||
|
||||
/**
|
||||
vendor_qti_ims_radio_registration_info
|
||||
vendor_qti_ims_radio_get_reg_state_response
|
||||
@@ -30,7 +125,6 @@ vendor_qti_ims_radio_handle_call_state_changed
|
||||
vendor_qti_ims_radio_handle_sms_status_report
|
||||
vendor_qti_ims_radio_handle_incoming_ims_sms
|
||||
*/
|
||||
#define DEFAULT_INTERFACE 2
|
||||
|
||||
/*==========================================================================*
|
||||
* API
|
||||
@@ -48,9 +142,8 @@ VendorQtiImsRadio* radio_instance_new_with_version(
|
||||
GBinderServiceManager* sm = gbinder_servicemanager_new(dev);
|
||||
if (sm) {
|
||||
guint i;
|
||||
/**
|
||||
for (i = 0; i < G_N_ELEMENTS(radio_interfaces) && !self; i++) {
|
||||
const RadioInterfaceDesc* desc = radio_interfaces + i;
|
||||
for (i = 0; i < G_N_ELEMENTS(ims_radio_interfaces) && !self; i++) {
|
||||
const ImsRadioInterfaceDesc* desc = ims_radio_interfaces + i;
|
||||
|
||||
if (desc->version <= max_version) {
|
||||
char* fqname = g_strconcat(desc->radio_iface, "/", name, NULL);
|
||||
@@ -58,29 +151,24 @@ VendorQtiImsRadio* radio_instance_new_with_version(
|
||||
|
||||
if (obj) {
|
||||
GINFO("Connected to %s", fqname);
|
||||
self = vendor_qti_ims_radio_create(sm, obj, dev, slot,
|
||||
key, modem, slot_index, desc);
|
||||
self = vendor_qti_ims_radio_create(sm, obj, dev, name, desc);
|
||||
}
|
||||
g_free(fqname);
|
||||
}
|
||||
}
|
||||
*/
|
||||
gbinder_servicemanager_unref(sm);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
/**
|
||||
|
||||
VendorQtiImsRadio* vendor_qti_ims_radio_create(
|
||||
GBinderServiceManager* sm,
|
||||
GBinderRemoteObject* remote,
|
||||
const char* dev,
|
||||
const char* slot,
|
||||
const char* key,
|
||||
const char* modem,
|
||||
int slot_index,
|
||||
const RadioInterfaceDesc* desc)
|
||||
const char* name,
|
||||
const ImsRadioInterfaceDesc* desc)
|
||||
{
|
||||
VendorQtiImsRadio* self = g_object_new(THIS_TYPE, NULL);
|
||||
int status;
|
||||
|
||||
}
|
||||
*/
|
||||
Reference in New Issue
Block a user