Upgrade bluez5_37 :Merge the code from private
[platform/upstream/bluez.git] / obexd / 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 <string.h>
35 #include <inttypes.h>
36
37 #include <glib.h>
38
39 #include "gobex/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_slist_free(server->drivers);
115                 g_free(server);
116         }
117
118         g_slist_free(servers);
119
120         return;
121 }
122
123 int obex_server_new_connection(struct obex_server *server, GIOChannel *io,
124                                         uint16_t tx_mtu, uint16_t rx_mtu,
125                                         gboolean stream)
126 {
127         return obex_session_start(io, tx_mtu, rx_mtu, stream, server);
128 }