| /* Copyright Statement: | 
 |  * | 
 |  * This software/firmware and related documentation ("MediaTek Software") are | 
 |  * protected under relevant copyright laws. The information contained herein | 
 |  * is confidential and proprietary to MediaTek Inc. and/or its licensors. | 
 |  * Without the prior written permission of MediaTek inc. and/or its licensors, | 
 |  * any reproduction, modification, use or disclosure of MediaTek Software, | 
 |  * and information contained herein, in whole or in part, shall be strictly prohibited. | 
 |  */ | 
 | /* MediaTek Inc. (C) 2010. All rights reserved. | 
 |  * | 
 |  * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES | 
 |  * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") | 
 |  * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON | 
 |  * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, | 
 |  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF | 
 |  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. | 
 |  * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE | 
 |  * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR | 
 |  * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH | 
 |  * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES | 
 |  * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES | 
 |  * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK | 
 |  * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR | 
 |  * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND | 
 |  * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, | 
 |  * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, | 
 |  * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO | 
 |  * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. | 
 |  * | 
 |  * The following software/firmware and/or related documentation ("MediaTek Software") | 
 |  * have been modified by MediaTek Inc. All revisions are subject to any receiver's | 
 |  * applicable license agreements with MediaTek Inc. | 
 |  */ | 
 |  | 
 | #include <cutils/sockets.h> | 
 | #if defined(__ANDROID__) | 
 | #include <utils/Log.h> | 
 | #else | 
 | #include <cutils/log.h> | 
 | #endif | 
 | #include <assert.h> | 
 |  | 
 | #include "ril.h" | 
 | #include "socket_util.h" | 
 |  | 
 | #if defined(MODE_DSSS) | 
 | #include <cutils/properties.h> | 
 |  | 
 | #define DISABLE_SIM_NUM "persist.radio.dsss.sim.disable" | 
 | #define getDisableSim(value) {\ | 
 |                                                      char property_value[20] = {0};\ | 
 |                                                      property_get(DISABLE_SIM_NUM, property_value, "2");\ | 
 |                                                      value = atoi(property_value);\ | 
 |                                                      RLOGD("[RilpSocketUtil]property:%s = %d", DISABLE_SIM_NUM, value);\ | 
 |                                                  } while(0) | 
 |                                                   | 
 | #endif | 
 |  | 
 | #if defined(TELEPHONYWARE)  | 
 | #include <stdlib.h> | 
 | #include <stdio.h> | 
 | #include <fcntl.h>  | 
 | #include <sys/stat.h>   | 
 | #include <semaphore.h> | 
 | #include <cutils/properties.h> | 
 |  | 
 | #define SOCKET_COUNT "persist.ril.client.num"    //to be confirmed | 
 | //#define SEM_NAME "/sem_socket1" | 
 | //#define SEM_NAME2 "/sem_socket2" | 
 | //#define SLOTCOUNT 2 | 
 |  | 
 | char socket_status[RIL_SOCKET_NUM][35]= { | 
 |     "rild.socket.status1", | 
 | #if (SIM_COUNT >= 2) | 
 |     "rild.socket.status2", | 
 | #endif | 
 | }; | 
 |  | 
 | int RilpSocketUtil::selectSocket(RIL_SOCKET_ID socket_id) | 
 | { | 
 |     char property_count[20] = {0}; | 
 |     int count; | 
 |     char property_status[20] = {0}; | 
 |     long long status; | 
 |      | 
 |     property_get(SOCKET_COUNT, property_count, "0"); | 
 |     count = atoi(property_count); | 
 |     RLOGD("[selectSocket]%s = %s, count = %d", SOCKET_COUNT, property_count, count); | 
 |     property_get(socket_status[socket_id], property_status, "0"); | 
 |     sscanf(property_status, "%lld", &status); | 
 |     RLOGD("[selectSocket]%s = %s, status = %lld", socket_status[socket_id], property_status, status); | 
 |     if(count > (8*sizeof(long long) -1)) { | 
 |         RLOGE("[selectSocket]socket count reach the upper limit, count = %d, limit = %d", count, (8*sizeof(long long) -1)); | 
 |     } | 
 |     for(int i = 0; i < count; i++) { | 
 |         if((((long long)1<<i) & status) == 0) { | 
 |             //status = status | (1<<i); | 
 |             //sprintf(property_status, "%lld", status); | 
 |             //property_set(socket_status[socket_id], property_status); | 
 |             RLOGD("[selectSocket]selected client id = %d", i); | 
 |             return i; | 
 |         } | 
 |     } | 
 |     RLOGD("[selectSocket]no valid socket to use"); | 
 |     return -1; | 
 | } | 
 | #endif | 
 |  | 
 | char* RilpSocketUtil::getSocketName(RILD_RadioTechnology_Group group, RIL_SOCKET_ID socket_id) { | 
 |     char *socketName = "null"; | 
 |     #if defined(TELEPHONYWARE)  | 
 |     int socket_num = -1; | 
 |     //sem_t *sem; | 
 |     #endif | 
 |     #if  defined(MODE_DSSS) | 
 |     int disableSimNum=-1; | 
 |     #endif | 
 |     if(group == RADIO_TECH_GROUP_GSM) { | 
 |         switch(socket_id) { | 
 |             case RIL_SOCKET_1: | 
 |         #if  defined(ANDROID_MULTI_SIM) && !defined(MODE_DSSS)  //DSDS  | 
 |             #if defined(TELEPHONYWARE)  | 
 |                 //sem = sem_open(SEM_NAME, O_CREAT, 0644, 1);   | 
 |                 //RLOGD("[Sherry]sem = %p", sem); | 
 |                 //if(SEM_FAILED == sem){ | 
 |                     //RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno)); | 
 |                     //exit(1); | 
 |                 //} | 
 |                // sem_wait(sem); | 
 |                 //RLOGD("[Sherry]enter sem"); | 
 |                 socket_num = selectSocket(socket_id);                 | 
 |                 //sem_post(sem); | 
 |                // RLOGD("[Sherry]exit sem"); | 
 |                 if(-1 == socket_num){ | 
 |                     socketName = NULL; | 
 |                 } else { | 
 |                     socketName = (char*)malloc(20);  | 
 |                     sprintf(socketName, "rild-client%d-0", socket_num);   //to be confirmed | 
 |                 } | 
 |                 //RLOGD("[getSocketName]socketName = %s", socketName); | 
 |             #elif defined(TELE_FWK) | 
 |                 socketName = "rild"; | 
 |             #endif | 
 |         #elif defined(MODE_DSSS)    //DSSS | 
 |                 getDisableSim(disableSimNum);                | 
 |             #if defined(TELEPHONYWARE)  | 
 |                 if (2 == disableSimNum) {   //enable slot1 | 
 |                    //sem = sem_open(SEM_NAME, O_CREAT, 0644, 1);   | 
 |                     //RLOGD("[Sherry]sem = %p", sem); | 
 |                    // if(SEM_FAILED == sem){ | 
 |                        // RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno)); | 
 |                        // exit(1); | 
 |                    // } | 
 |                     //sem_wait(sem); | 
 |                     //RLOGD("[Sherry]enter sem"); | 
 |                     socket_num = selectSocket(socket_id);                 | 
 |                     //sem_post(sem); | 
 |                    // RLOGD("[Sherry]exit sem"); | 
 |                     if(-1 == socket_num){ | 
 |                         socketName = NULL; | 
 |                     } else { | 
 |                         socketName = (char*)malloc(20);  | 
 |                         sprintf(socketName, "rild-client%d", socket_num);   //to be confirmed | 
 |                     } | 
 |                 } else {  //enable slot2 | 
 |                     socketName = "disable";                 | 
 |                 } | 
 |             #elif defined(TELE_FWK)   | 
 |                 if (2 == disableSimNum) {   //enable slot1 | 
 |                     socketName = "rild"; | 
 |                 } else { | 
 |                     socketName = "disable"; | 
 |                 } | 
 |             #endif | 
 |          #else   //MT2635, only slot1 is enable | 
 |                  socketName = "mil"; | 
 |          #endif | 
 |              | 
 |                 break; | 
 |         #if (SIM_COUNT >= 2) | 
 |             case RIL_SOCKET_2:  | 
 |           #if defined(ANDROID_MULTI_SIM) && !defined(MODE_DSSS)    //DSDS | 
 |             #if defined(TELEPHONYWARE) | 
 |                 //sem = sem_open(SEM_NAME2, O_CREAT, 0644, 1);  | 
 |                 //if(SEM_FAILED == sem){ | 
 |                     //RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno)); | 
 |                     //exit(1); | 
 |                 //} | 
 |                 //sem_wait(sem); | 
 |                 socket_num = selectSocket(socket_id); | 
 |                 //sem_post(sem); | 
 |                 if(-1 == socket_num){ | 
 |                     socketName = NULL; | 
 |                 } else { | 
 |                     socketName = (char*)malloc(20);  | 
 |                     sprintf(socketName, "rild-client%d-1", socket_num);   //to be confirmed | 
 |                 } | 
 |             #elif defined(TELE_FWK)                 | 
 |                 socketName = "rild2"; | 
 |             #endif | 
 |           #elif defined(MODE_DSSS)  //DSSS | 
 |                 getDisableSim(disableSimNum);                 | 
 |             #if defined(TELEPHONYWARE)  | 
 |                 if (1 == disableSimNum) {   //enable slot2 | 
 |                   // sem = sem_open(SEM_NAME2, O_CREAT, 0644, 1);   | 
 |                     //RLOGD("[Sherry]sem = %p", sem); | 
 |                     //if(SEM_FAILED == sem){ | 
 |                         //RLOGD("[ RilpSocketUtil]sem_open failed, errno = %d (%s)", errno, strerror(errno)); | 
 |                        // exit(1); | 
 |                     //} | 
 |                     //sem_wait(sem); | 
 |                     //RLOGD("[Sherry]enter sem"); | 
 |                     socket_num = selectSocket(socket_id);                 | 
 |                     //sem_post(sem); | 
 |                    // RLOGD("[Sherry]exit sem"); | 
 |                     if(-1 == socket_num){ | 
 |                         socketName = NULL; | 
 |                     } else { | 
 |                         socketName = (char*)malloc(20);  | 
 |                         sprintf(socketName, "rild-client%d", socket_num);   //to be confirmed | 
 |                     } | 
 |                 } else {  //enable slot1 | 
 |                     socketName = "disable";                 | 
 |                 } | 
 |             #elif defined(TELE_FWK)   | 
 |                 if (1 == disableSimNum) {   //enable slot2 | 
 |                     socketName = "rild2"; | 
 |                 } else {   //enable slot1 | 
 |                     socketName = "disable"; | 
 |                 } | 
 |             #endif        | 
 |           #endif                 | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 3) | 
 |             case RIL_SOCKET_3: | 
 |                 socketName = "mrild3"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 4) | 
 |             case RIL_SOCKET_4: | 
 |                 socketName = "mrild4"; | 
 |                 break; | 
 |         #endif | 
 |             default: | 
 |                 RLOGE("Socket id is wrong!!"); | 
 |                 break; | 
 |         } | 
 |     }/** [MT2635] No need for C2K and ATCI | 
 |      else if (group == RADIO_TECH_GROUP_C2K) { | 
 |         socketName = "rild-via"; | 
 |     } else if (group == RADIO_TECH_GROUP_ATCI) { | 
 |         socketName = "rilproxy-atci"; | 
 |     }*/ else if (group == RADIO_TECH_GROUP_SAP_GSM) { | 
 |         switch (socket_id) { | 
 |             case RIL_SOCKET_1: | 
 |                 socketName = "msap_uim_socket1"; | 
 |                 break; | 
 |         #if (SIM_COUNT >= 2) | 
 |             case RIL_SOCKET_2: | 
 |                 socketName = "msap_uim_socket2"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 3) | 
 |             case RIL_SOCKET_3: | 
 |                 socketName = "msap_uim_socket3"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 4) | 
 |             case RIL_SOCKET_4: | 
 |                 socketName = "msap_uim_socket4"; | 
 |                 break; | 
 |         #endif | 
 |             default: | 
 |                 RLOGE("Socket id is wrong!!"); | 
 |                 break; | 
 |         } | 
 |     }/** [MT2635] No need for C2K, ATCI and SAP-BT @{ | 
 |      else if (group == RADIO_TECH_GROUP_SAP_C2K) { | 
 |         switch (socket_id) { | 
 |             case RIL_SOCKET_1: | 
 |                 socketName = "msap_c2k_socket1"; | 
 |                 break; | 
 |         #if (SIM_COUNT >= 2) | 
 |             case RIL_SOCKET_2: | 
 |                 socketName = "msap_c2k_socket2"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 3) | 
 |             case RIL_SOCKET_3: | 
 |                 socketName = "msap_c2k_socket3"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 4) | 
 |             case RIL_SOCKET_4: | 
 |                 socketName = "msap_c2k_socket4"; | 
 |                 break; | 
 |         #endif | 
 |             default: | 
 |                 RLOGE("Socket id is wrong!!"); | 
 |                 break; | 
 |         } | 
 |     } else if (group == RADIO_TECH_GROUP_SAP_BT) { | 
 |         switch (socket_id) { | 
 |             case RIL_SOCKET_1: | 
 |                 socketName = "sap_uim_socket1"; | 
 |                 break; | 
 |         #if (SIM_COUNT >= 2) | 
 |             case RIL_SOCKET_2: | 
 |                 socketName = "sap_uim_socket2"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 3) | 
 |             case RIL_SOCKET_3: | 
 |                 socketName = "sap_uim_socket3"; | 
 |                 break; | 
 |         #endif | 
 |         #if (SIM_COUNT >= 4) | 
 |             case RIL_SOCKET_4: | 
 |                 socketName = "sap_uim_socket4"; | 
 |                 break; | 
 |         #endif | 
 |             default: | 
 |                 RLOGE("Socket id is wrong!!"); | 
 |                 break; | 
 |         } | 
 |     } @}**/ else { | 
 |         RLOGE("Socket group is wrong!!"); | 
 |     } | 
 |     RLOGI ("getSocketName %s\n", socketName); | 
 |     return socketName; | 
 | } |