r2712 - in trunk/src/target/gsm: include/gsmd src/gsmd
laforge at sita.openmoko.org
laforge at sita.openmoko.org
Thu Aug 16 06:27:01 CEST 2007
Author: laforge
Date: 2007-08-16 06:25:26 +0200 (Thu, 16 Aug 2007)
New Revision: 2712
Modified:
trunk/src/target/gsm/include/gsmd/unsolicited.h
trunk/src/target/gsm/src/gsmd/gsmd.c
trunk/src/target/gsm/src/gsmd/sms_cb.c
trunk/src/target/gsm/src/gsmd/unsolicited.c
Log:
Dynamic registration of unsolicited responses (Andrzej Zaborowski)
Modified: trunk/src/target/gsm/include/gsmd/unsolicited.h
===================================================================
--- trunk/src/target/gsm/include/gsmd/unsolicited.h 2007-08-16 04:20:03 UTC (rev 2711)
+++ trunk/src/target/gsm/include/gsmd/unsolicited.h 2007-08-16 04:25:26 UTC (rev 2712)
@@ -12,6 +12,9 @@
extern int unsolicited_parse(struct gsmd *g, char *buf, int len, const char *param);
extern int generate_event_from_cme(struct gsmd *g, unsigned int cme_error);
+extern void unsolicited_generic_init(struct gsmd *g);
+extern int unsolicited_register_array(const struct gsmd_unsolicit *arr,
+ int len);
#endif /* __GSMD__ */
Modified: trunk/src/target/gsm/src/gsmd/gsmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/gsmd.c 2007-08-16 04:20:03 UTC (rev 2711)
+++ trunk/src/target/gsm/src/gsmd/gsmd.c 2007-08-16 04:25:26 UTC (rev 2712)
@@ -477,6 +477,8 @@
/* select a vendor plugin */
gsmd_vendor_plugin_find(&g);
+ unsolicited_init(&g);
+
if (g.interpreter_ready) {
gsmd_initsettings(&g);
Modified: trunk/src/target/gsm/src/gsmd/sms_cb.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/sms_cb.c 2007-08-16 04:20:03 UTC (rev 2711)
+++ trunk/src/target/gsm/src/gsmd/sms_cb.c 2007-08-16 04:25:26 UTC (rev 2712)
@@ -315,6 +315,9 @@
struct gsmd_atcmd *atcmd;
char buffer[10];
+ unsolicited_register_array(gsm0705_unsolicit,
+ ARRAY_SIZE(gsm0705_unsolicit));
+
atcmd = atcmd_fill("AT+CSMS=0", 9 + 1, NULL, gsmd, 0);
if (!atcmd)
return -ENOMEM;
Modified: trunk/src/target/gsm/src/gsmd/unsolicited.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/unsolicited.c 2007-08-16 04:20:03 UTC (rev 2711)
+++ trunk/src/target/gsm/src/gsmd/unsolicited.c 2007-08-16 04:25:26 UTC (rev 2712)
@@ -358,49 +358,31 @@
*/
};
+static struct gsmd_unsolicit unsolicit[256] = {{ 0, 0 }};
+
/* called by midlevel parser if a response seems unsolicited */
int unsolicited_parse(struct gsmd *g, char *buf, int len, const char *param)
{
- int i, rc;
+ struct gsmd_unsolicit *i;
+ int rc;
struct gsmd_vendor_plugin *vpl = g->vendorpl;
- /* call vendor-specific unsolicited code parser */
- if (vpl && vpl->num_unsolicit) {
- for (i = 0; i < vpl->num_unsolicit; i++) {
- const char *colon;
- if (strncmp(buf, vpl->unsolicit[i].prefix,
- strlen(vpl->unsolicit[i].prefix)))
- continue;
-
- colon = strchr(buf, ':') + 2;
- if (colon > buf+len)
- colon = NULL;
-
- rc = vpl->unsolicit[i].parse(buf, len, colon, g);
- if (rc < 0)
- gsmd_log(GSMD_ERROR, "error %d during parse of "
- "vendor unsolicied response `%s'\n",
- rc, buf);
- return rc;
- }
- }
-
- /* call generic unsolicited code parser */
- for (i = 0; i < ARRAY_SIZE(gsm0707_unsolicit); i++) {
+ /* call unsolicited code parser */
+ for (i = unsolicit; i->prefix; i ++) {
const char *colon;
- if (strncmp(buf, gsm0707_unsolicit[i].prefix,
- strlen(gsm0707_unsolicit[i].prefix)))
+ if (strncmp(buf, i->prefix, strlen(i->prefix)))
continue;
-
+
colon = strchr(buf, ':') + 2;
if (colon > buf+len)
colon = NULL;
- rc = gsm0707_unsolicit[i].parse(buf, len, colon, g);
+ rc = i->parse(buf, len, colon, g);
if (rc < 0)
- gsmd_log(GSMD_ERROR, "error %d during parse of "
- "unsolicied response `%s'\n", rc, buf);
- return rc;
+ gsmd_log(GSMD_ERROR, "error %d during parsing of "
+ "an unsolicied response `%s'\n",
+ rc, buf);
+ return rc;
}
gsmd_log(GSMD_NOTICE, "no parser for unsolicited response `%s'\n", buf);
@@ -408,6 +390,39 @@
return -ENOENT;
}
+int unsolicited_register_array(const struct gsmd_unsolicit *arr, int len)
+{
+ int curlen = 0;
+
+ while (unsolicit[curlen ++].prefix);
+ if (len + curlen > ARRAY_SIZE(unsolicit))
+ return -ENOMEM;
+
+ /* Add at the beginning for overriding to be possible */
+ memmove(&unsolicit[len], unsolicit,
+ sizeof(struct gsmd_unsolicit) * curlen);
+ memcpy(unsolicit, arr,
+ sizeof(struct gsmd_unsolicit) * len);
+
+ return 0;
+}
+
+void unsolicited_init(struct gsmd *g)
+{
+ struct gsmd_vendor_plugin *vpl = g->vendorpl;
+
+ /* register generic unsolicited code parser */
+ unsolicited_register_array(gsm0707_unsolicit,
+ ARRAY_SIZE(gsm0707_unsolicit));
+
+ /* register vendor-specific unsolicited code parser */
+ if (vpl && vpl->num_unsolicit)
+ if (unsolicited_register_array(vpl->unsolicit,
+ vpl->num_unsolicit))
+ gsmd_log(GSMD_ERROR, "registering vendor-specific "
+ "unsolicited responses failed\n");
+}
+
static unsigned int errors_creating_events[] = {
GSM0707_CME_PHONE_FAILURE,
GSM0707_CME_PHONE_NOCONNECT,
More information about the commitlog
mailing list