4 * Copyright (c) 2009-2011 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
34 #include <bsys/queue.h>
35 #include <btron/btron.h>
36 #include <btron/hmi.h>
37 #include <btron/vobj.h>
39 #include "bchanl_subject.h"
41 #include "subjectcache.h"
42 #include "subjectparser.h"
43 #include "subjectlayout.h"
45 #ifdef BCHANL_CONFIG_DEBUG
46 # define DP(arg) printf arg
47 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
50 # define DP_ER(msg, err) /**/
53 /* copy from bchan/src/cache.h */
54 #define DATCACHE_RECORDTYPE_MAIN 31
55 #define DATCACHE_RECORDTYPE_INFO 30
56 #define DATCACHE_RECORDSUBTYPE_RETRIEVE 0x0001
57 #define DATCACHE_RECORDSUBTYPE_HEADER 0x0002
59 struct bchanl_subject_t_ {
70 typedef struct bchanl_subjecthashnode_t_ {
72 bchanl_subject_t subject;
73 } bchanl_subjecthashnode_t;
75 struct bchanl_subjecthash_t_ {
80 bchanl_subjecthashnode_t tbl[1];
83 EXPORT VOID bchanl_subject_gettitle(bchanl_subject_t *subject, TC **title, W *title_len)
85 *title = subject->title;
86 *title_len = subject->title_len;
89 EXPORT sbjtcache_t* bchanl_subject_getcache(bchanl_subject_t *subject)
91 return subject->cache;
94 EXPORT sbjtlayout_t* bchanl_subject_getlayout(bchanl_subject_t *subject)
96 return subject->layout;
99 EXPORT sbjtdraw_t* bchanl_subject_getdraw(bchanl_subject_t *subject)
101 return subject->draw;
104 EXPORT W bchanl_subject_relayout(bchanl_subject_t *subject)
106 sbjtparser_t *parser;
108 sbjtlayout_t *layout;
109 sbjtparser_thread_t *thread = NULL;
110 sbjtlist_iterator_t *list_iter;
111 sbjtlist_tuple_t *tuple;
116 parser = subject->parser;
117 list = subject->list;
118 layout = subject->layout;
120 sbjtlayout_clear(layout);
121 sbjtlist_clear(list);
122 sbjtparser_clear(parser);
124 get_tim(¤t, NULL);
127 err = sbjtparser_getnextthread(parser, &thread);
131 if (thread != NULL) {
132 sbjtlist_appendthread(list, thread, current);
138 sbjtlist_sort(list, SBJTLIST_SORTBY_NUMBER, NULL, 0);
140 list_iter = sbjtlist_startread(list, False);
142 next = sbjtlist_iterator_next(list_iter, &tuple);
146 sbjtlayout_appendthread(layout, tuple);
148 sbjtlist_endread(list, list_iter);
153 EXPORT W bchanl_subject_reorder(bchanl_subject_t *subject, TC *filterword, W filterword_len, W sortby, Bool descending)
156 sbjtlayout_t *layout;
157 sbjtlist_iterator_t *list_iter;
158 sbjtlist_tuple_t *tuple;
161 list = subject->list;
162 layout = subject->layout;
164 sbjtlayout_clear(layout);
166 sbjtlist_sort(list, sortby, filterword, filterword_len);
168 list_iter = sbjtlist_startread(list, descending);
170 next = sbjtlist_iterator_next(list_iter, &tuple);
174 sbjtlayout_appendthread(layout, tuple);
176 sbjtlist_endread(list, list_iter);
181 EXPORT W bchanl_subject_createviewervobj(bchanl_subject_t *subject, sbjtlist_tuple_t *tuple, UB *fsnrec, W fsnrec_len, VOBJSEG *seg, LINK *lnk)
189 seg->view = (RECT){{0,0,300,20}};
192 seg->frcol = 0x10000000;
193 seg->chcol = 0x10000000;
194 seg->tbcol = sbjtlayout_getvobjbgcol(subject->layout);
195 seg->bgcol = 0x10ffffff;
198 sbjtlist_tuple_gettitle(tuple, &str, &len);
202 tc_strncpy(title, str, len);
205 fd = cre_fil(lnk, title, NULL, 1, F_FLOAT);
207 DP_ER("cre_fil error", fd);
211 err = apd_rec(fd, fsnrec, fsnrec_len, 8, 0, 0);
213 DP_ER("apd_rec:fusen rec error", err);
215 del_fil(NULL, lnk, 0);
219 err = apd_rec(fd, NULL, NULL, DATCACHE_RECORDTYPE_INFO, DATCACHE_RECORDSUBTYPE_RETRIEVE, 0);
221 DP_ER("apd_rec:retrieve info error", err);
223 del_fil(NULL, lnk, 0);
226 err = see_rec(fd, -1, -1, NULL);
228 DP_ER("see_rec error", err);
230 del_fil(NULL, lnk, 0);
234 sbjtcache_gethost(subject->cache, &bin, &len);
235 err = wri_rec(fd, -1, bin, len, NULL, NULL, 0);
237 DP_ER("wri_rec:host error", err);
239 del_fil(NULL, lnk, 0);
242 err = wri_rec(fd, -1, "\n", 1, NULL, NULL, 0);
244 DP_ER("wri_rec:host error", err);
246 del_fil(NULL, lnk, 0);
249 sbjtcache_getboard(subject->cache, &bin, &len);
250 err = wri_rec(fd, -1, bin, len, NULL, NULL, 0);
252 DP_ER("wri_rec:board error", err);
254 del_fil(NULL, lnk, 0);
257 err = wri_rec(fd, -1, "\n", 1, NULL, NULL, 0);
259 DP_ER("wri_rec:board error", err);
261 del_fil(NULL, lnk, 0);
264 sbjtlist_tuple_getthreadnumberstr(tuple, &bin, &len);
265 err = wri_rec(fd, -1, bin, len, NULL, NULL, 0);
267 DP_ER("wri_rec:thread error", err);
269 del_fil(NULL, lnk, 0);
272 err = wri_rec(fd, -1, "\n", 1, NULL, NULL, 0);
274 DP_ER("wri_rec:thread error", err);
276 del_fil(NULL, lnk, 0);
282 vid = oreg_vob((VLINK*)lnk, seg, -1, V_NODISP);
284 DP_ER("oreg_vob", vid);
285 del_fil(NULL, lnk, 0);
289 err = ochg_nam(vid, NULL); /* should use original panel */
291 DP_ER("ochg_nam", err);
293 del_fil(NULL, lnk, 0);
298 del_fil(NULL, lnk, 0);
299 return BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED;
302 err = orsz_vob(vid, &newr, V_ADJUST1|V_NODISP);
304 DP_ER("orsz_vob", vid);
306 del_fil(NULL, lnk, 0);
310 err = odel_vob(vid, 0);
312 DP_ER("odel_vob", err);
313 del_fil(NULL, lnk, 0);
318 return BCHANL_SUBJECT_CREATEVIEWERVOBJ_CREATED;
321 EXPORT VOID bchanl_subject_setresnumberdisplay(bchanl_subject_t *subject, Bool display)
323 sbjtlayout_setresnumberdisplay(subject->layout, display);
326 EXPORT VOID bchanl_subject_setsincedisplay(bchanl_subject_t *subject, Bool display)
328 sbjtlayout_setsincedisplay(subject->layout, display);
331 EXPORT VOID bchanl_subject_setvigordisplay(bchanl_subject_t *subject, Bool display)
333 sbjtlayout_setvigordisplay(subject->layout, display);
336 EXPORT Bool bchanl_subject_getresnumberdisplay(bchanl_subject_t *subject)
338 return sbjtlayout_getresnumberdisplay(subject->layout);
341 EXPORT Bool bchanl_subject_getsincedisplay(bchanl_subject_t *subject)
343 return sbjtlayout_getsincedisplay(subject->layout);
346 EXPORT Bool bchanl_subject_getvigordisplay(bchanl_subject_t *subject)
348 return sbjtlayout_getvigordisplay(subject->layout);
351 LOCAL W bchanl_subject_initialize(bchanl_subject_t *subject, GID gid, UB *host, W host_len, UB *board, W board_len, TC *title, W title_len, FSSPEC *fspec, COLOR vobjbgcol)
354 sbjtparser_t *parser;
356 sbjtlayout_t *layout;
361 cache = sbjtcache_new();
365 parser = sbjtparser_new(cache);
366 if (parser == NULL) {
369 list = sbjtlist_new();
373 layout = sbjtlayout_new(gid);
374 if (layout == NULL) {
377 draw = sbjtdraw_new(layout);
381 title_buf = malloc(sizeof(TC)*(title_len+1));
382 if (title_buf == NULL) {
385 tc_strncpy(title_buf, title, title_len);
386 title_buf[title_len] = TNULL;
387 err = sbjtcache_updatehost(cache, host, host_len);
391 err = sbjtcache_updateboard(cache, board, board_len);
395 sbjtlayout_setfsspec(layout, fspec);
396 sbjtlayout_setvobjbgcol(layout, vobjbgcol);
399 subject->cache = cache;
400 subject->parser = parser;
401 subject->list = list;
402 subject->layout = layout;
403 subject->draw = draw;
404 subject->title = title_buf;
411 sbjtdraw_delete(draw);
413 sbjtlayout_delete(layout);
415 sbjtlist_delete(list);
417 sbjtparser_delete(parser);
419 sbjtcache_delete(cache);
421 return -1; /* TODO */
424 LOCAL VOID bchanl_subject_finalize(bchanl_subject_t *subject)
426 free(subject->title);
427 sbjtdraw_delete(subject->draw);
428 sbjtlayout_delete(subject->layout);
429 sbjtlist_delete(subject->list);
430 sbjtparser_delete(subject->parser);
431 sbjtcache_delete(subject->cache);
434 LOCAL bchanl_subjecthashnode_t* bchanl_subjecthashnode_new(GID gid, UB *host, W host_len, UB *board, W board_len, TC *title, W title_len, FSSPEC *fspec, COLOR vobjbgcol)
436 bchanl_subjecthashnode_t *node;
439 node = (bchanl_subjecthashnode_t*)malloc(sizeof(bchanl_subjecthashnode_t));
444 QueInit(&(node->queue));
445 err = bchanl_subject_initialize(&(node->subject), gid, host, host_len, board, board_len, title, title_len, fspec, vobjbgcol);
454 LOCAL VOID bchanl_subjecthashnode_delete(bchanl_subjecthashnode_t *hashnode)
456 bchanl_subject_finalize(&(hashnode->subject));
457 QueRemove(&(hashnode->queue));
461 LOCAL Bool bchanl_subjecthashnode_issameboard(bchanl_subjecthashnode_t *node, UB *host, W host_len, UB *board, W board_len)
465 W host_len0, board_len0, cmp;
467 cache = node->subject.cache;
469 sbjtcache_gethost(cache, &host0, &host_len0);
470 if (host_len != host_len0) {
473 cmp = strncmp(host, host0, host_len);
478 sbjtcache_getboard(cache, &board0, &board_len0);
479 if (board_len != board_len0) {
483 cmp = strncmp(board, board0, board_len);
491 LOCAL W bchanl_subjecthash_calchashvalue(bchanl_subjecthash_t *subjecthash, UB *host, W host_len, UB *board, W board_len)
495 for (i = 0; i < host_len; i++) {
498 for (i = 0; i < board_len; i++) {
502 return num % subjecthash->base;
505 EXPORT bchanl_subject_t* bchanl_subjecthash_search(bchanl_subjecthash_t *subjecthash, UB *host, W host_len, UB *board, W board_len)
507 bchanl_subjecthashnode_t *node, *buf;
511 hashval = bchanl_subjecthash_calchashvalue(subjecthash, host, host_len, board, board_len);
512 buf = subjecthash->tbl + hashval;
514 for (node = (bchanl_subjecthashnode_t *)buf->queue.next; node != buf; node = (bchanl_subjecthashnode_t *)node->queue.next) {
515 same = bchanl_subjecthashnode_issameboard(node, host, host_len, board, board_len);
517 return &(node->subject);
524 EXPORT W bchanl_subjecthash_append(bchanl_subjecthash_t *subjecthash, UB *host, W host_len, UB *board, W board_len, TC *title, W title_len)
526 bchanl_subjecthashnode_t *hashnode, *buf;
527 bchanl_subject_t *subject;
530 subject = bchanl_subjecthash_search(subjecthash, host, host_len, board, board_len);
531 if (subject != NULL) {
535 hashval = bchanl_subjecthash_calchashvalue(subjecthash, host, host_len, board, board_len);
536 buf = subjecthash->tbl + hashval;
538 hashnode = bchanl_subjecthashnode_new(subjecthash->gid, host, host_len, board, board_len, title, title_len, &subjecthash->fspec, subjecthash->vobjbgcol);
539 if (hashnode == NULL) {
543 QueInsert(&(hashnode->queue), &(buf->queue));
548 EXPORT bchanl_subjecthash_t* bchanl_subjecthash_new(GID gid, W base)
551 bchanl_subjecthash_t *ret;
557 ret = (bchanl_subjecthash_t*)malloc(sizeof(W)+sizeof(GID)+sizeof(FSSPEC)+sizeof(COLOR)+sizeof(bchanl_subjecthashnode_t)*base);
564 for (i=0;i<base;i++) {
565 QueInit(&(ret->tbl[i].queue));
568 err = wget_inf(WI_FSVOBJ, &ret->fspec, sizeof(FSSPEC));
570 ret->fspec.name[0] = TNULL;
571 ret->fspec.attr = FT_PROP|FT_GRAYSCALE;
572 ret->fspec.fclass = FTC_DEFAULT;
573 ret->fspec.size.h = 16;
574 ret->fspec.size.v = 16;
576 err = wget_inf(WI_VOBJBGCOL, &ret->vobjbgcol, sizeof(COLOR));
578 ret->vobjbgcol = 0x10000000;
584 EXPORT VOID bchanl_subjecthash_delete(bchanl_subjecthash_t *subjecthash)
587 bchanl_subjecthashnode_t *buf,*buf_next;
590 for(i = 0;i < subjecthash->base; i++){
591 buf = subjecthash->tbl + i;
593 empty = isQueEmpty(&(buf->queue));
597 buf_next = (bchanl_subjecthashnode_t*)buf->queue.next;
598 QueRemove(&buf_next->queue);
599 bchanl_subjecthashnode_delete(buf_next);