source: uKadecot/trunk/kadecot/wamp_router.c@ 148

Last change on this file since 148 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 7.3 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2015 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id: wamp_router.c 108 2015-06-11 09:15:46Z coas-nagasima $
36 */
37
38#include <string.h>
39#include "wamp.h"
40#include "wamp_router.h"
41#include "main.h"
42#include "fbs_string.h"
43#include "kernel_cfg.h"
44
45#ifndef _MSC_VER
46#ifndef strncpy_s
47#define strncpy_s(dst, dsz, src, sz) strncpy(dst, src, sz)
48#endif
49#endif
50
51wamp_session_t *wamp_router_hello(wamp_router_t *router)
52{
53 wamp_session_t *result = NULL, *pos, *end = &router->sessions[sizeof(router->sessions) / sizeof(router->sessions[0])];
54
55 for(pos = router->sessions; pos < end; pos++) {
56 if(pos->router != NULL)
57 continue;
58
59 result = pos;
60 result->router = router;
61 router->current_session = result;
62 }
63
64 return result;
65}
66
67void wamp_router_hello_realm(wamp_router_t *router, const char *value)
68{
69 wamp_session_t *s = router->current_session;
70 strncpy_s(s->realm, sizeof(s->realm), value, sizeof(s->realm));
71}
72
73void wamp_router_hello_details_param(wamp_router_t *router, jsonsl_action_t action,
74 struct jsonsl_state_st *state, const char *buf)
75{
76 static const char roles[] = "roles";
77 static const char publisher[] = "publisher";
78 static const char subscriber[] = "subscriber";
79 static const char caller[] = "caller";
80 static const char callee[] = "callee";
81 wamp_session_t *s = router->current_session;
82
83 switch (state->level) {
84 case 3:
85 switch (action){
86 case JSONSL_ACTION_POP:
87 switch (state->type)
88 {
89 case JSONSL_T_HKEY:
90 if(strncmp(roles, router->s->jsn_buf, sizeof(roles) - 1) == 0){
91 s->roles |= WAMP_ROUTER_ROLES_IN_GETTING;
92 }
93 break;
94 default:
95 break;
96 }
97 break;
98 }
99 break;
100 case 4:
101 switch (action){
102 case JSONSL_ACTION_POP:
103 switch (state->type)
104 {
105 case JSONSL_T_HKEY:
106 if((s->roles & WAMP_ROUTER_ROLES_IN_GETTING) !=0 ){
107 if(strncmp(publisher, router->s->jsn_buf, sizeof(publisher) - 1) == 0){
108 s->roles |= WAMP_ROUTER_ROLES_PUBLISHER;
109 }
110 else if(strncmp(subscriber, router->s->jsn_buf, sizeof(subscriber) - 1) == 0){
111 s->roles |= WAMP_ROUTER_ROLES_SUBSCRIBER;
112 }
113 else if(strncmp(caller, router->s->jsn_buf, sizeof(caller) - 1) == 0){
114 s->roles |= WAMP_ROUTER_ROLES_CALLER;
115 }
116 else if(strncmp(callee, router->s->jsn_buf, sizeof(callee) - 1) == 0){
117 s->roles |= WAMP_ROUTER_ROLES_CALLEE;
118 }
119 }
120 break;
121 default:
122 break;
123 }
124 break;
125 }
126 break;
127 }
128}
129
130void wamp_router_hello_details(wamp_router_t *router)
131{
132 wamp_session_t *s = router->current_session;
133 s->roles &= ~WAMP_ROUTER_ROLES_IN_GETTING;
134}
135
136void wamp_router_hello_close(struct wamp_state *s)
137{
138 wamp_router_t *router = &s->router;
139 wamp_session_t *session = router->current_session;
140 ECN_FBS_ID buf;
141 ECN_FBS_SSIZE_T pos = 0, start;
142 ER ret;
143
144 router->session_id++;
145 if(router->session_id == 0){
146 router->session_id++;
147 }
148 session->id = router->session_id;
149
150 // send WELLCOM or ABORT
151 _ecn_fbs_cre(16, &buf);
152
153 ret = fbs_printf(buf, &pos, "[2,%d,{\"roles\":{", session->id);
154 if (ret != E_OK) {
155 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
156 _ecn_fbs_del(buf);
157 return;
158 }
159
160 start = pos;
161 if(session->roles & WAMP_ROUTER_ROLES_PUBLISHER){
162 ret = fbs_printf(buf, &pos, "\"publisher\":{},");
163 if (ret != E_OK) {
164 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
165 _ecn_fbs_del(buf);
166 return;
167 }
168 }
169 if(session->roles & WAMP_ROUTER_ROLES_SUBSCRIBER){
170 ret = fbs_printf(buf, &pos, "\"subscriber\":{},");
171 if (ret != E_OK) {
172 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
173 _ecn_fbs_del(buf);
174 return;
175 }
176 }
177 if(session->roles & WAMP_ROUTER_ROLES_CALLER){
178 ret = fbs_printf(buf, &pos, "\"caller\":{},");
179 if (ret != E_OK) {
180 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
181 _ecn_fbs_del(buf);
182 return;
183 }
184 }
185 if(session->roles & WAMP_ROUTER_ROLES_CALLEE){
186 ret = fbs_printf(buf, &pos, "\"callee\":{},");
187 if (ret != E_OK) {
188 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
189 _ecn_fbs_del(buf);
190 return;
191 }
192 }
193
194 /* 最後の","を消す */
195 if(start != pos)
196 pos--;
197
198 ret = fbs_printf(buf, &pos, "}}]");
199 if (ret != E_OK) {
200 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
201 _ecn_fbs_del(buf);
202 return;
203 }
204
205 ret = main_send_message(buf, s->wbsid);
206 if (ret != E_OK) {
207 syslog(LOG_WARNING, "wamp_router_hello_close() : main_send_message() result = %d", ret);
208 }
209}
210
211void wamp_router_authenticate(wamp_router_t *router)
212{
213}
214
215void wamp_router_authenticate_signature(wamp_router_t *router, const char *value)
216{
217}
218
219void wamp_router_authenticate_extra(wamp_router_t *router, const char *value)
220{
221}
222
223void wamp_router_authenticate_extra_param(wamp_router_t *router, jsonsl_action_t action,
224 struct jsonsl_state_st *state, const char *buf)
225{
226}
227
228void wamp_router_authenticate_close(struct wamp_state *s)
229{
230}
231
232void wamp_router_goodbye(wamp_router_t *router)
233{
234}
235
236void wamp_router_goodbye_details_param(wamp_router_t *router, jsonsl_action_t action,
237 struct jsonsl_state_st *state, const char *buf)
238{
239}
240
241void wamp_router_goodbye_details(wamp_router_t *router)
242{
243}
244
245void wamp_router_goodbye_reason(wamp_router_t *router, const char *value)
246{
247}
248
249void wamp_router_goodbye_close(struct wamp_state *s)
250{
251 wamp_router_t *router = &s->router;
252 wamp_session_t *session = router->current_session;
253 ECN_FBS_ID buf;
254 ECN_FBS_SSIZE_T pos = 0;
255 ER ret;
256
257 if(session == NULL)
258 return;
259
260 // send GOODBYE
261 ret = _ecn_fbs_cre(1, &buf);
262 if (ret != E_OK) {
263 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret);
264 return;
265 }
266
267 ret = fbs_printf(buf, &pos, "[6,{},\"wamp.error.goodbye_and_out\"]");
268 if (ret != E_OK) {
269 syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
270 _ecn_fbs_del(buf);
271 return;
272 }
273
274 ret = main_send_message(buf, s->wbsid);
275 if (ret != E_OK) {
276 syslog(LOG_WARNING, "wamp_router_goodbye_close() : main_send_message() result = %d", ret);
277 }
278
279 memset(session, 0, sizeof(session));
280}
Note: See TracBrowser for help on using the repository browser.