1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-09-13 10:29:19 +03:00
openwrt-xburst/package/tapi_sip/src/contact.c
blogic 6ea7ec75d2 [ifxmips]
* adds a rewrite of the tapi drivers + sip app. this is the result of lars' gsoc 2010 project, Thanks !


git-svn-id: svn://svn.openwrt.org/openwrt/trunk@23840 3c298f89-4303-0410-b956-a3cf2f4a3e73
2010-11-03 19:12:34 +00:00

163 lines
3.1 KiB
C

#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);
}