upgrade obexd to 0.47
[profile/ivi/obexd.git] / src / server.c
1 /*
2  *
3  *  OBEX Server
4  *
5  *  Copyright (C) 2007-2010  Nokia Corporation
6  *  Copyright (C) 2007-2010  Marcel Holtmann <marcel@holtmann.org>
7  *
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22  *
23  */
24
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28
29 #include <stdio.h>
30 #include <errno.h>
31 #include <stdlib.h>
32 #include <unistd.h>
33 #include <fcntl.h>
34 #include <errno.h>
35 #include <string.h>
36 #include <inttypes.h>
37
38 #include <glib.h>
39 #include <gobex.h>
40
41 #include "log.h"
42 #include "obex.h"
43 #include "obex-priv.h"
44 #include "server.h"
45 #include "service.h"
46 #include "transport.h"
47
48 static GSList *servers = NULL;
49
50 static void init_server(uint16_t service, GSList *transports)
51 {
52         GSList *l;
53
54         for (l = transports; l; l = l->next) {
55                 struct obex_transport_driver *transport = l->data;
56                 struct obex_server *server;
57                 int err;
58
59                 if (transport->service != 0 &&
60                                 (transport->service & service) == FALSE)
61                         continue;
62
63                 server = g_new0(struct obex_server, 1);
64                 server->transport = transport;
65                 server->drivers = obex_service_driver_list(service);
66
67                 server->transport_data = transport->start(server, &err);
68                 if (server->transport_data == NULL) {
69                         DBG("Unable to start %s transport: %s (%d)",
70                                         transport->name, strerror(err), err);
71                         g_free(server);
72                         continue;
73                 }
74
75                 servers = g_slist_prepend(servers, server);
76         }
77 }
78
79 int obex_server_init(void)
80 {
81         GSList *drivers;
82         GSList *transports;
83         GSList *l;
84
85         drivers = obex_service_driver_list(0);
86         if (drivers == NULL) {
87                 DBG("No service driver registered");
88                 return -EINVAL;
89         }
90
91         transports = obex_transport_driver_list();
92         if (transports == NULL) {
93                 DBG("No transport driver registered");
94                 return -EINVAL;
95         }
96
97         for (l = drivers; l; l = l->next) {
98                 struct obex_service_driver *driver = l->data;
99
100                 init_server(driver->service, transports);
101         }
102
103         return 0;
104 }
105
106 void obex_server_exit(void)
107 {
108         GSList *l;
109
110         for (l = servers; l; l = l->next) {
111                 struct obex_server *server = l->data;
112
113                 server->transport->stop(server->transport_data);
114                 g_free(server);
115         }
116
117         g_slist_free(servers);
118
119         return;
120 }
121
122 struct obex_service_driver *obex_server_find_driver(
123                                                 struct obex_server *server,
124                                                 uint8_t channel)
125 {
126         GSList *l;
127
128         for (l = server->drivers; l; l = l->next) {
129                 struct obex_service_driver *driver = l->data;
130
131                 if (driver->channel == channel)
132                         return driver;
133         }
134
135         return NULL;
136 }
137
138 int obex_server_new_connection(struct obex_server *server, GIOChannel *io,
139                                         uint16_t tx_mtu, uint16_t rx_mtu,
140                                         gboolean stream)
141 {
142         return obex_session_start(io, tx_mtu, rx_mtu, stream, server);
143 }