blob: 5266d605b1d7a952115d417ebda73e2323015054 [file] [log] [blame]
xjde81d1d2021-11-25 15:01:52 +08001/* Copyright Statement:
2 *
3 * This software/firmware and related documentation ("MediaTek Software") are
4 * protected under relevant copyright laws. The information contained herein
5 * is confidential and proprietary to MediaTek Inc. and/or its licensors.
6 * Without the prior written permission of MediaTek inc. and/or its licensors,
7 * any reproduction, modification, use or disclosure of MediaTek Software,
8 * and information contained herein, in whole or in part, shall be strictly prohibited.
9 */
10/* MediaTek Inc. (C) 2010. All rights reserved.
11 *
12 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
13 * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
14 * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
15 * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
18 * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
19 * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
20 * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
21 * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
22 * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
23 * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
24 * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
25 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
26 * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
27 * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
28 * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
29 * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
30 *
31 * The following software/firmware and/or related documentation ("MediaTek Software")
32 * have been modified by MediaTek Inc. All revisions are subject to any receiver's
33 * applicable license agreements with MediaTek Inc.
34 */
35#include <alloca.h>
36#include <stdlib.h>
37#include <stdio.h>
38#include <vendor-ril/telephony/ril.h>
39#include "common.h"
40#undef LOG_TAG
41#define LOG_TAG "DEMO_RspDisp"
42
43//data struct
44typedef struct{
45 int request;
46 RIL_SOCKET_ID socket_id;
47 char* arg;
48}ResponseDisptachData;
49
50struct RspDisp_Event{
51 struct RspDisp_Event* next;
52 struct RspDisp_Event* prev;
53 ResponseDisptachData data;
54};
55//global variable
56static pthread_mutex_t s_listMutex = PTHREAD_MUTEX_INITIALIZER;
57static pthread_cond_t s_listCond = PTHREAD_COND_INITIALIZER;
58//marco define
59#define LIST_LOCK() pthread_mutex_lock(&s_listMutex)
60#define LIST_UNLOCK() pthread_mutex_unlock(&s_listMutex)
61#define WAITLIST() pthread_cond_wait(&s_listCond,&s_listMutex)
62#define WAKEUPLIST() pthread_cond_signal(&s_listCond)
63
64//list variable and function announce
65static struct RspDisp_Event rspDisp_list;
66void initList(struct RspDisp_Event* list);
67void addToList(struct RspDisp_Event* ev, struct RspDisp_Event* list);
68void removeFromList(struct RspDisp_Event* ev);
69
70//function define
71void initList(struct RspDisp_Event* list)
72{
73 memset(list, 0 ,sizeof(struct RspDisp_Event));
74 list->next = list;
75 list->prev = list;
76 RLOGD("Demo Ril_event init list!");
77}
78
79void addToList(struct RspDisp_Event* ev, struct RspDisp_Event* list)
80{ //add to list tail
81 ev->next = list;
82 ev->prev = list->prev;
83 ev->prev->next = ev;
84 list->prev = ev;
85 RLOGD("Demo Ril_event add an event to list!");
86}
87
88void removeFromList(struct RspDisp_Event* ev)
89{
90 ev->next->prev = ev->prev;
91 ev->prev->next = ev->next;
92 ev->next = NULL;
93 ev->prev = NULL;
94 RLOGD("Demo Ril_event remove an event from list!");
95}
96
97void ARspRequestWithArg(int request, const char* arg,RIL_SOCKET_ID socket_id)
98{
99 struct RspDisp_Event* event = (struct RspDisp_Event*)malloc(sizeof(struct RspDisp_Event));
100
101 if(event == NULL)
102 {
103 RLOGE("malloc event memory error!");
104 return;
105 }
106 RLOGD("A Request happened, request is %s!",android::requestToString(request));
107 event->data.request = request;
108 if (arg != NULL) {
109 event->data.arg = strdup(arg);
110 } else {
111 event->data.arg = NULL;
112 }
113
114 event->data.socket_id = socket_id;
115 event->prev = NULL;
116 event->next = NULL;
117 LIST_LOCK();
118 addToList(event,&rspDisp_list);
119 WAKEUPLIST();
120 LIST_UNLOCK();
121 return;
122}
123
124void ARspRequest (int request,RIL_SOCKET_ID socket_id)
125{
126 ARspRequestWithArg(request, NULL,socket_id);
127}
128
129int dispOnSupport(int request)
130{
131 switch (request){
132 case RIL_REQUEST_GET_CURRENT_CALLS: return 1;
133 case RIL_REQUEST_ANSWER: return 1;
134 case RIL_REQUEST_GET_SIM_STATUS: return 1;
135 case RIL_REQUEST_DATA_REGISTRATION_STATE: return 1;
136 case RIL_REQUEST_VOICE_REGISTRATION_STATE: return 1;
137 case RIL_REQUEST_SMS_ACKNOWLEDGE: return 1;
138 case RIL_REQUEST_OEM_HOOK_RAW: return 1;
139 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return 1;
140 case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: return 1;
141 case RIL_REQUEST_RADIO_POWER: return 1;
142 case RIL_REQUEST_ALLOW_DATA: return 1;
143 case RIL_REQUEST_CDMA_FLASH: return 1;
144 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return 1;
145 //case :return 1;
146 default:return 0;
147 }
148}
149//ResponseDispatch function used for :
150// 1. ril request triggered by RIL_onRequestComplete flow
151// 2. ril request triggered by RIL_onUnsolicitedResponse flow
152void responseDispatch()
153{
154 struct RspDisp_Event* event = NULL;
155 RLOGD("start loop!");
156
157 prctl(PR_SET_NAME,(unsigned long)"demo_Rsp_disp");
158
159 LIST_LOCK();
160 initList(&rspDisp_list);
161 LIST_UNLOCK();
162
163 for(;;){
164
165 LIST_LOCK();
166 if(rspDisp_list.next == &rspDisp_list) { //if blank list then wait
167 RLOGD("blank list ,then wait!");
168 while(rspDisp_list.next == &rspDisp_list){
169 WAITLIST();
170 }
171 }
172 event = rspDisp_list.next;
173 removeFromList(event);
174 LIST_UNLOCK();
175
176 // do ril request
177 if(dispOnSupport(event->data.request) != 1) {
178 RLOGD("event not support!");
179 goto event_done;
180 }
181 android::RspDispFunction(event->data.request, event->data.arg, event->data.socket_id);
182
183 event_done:
184 if(event != NULL) {
185 if(event->data.arg != NULL) {
186 free(event->data.arg);
187 event->data.arg = NULL;
188 }
189 free(event);
190 event = NULL;
191 }
192 }
193
194 return;
195}