AT: Better failure handling and removed wrong unlock
[hayes-ril.git] / utils.c
1 /*
2  * This file is part of hayes-ril.
3  *
4  * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 #include <string.h>
20 #include <ctype.h>
21
22 #define LOG_TAG "RIL"
23 #include <utils/Log.h>
24
25 #include <hayes-ril.h>
26
27 char *ril_status_string(int status)
28 {
29         switch(status) {
30                 case AT_STATUS_OK:
31                         return "OK";
32                 case AT_STATUS_CONNECT:
33                         return "CONNECT";
34                 case AT_STATUS_ERROR:
35                         return "ERROR";
36                 case AT_STATUS_CME_ERROR:
37                         return "CME_ERROR";
38                 case AT_STATUS_INTERNAL_ERROR:
39                         return "INTERNAL_ERROR";
40                 case AT_STATUS_UNDEF:
41                 default:
42                         return "UNDEF";
43         }
44 }
45
46 void ril_recv_log(struct at_response *response)
47 {
48         char *data_string = NULL;
49         char *status_string = NULL;
50         char *error_string = NULL;
51         char *string = NULL;
52         int i;
53
54         if(response->data_count > 0 && response->data != NULL) {
55                 for(i=0 ; i < response->data_count ; i++) {
56                         if(i == 0) {
57                                 asprintf(&data_string, "%s", response->data[i]);
58                         } else {
59                                 string = data_string;
60                                 asprintf(&data_string, "%s, %s", string, response->data[i]);
61                                 free(string);
62                         }
63                 }
64         }
65
66         if(response->status != AT_STATUS_UNDEF)
67                 status_string = ril_status_string(response->status);
68
69         if(response->error != NULL)
70                 error_string = response->error;
71
72         if(data_string && status_string && error_string)
73                 asprintf(&string, "%s: AT RECV [\"%s\", {%s}, %s, %s]", ril_device->tag, response->command, data_string, status_string, error_string);
74         else if(data_string && status_string)
75                 asprintf(&string, "%s: AT RECV [\"%s\", {%s}, %s]", ril_device->tag, response->command, data_string, status_string);
76         else if(data_string && !status_string)
77                 asprintf(&string, "%s: AT RECV [\"%s\", {%s}]", ril_device->tag, response->command, data_string);
78         else if(!data_string && status_string && error_string)
79                 asprintf(&string, "%s: AT RECV [\"%s\", %s, %s]", ril_device->tag, response->command, status_string, error_string);
80         else if(!data_string && status_string)
81                 asprintf(&string, "%s: AT RECV [\"%s\", %s]", ril_device->tag, response->command, status_string);
82         else
83                 asprintf(&string, "%s: AT RECV [\"%s\"]", ril_device->tag, response->command);
84
85         if(data_string)
86                 free(data_string);
87
88         LOGD("%s", string);
89         free(string);
90 }
91
92 void ril_send_log(struct at_request *request)
93 {
94         char *data_string = NULL;
95         char *string = NULL;
96         int i;
97
98         if(request->data != NULL)
99                 data_string = (char *) request->data;
100
101         if(data_string)
102                 asprintf(&string, "%s: AT SEND [\"%s\", {%s}]", ril_device->tag, request->command, data_string);
103         else
104                 asprintf(&string, "%s: AT SEND [\"%s\"]", ril_device->tag, request->command);
105
106         LOGD("%s", string);
107         free(string);
108 }
109
110 void hex_dump(void *data, int size)
111 {
112         /* dumps size bytes of *data to stdout. Looks like:
113          * [0000] 75 6E 6B 6E 6F 77 6E 20
114          *                                30 FF 00 00 00 00 39 00 unknown 0.....9.
115          * (in a single line of course)
116          */
117
118         unsigned char *p = data;
119         unsigned char c;
120         int n;
121         char bytestr[4] = {0};
122         char addrstr[10] = {0};
123         char hexstr[ 16*3 + 5] = {0};
124         char charstr[16*1 + 5] = {0};
125         for(n=1;n<=size;n++) {
126                 if (n%16 == 1) {
127                         /* store address for this line */
128                         snprintf(addrstr, sizeof(addrstr), "%.4x",
129                            ((unsigned int)p-(unsigned int)data) );
130                 }
131
132                 c = *p;
133                 if (isalnum(c) == 0) {
134                         c = '.';
135                 }
136
137                 /* store hex str (for left side) */
138                 snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
139                &nb