summaryrefslogtreecommitdiffstats
path: root/package/tapi_sip/src/contact.c
diff options
context:
space:
mode:
Diffstat (limited to 'package/tapi_sip/src/contact.c')
-rw-r--r--package/tapi_sip/src/contact.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/package/tapi_sip/src/contact.c b/package/tapi_sip/src/contact.c
new file mode 100644
index 000000000..eeb38b418
--- /dev/null
+++ b/package/tapi_sip/src/contact.c
@@ -0,0 +1,162 @@
+#include <malloc.h>
+#include <string.h>
+
+#include <uci.h>
+#include <ucimap.h>
+
+#include "list.h"
+#include "contact.h"
+
+static struct uci_context *ctx;
+static struct uci_package *pkg;
+static struct list_head contact_list;
+static struct list_head account_list;
+
+static int contact_init(struct uci_map *map, void *section,
+ struct uci_section *s)
+{
+ struct contact *p = section;
+ p->name = strdup(s->e.name);
+ return 0;
+}
+
+static int contact_add(struct uci_map *map, void *section)
+{
+ struct contact *c = section;
+ printf("add contact: %s\n", c->name);
+ list_add_tail(&c->head, &contact_list);
+ return 0;
+}
+
+static struct uci_optmap contact_uci_map[] = {
+ {
+ UCIMAP_OPTION(struct contact, identifier),
+ .type = UCIMAP_STRING,
+ .name = "identifier",
+ },
+ {
+ UCIMAP_OPTION(struct contact, number),
+ .type = UCIMAP_STRING,
+ .name = "number",
+ },
+};
+
+static struct uci_sectionmap contact_sectionmap = {
+ UCIMAP_SECTION(struct contact, map),
+ .type = "contact",
+ .init = contact_init,
+ .add = contact_add,
+ .options = contact_uci_map,
+ .n_options = ARRAY_SIZE(contact_uci_map),
+ .options_size = sizeof(struct uci_optmap),
+};
+
+static int account_init(struct uci_map *map, void *section,
+ struct uci_section *s)
+{
+ struct account *a = section;
+ a->name = strdup(s->e.name);
+ return 0;
+}
+
+static int account_add(struct uci_map *map, void *section)
+{
+ struct account *a = section;
+ list_add_tail(&a->head, &account_list);
+ return 0;
+}
+
+static struct uci_optmap account_uci_map[] = {
+ {
+ UCIMAP_OPTION(struct account, realm),
+ .type = UCIMAP_STRING,
+ .name = "realm",
+ },
+ {
+ UCIMAP_OPTION(struct account, username),
+ .type = UCIMAP_STRING,
+ .name = "username",
+ },
+ {
+ UCIMAP_OPTION(struct account, sip_port),
+ .type = UCIMAP_INT,
+ .name = "sip_port",
+ },
+ {
+ UCIMAP_OPTION(struct account, password),
+ .type = UCIMAP_STRING,
+ .name = "password",
+ },
+ {
+ UCIMAP_OPTION(struct account, stun_host),
+ .type = UCIMAP_STRING,
+ .name = "stun_host",
+ },
+ {
+ UCIMAP_OPTION(struct account, stun_port),
+ .type = UCIMAP_INT,
+ .name = "stun_port",
+ },
+};
+
+static struct uci_sectionmap account_sectionmap = {
+ UCIMAP_SECTION(struct account, map),
+ .type = "account",
+ .init = account_init,
+ .add = account_add,
+ .options = account_uci_map,
+ .n_options = ARRAY_SIZE(account_uci_map),
+ .options_size = sizeof(struct uci_optmap),
+};
+
+static struct uci_sectionmap *network_smap[] = {
+ &contact_sectionmap,
+ &account_sectionmap,
+};
+
+static struct uci_map contact_map = {
+ .sections = network_smap,
+ .n_sections = ARRAY_SIZE(network_smap),
+};
+
+int contacts_init(void)
+{
+ int ret;
+
+ INIT_LIST_HEAD(&contact_list);
+ INIT_LIST_HEAD(&account_list);
+ ctx = uci_alloc_context();
+
+ ucimap_init(&contact_map);
+ ret = uci_load(ctx, "telephony", &pkg);
+ if (ret)
+ return ret;
+
+ ucimap_parse(&contact_map, pkg);
+
+ return 0;
+}
+
+void contacts_free(void)
+{
+}
+
+struct contact *contact_get(const char *number)
+{
+ struct contact *contact;
+ list_for_each_entry(contact, &contact_list, head)
+ {
+ if (strcmp(contact->number, number) == 0)
+ return contact;
+ }
+
+ return NULL;
+}
+
+struct account *get_account(void)
+{
+ if (list_empty(&account_list))
+ return NULL;
+
+ return list_first_entry(&account_list, struct account, head);
+}