4 * Copyright (c) 2009-2012 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
35 #include <btron/btron.h>
37 #include <btron/hmi.h>
38 #include <btron/vobj.h>
39 #include <btron/libapp.h>
40 #include <btron/bsocket.h>
43 #include "subjectretriever.h"
44 #include "subjectcache.h"
45 #include "subjectparser.h"
46 #include "subjectlist.h"
47 #include "subjectlayout.h"
48 #include "bbsmenuretriever.h"
49 #include "bbsmenucache.h"
50 #include "bbsmenuparser.h"
51 #include "bbsmenufilter.h"
52 #include "bbsmenulayout.h"
54 #include "bchanl_subject.h"
55 #include "bchanl_hmi.h"
56 #include "bchanl_menus.h"
58 #ifdef BCHANL_CONFIG_DEBUG
59 # define DP(arg) printf arg
60 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
63 # define DP_ER(msg, err) /**/
66 #define BCHANL_DBX_MENU_TEST 20
67 #define BCHANL_DBX_TEXT_MLIST0 21
68 #define BCHANL_DBX_TEXT_MLIST1 22
69 #define BCHANL_DBX_TEXT_MLIST2 23
70 #define BCHANL_DBX_VIEWER_FUSEN 24
71 #define BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU 25
72 #define BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT 26
73 #define BCHANL_DBX_TEXT_MSG_RETRBBSMENU 27
74 #define BCHANL_DBX_TEXT_MSG_RETRSUBJECT 28
75 #define BCHANL_DBX_TEXT_MSG_ERRRETR 29
76 #define BCHANL_DBX_TB_SBJTOPT_FLT 30
77 #define BCHANL_DBX_WS_SBJTOPT_ODR 31
78 #define BCHANL_DBX_WS_SBJTOPT_ODRBY 32
80 #define BCHANL_MENU_WINDOW 3
82 typedef struct bchanl_hmistate_t_ bchanl_hmistate_t;
83 struct bchanl_hmistate_t_ {
91 LOCAL VOID bchanl_hmistate_updateptrstyle(bchanl_hmistate_t *hmistate, PTRSTL ptr)
93 if (hmistate->ptr == ptr) {
97 gset_ptr(hmistate->ptr, NULL, -1, -1);
100 LOCAL VOID bchanl_hmistate_initialize(bchanl_hmistate_t *hmistate)
104 hmistate->ptr = PS_SELECT;
106 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRBBSMENU, (void**)&hmistate->msg_retr_bbsmenu);
108 DP_ER("dget_dtp: message retrieving error", err);
109 hmistate->msg_retr_bbsmenu = NULL;
111 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRSUBJECT, (void**)&hmistate->msg_retr_subject);
113 DP_ER("dget_dtp: message not modified error", err);
114 hmistate->msg_retr_subject = NULL;
116 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_ERRRETR, (void**)&hmistate->msg_error_retr);
118 DP_ER("dget_dtp: message retrieve error error", err);
119 hmistate->msg_error_retr = NULL;
123 typedef struct bchanl_bbsmenu_t_ bchanl_bbsmenu_t;
124 struct bchanl_bbsmenu_t_ {
127 bbsmnretriever_t *retriever;
129 bbsmnparser_t *parser;
130 bbsmnfilter_t *filter;
131 bbsmnlayout_t *layout;
134 bchanl_subjecthash_t *subjecthash;
141 bchanl_mainmenu_t mainmenu;
145 bchanl_hmistate_t hmistate;
147 sbjtretriever_t *retriever;
149 bchanl_subjecthash_t *subjecthash;
150 bchanl_bbsmenu_t bbsmenu;
151 bchanl_subject_t *currentsubject;
154 subjectwindow_t *subjectwindow;
155 bbsmenuwindow_t *bbsmenuwindow;
156 subjectoptionwindow_t *subjectoptionwindow;
158 typedef struct bchanl_t_ bchanl_t;
160 LOCAL VOID bchanl_killme(bchanl_t *bchanl);
162 LOCAL VOID bchanl_subjectwindow_draw(bchanl_t *bchanl)
166 if (bchanl->currentsubject == NULL) {
168 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
171 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
172 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
174 draw = bchanl_subject_getdraw(bchanl->currentsubject);
176 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
179 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
180 sbjtdraw_draw(draw, &r);
181 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
185 LOCAL VOID bchanl_subjectwindow_scroll(bchanl_t *bchanl, W dh, W dv)
188 if (bchanl->currentsubject == NULL) {
191 draw = bchanl_subject_getdraw(bchanl->currentsubject);
192 sbjtdraw_scrollviewrect(draw, dh, dv);
193 subjectwindow_scrollworkarea(bchanl->subjectwindow, -dh, -dv);
194 bchanl_subjectwindow_draw(bchanl);
197 LOCAL VOID bchanl_subjectwindow_resize(bchanl_t *bchanl, SIZE newsize)
202 if (bchanl->currentsubject == NULL) {
205 draw = bchanl_subject_getdraw(bchanl->currentsubject);
207 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
212 sbjtdraw_setviewrect(draw, l, t, r, b);
213 subjectwindow_setworkrect(bchanl->subjectwindow, l, t, r, b);
215 bchanl_subjectwindow_draw(bchanl);
218 LOCAL VOID bchanl_subjectwindow_close(bchanl_t *bchanl)
220 bchanl_killme(bchanl);
223 LOCAL VOID bchanl_subjectwindow_press(bchanl_t *bchanl, PNT evpos)
225 sbjtlist_tuple_t *tuple;
228 W event_type, size, err, fsn_len, dx, dy;
231 PNT pos, p1, pos_butup;
238 if (bchanl->currentsubject == NULL) {
241 draw = bchanl_subject_getdraw(bchanl->currentsubject);
243 err = sbjtdraw_findthread(draw, evpos, &tuple, &vframe);
248 gid = subjectwindow_startdrag(bchanl->subjectwindow);
250 DP_ER("wsta_drg error:", gid);
257 dx = vframe.c.left - evpos.x;
258 dy = vframe.c.top - evpos.y;
262 sel.rgn.r.c.left = vframe.c.left;
263 sel.rgn.r.c.top = vframe.c.top;
264 sel.rgn.r.c.right = vframe.c.right;
265 sel.rgn.r.c.bottom = vframe.c.bottom;
266 adsp_sel(gid, &sel, 1);
268 gset_ptr(PS_GRIP, NULL, -1, -1);
270 event_type = subjectwindow_getdrag(bchanl->subjectwindow, &pos, &wid_butup, &pos_butup);
271 if (event_type == EV_BUTUP) {
274 if (event_type != EV_NULL) {
277 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
280 adsp_sel(gid, &sel, 0);
281 sel.rgn.r.c.left += pos.x - p1.x;
282 sel.rgn.r.c.top += pos.y - p1.y;
283 sel.rgn.r.c.right += pos.x - p1.x;
284 sel.rgn.r.c.bottom += pos.y - p1.y;
285 adsp_sel(gid, &sel, 1);
288 gset_ptr(PS_SELECT, NULL, -1, -1);
289 adsp_sel(gid, &sel, 0);
290 subjectwindow_enddrag(bchanl->subjectwindow);
292 /* BUTUP on self window or no window or system message panel */
293 if ((wid_butup == subjectwindow_getWID(bchanl->subjectwindow))||(wid_butup == 0)||(wid_butup == -1)) {
297 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
302 err = dget_dtp(64, BCHANL_DBX_VIEWER_FUSEN, (void**)&fsn);
304 DP_ER("dget_dtp: ", err);
307 fsn_len = dget_siz((B*)fsn);
308 err = bchanl_subject_createviewervobj(bchanl->currentsubject, tuple, fsn, fsn_len, &vrec.vseg, (LINK*)&vrec.vlnk);
310 DP_ER("bchanl_subject_createviewervobj error", err);
313 if (err == BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED) {
319 tr_rec.len = sizeof(TR_VOBJREC);
320 tr_rec.dt = (B*)&vrec;
321 err = tset_dat(&tr_rec, 1);
323 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
325 DP_ER("error del_fil:", err);
330 paste_ev.r.type = EV_REQUEST;
331 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
332 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
333 paste_ev.r.cmd = W_PASTE;
334 paste_ev.r.wid = wid_butup;
335 err = wsnd_evt(&paste_ev);
338 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
340 DP_ER("error del_fil:", err);
344 err = wwai_rsp(NULL, W_PASTE, 60000);
347 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
349 DP_ER("error del_fil:", err);
353 wswi_wnd(wid_butup, NULL);
356 LOCAL VOID bchanl_subjectwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
365 bchanl_subjectwindow_press(bchanl, evpos);
369 LOCAL VOID bchanl_setcurrentsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
371 bchanl->currentsubject = sbjt;
372 subjectwindow_requestredisp(bchanl->subjectwindow);
375 LOCAL VOID bchanl_bbsmenuwindow_draw(bchanl_t *bchanl)
379 if (bbsmenuwindow_startredisp(bchanl->bbsmenuwindow, &r) == 0) {
382 bbsmenuwindow_eraseworkarea(bchanl->bbsmenuwindow, &r);
383 bbsmndraw_draw(bchanl->bbsmenu.draw, &r);
384 } while (bbsmenuwindow_endredisp(bchanl->bbsmenuwindow) > 0);
387 LOCAL VOID bchanl_bbsmenuwindow_scroll(bchanl_t *bchanl, W dh, W dv)
389 bbsmndraw_scrollviewrect(bchanl->bbsmenu.draw, dh, dv);
390 bbsmenuwindow_scrollworkarea(bchanl->bbsmenuwindow, -dh, -dv);
391 bchanl_bbsmenuwindow_draw(bchanl);
394 LOCAL VOID bchanl_bbsmenuwindow_resize(bchanl_t *bchanl, SIZE newsize)
398 bbsmndraw_getviewrect(bchanl->bbsmenu.draw, &l, &t, &r, &b);
403 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, l, t, r, b);
404 bbsmenuwindow_setworkrect(bchanl->bbsmenuwindow, l, t, r, b);
406 bchanl_bbsmenuwindow_draw(bchanl);
409 LOCAL VOID bchanl_bbsmenuwindow_close(bchanl_t *bchanl)
411 bchanl_killme(bchanl);
414 LOCAL VOID bchanl_updatesubjectorder(bchanl_t *bchanl, SUBJECTOPTIONWINDOW_ORDERVALUE_T order, SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby, TC *filterword, W filterword_len)
419 if (order == SUBJECTOPTIONWINDOW_ORDERVALUE_DESCENDING) {
425 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER:
427 sbjt_orderby = BCHANL_SUBJECT_SORTBY_NUMBER;
429 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_RES:
430 sbjt_orderby = BCHANL_SUBJECT_SORTBY_RES;
432 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_SINCE:
433 sbjt_orderby = BCHANL_SUBJECT_SORTBY_SINCE;
435 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_VIGOR:
436 sbjt_orderby = BCHANL_SUBJECT_SORTBY_VIGOR;
440 bchanl_subject_reorder(bchanl->currentsubject, filterword, filterword_len, sbjt_orderby, descending);
442 subjectwindow_requestredisp(bchanl->subjectwindow);
445 LOCAL VOID bchanl_changesubjectorder(bchanl_t *bchanl, W neworder)
447 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
451 if (bchanl->currentsubject == NULL) {
455 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
456 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
458 bchanl_updatesubjectorder(bchanl, neworder, orderby, buf, len);
461 LOCAL VOID bchanl_changesubjectorderby(bchanl_t *bchanl, W neworderby)
463 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
467 if (bchanl->currentsubject == NULL) {
471 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
472 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
474 bchanl_updatesubjectorder(bchanl, order, neworderby, buf, len);
477 LOCAL VOID bchanl_changesubjectfilterword(bchanl_t *bchanl, TC *newstr, W newstr_len)
479 sbjtlayout_t *layout;
481 SUBJECTOPTIONWINDOW_ORDERVALUE_T order;
482 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
486 if (bchanl->currentsubject == NULL) {
490 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
491 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
493 bchanl_updatesubjectorder(bchanl, order, orderby, newstr, newstr_len);
495 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
496 draw = bchanl_subject_getdraw(bchanl->currentsubject);
497 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
498 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
500 layout = bchanl_subject_getlayout(bchanl->currentsubject);
501 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
502 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
505 LOCAL VOID bchanl_sendsubjectrequest(bchanl_t *bchanl, bchanl_subject_t *subject)
508 sbjtlayout_t *layout;
512 W l, t, r, b, title_len, err;
514 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
515 pdsp_msg(bchanl->hmistate.msg_retr_subject);
517 cache = bchanl_subject_getcache(subject);
518 err = sbjtretriever_sendrequest(bchanl->retriever, cache);
520 pdsp_msg(bchanl->hmistate.msg_error_retr);
521 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
526 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
528 subjectoptionwindow_setfiltertext(bchanl->subjectoptionwindow, NULL, 0);
529 err = subjectoptionwindow_setordervalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERVALUE_ASCENDING);
530 subjectoptionwindow_setorderbyvalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER);
532 bchanl_subject_relayout(subject);
534 bchanl_setcurrentsubject(bchanl, subject);
536 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
537 draw = bchanl_subject_getdraw(subject);
538 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
539 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
541 layout = bchanl_subject_getlayout(subject);
542 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
543 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
545 bchanl_subject_gettitle(subject, &title, &title_len);
546 subjectwindow_settitle(bchanl->subjectwindow, title);
549 LOCAL VOID bchanl_bbsmenuwindow_click(bchanl_t *bchanl, PNT pos)
551 bbsmnparser_item_t *item;
552 bchanl_subject_t *subject;
555 W host_len, board_len;
559 fnd = bbsmndraw_findboard(bchanl->bbsmenu.draw, pos, &item);
564 if (item->category != NULL) {
567 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
568 subject = bchanl_subjecthash_search(bchanl->subjecthash, host, host_len, board, board_len);
569 if (subject == NULL) {
570 DP(("not found by subject hash"));
573 bchanl_subject_gettitle(subject, &title, &title_len);
575 bchanl_sendsubjectrequest(bchanl, subject);
578 LOCAL VOID bchanl_bbsmenuwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
587 bchanl_bbsmenuwindow_click(bchanl, evpos);
591 LOCAL W bchanl_bbsmenu_initialize(bchanl_bbsmenu_t *bchanl, GID gid, bchanl_subjecthash_t *subjecthash)
593 bbsmnretriever_t *retriever;
595 bbsmnparser_t *parser;
596 bbsmnfilter_t *filter;
597 bbsmnlayout_t *layout;
600 cache = bbsmncache_new();
604 retriever = bbsmnretriever_new();
605 if (retriever == NULL) {
606 goto error_retriever;
608 parser = bbsmnparser_new(cache);
609 if (parser == NULL) {
612 filter = bbsmnfilter_new();
613 if (filter == NULL) {
616 layout = bbsmnlayout_new(gid);
617 if (layout == NULL) {
620 draw = bbsmndraw_new(layout);
626 bchanl->retriever = retriever;
627 bchanl->cache = cache;
628 bchanl->parser = parser;
629 bchanl->filter = filter;
630 bchanl->layout = layout;
632 bchanl->subjecthash = subjecthash;
637 bbsmnlayout_delete(layout);
639 bbsmnfilter_delete(filter);
641 bbsmnparser_delete(parser);
643 bbsmnretriever_delete(retriever);
645 bbsmncache_delete(cache);
647 return -1; /* TODO */
650 LOCAL W bchanl_bbsmenu_appenditemtohash(bchanl_bbsmenu_t *bchanl, bbsmnparser_item_t *item)
654 W host_len, board_len;
656 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
657 err = bchanl_subjecthash_append(bchanl->subjecthash, host, host_len, board, board_len, item->title, item->title_len);
661 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
663 W err, l, t, r, b, ret;
664 bbsmnparser_t *parser = bchanl->parser;
665 bbsmnparser_item_t *item;
666 bbsmnfilter_t *filter = bchanl->filter;
667 bbsmnlayout_t *layout = bchanl->layout;
669 bbsmnlayout_clear(layout);
670 bbsmnfilter_clear(filter);
671 bbsmnparser_clear(parser);
674 err = bbsmnparser_getnextitem(parser, &item);
678 bbsmnfilter_inputitem(filter, item);
680 ret = bbsmnfilter_outputitem(filter, &item);
682 if (item->category == NULL) {
683 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
688 err = bbsmnlayout_appenditem(layout, item);
693 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
697 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
701 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
713 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
714 bbsmenuwindow_setdrawrect(window, l, t, r, b);
716 bbsmenuwindow_requestredisp(window);
719 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
720 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
722 LOCAL VOID bchanl_retriever_task(W arg)
725 bbsmnretriever_t *retr;
729 bchanl = (bchanl_t*)arg;
730 retr = bchanl->bbsmenu.retriever;
731 cache = bchanl->bbsmenu.cache;
734 DP(("before rcv_mbf %d\n", bchanl->mbfid));
735 err = rcv_mbf(bchanl->mbfid, (VP)&msg, T_FOREVER);
736 DP_ER("rcv_mbf error:",err);
741 err = bbsmnretriever_sendrequest(retr, cache);
744 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
745 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
748 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
749 DP_ER("bbsmnretreiver_request error",err);
757 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
759 if (bchanl->retriever == NULL) {
763 bchanl->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
764 if (bchanl->mbfid < 0) {
765 DP_ER("error cre_mbf:", bchanl->mbfid);
768 bchanl->taskid = cre_tsk(bchanl_retriever_task, -1, (W)bchanl);
769 if (bchanl->taskid < 0) {
770 del_mbf(bchanl->mbfid);
772 DP_ER("error cre_tsk:", bchanl->taskid);
779 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
782 static UW lastrequest = 0;
785 if (bchanl->mbfid < 0) {
789 err = get_etm(&etime);
791 DP_ER("get_etm error:", err);
794 if (lastrequest + 10000 > etime) {
799 err = snd_mbf(bchanl->mbfid, &msg, sizeof(W), T_FOREVER);
801 DP_ER("snd_mbf error:", err);
805 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
806 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
811 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype)
813 static RECT r0 = {{400, 100, 700+7, 200+30}};
814 static RECT r1 = {{100, 100, 300+7, 300+30}};
815 TC *title0 = NULL, *title1 = NULL;
821 sbjtretriever_t *retriever;
823 bchanl_subjecthash_t *subjecthash;
824 subjectwindow_t *subjectwindow;
825 bbsmenuwindow_t *bbsmenuwindow;
826 subjectoptionwindow_t *subjectoptionwindow;
828 retriever = sbjtretriever_new();
829 if (retriever == NULL) {
830 DP_ER("sbjtretriever_new error", 0);
831 goto error_retriever;
833 hmi = bchanlhmi_new();
835 DP_ER("bchanlhmi_new error", 0);
836 goto error_bchanlhmi;
838 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
839 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, 0, title0, NULL);
840 if (subjectwindow == NULL) {
841 DP_ER("bchanlhmi_newsubjectwindow error", 0);
842 goto error_subjectwindow;
844 gid = subjectwindow_getGID(subjectwindow);
845 subjecthash = bchanl_subjecthash_new(gid, 100);
846 if (subjecthash == NULL) {
847 DP_ER("bchanl_subjecthash_new error", 0);
848 goto error_subjecthash;
850 subjectoptionwindow = bchanlhmi_newsubjectoptionwindow(hmi, &p0, subjectwindow, NULL, NULL, BCHANL_DBX_TB_SBJTOPT_FLT, BCHANL_DBX_WS_SBJTOPT_ODR, BCHANL_DBX_WS_SBJTOPT_ODRBY);
851 if (subjectoptionwindow == NULL) {
852 DP_ER("bchanlhmi_newsubjectoptionwindow", 0);
853 goto error_subjectoptionwindow;
855 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
856 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, 0, title1, NULL);
857 if (bbsmenuwindow == NULL) {
858 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
859 goto error_bbsmenuwindow;
861 gid = bbsmenuwindow_getGID(bbsmenuwindow);
862 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash);
864 DP_ER("bchanl_bbsmenu_initialize error", err);
867 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
869 DP_ER("bchanl_mainmenu_initialize %d", err);
873 bchanl_hmistate_initialize(&bchanl->hmistate);
875 if (exectype == EXECREQ) {
876 wid = bbsmenuwindow_getWID(bbsmenuwindow);
880 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
881 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
882 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
884 bchanl->retriever = retriever;
885 bchanl->subjecthash = subjecthash;
887 bchanl->currentsubject = NULL;
890 bchanl->exectype = exectype;
893 bchanl->subjectwindow = subjectwindow;
894 bchanl->bbsmenuwindow = bbsmenuwindow;
895 bchanl->subjectoptionwindow = subjectoptionwindow;
900 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
902 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
904 bchanlhmi_deletesubjectoptionwindow(hmi, subjectoptionwindow);
905 error_subjectoptionwindow:
906 bchanl_subjecthash_delete(subjecthash);
908 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
910 bchanlhmi_delete(hmi);
912 sbjtretriever_delete(retriever);
914 return -1; /* TODO */
917 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
919 gset_ptr(PS_BUSY, NULL, -1, -1);
922 if (bchanl->exectype == EXECREQ) {
923 oend_prc(bchanl->vid, NULL, 0);
925 bchanl_mainmenu_finalize(&bchanl->mainmenu);
926 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
927 bchanlhmi_deletesubjectoptionwindow(bchanl->hmi, bchanl->subjectoptionwindow);
928 bchanl_subjecthash_delete(bchanl->subjecthash);
929 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
930 bchanlhmi_delete(bchanl->hmi);
931 sbjtretriever_delete(bchanl->retriever);
936 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
938 TC fname[] = {TK_b, TK_b, TK_s, TK_m, TK_e, TK_n, TK_u, TK_PROD, TK_h, TK_t, TK_m, TK_l, TNULL};
943 bbsmncache_t *cache = bchanl->cache;
944 bbsmndraw_t *draw = bchanl->draw;
946 err = get_lnk(fname, &lnk, F_NORM);
948 DP_ER("error get_lnk", err);
951 fd = opn_fil(&lnk, F_READ, NULL);
955 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
965 err = rea_rec(fd, 0, bin, len, 0, NULL);
973 bbsmncache_appenddata(cache, bin, len);
976 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
978 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
979 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
980 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
983 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
985 W l,t,r,b,l1,t1,r1,b1,scr;
986 sbjtlayout_t *layout;
989 if (bchanl->currentsubject == NULL) {
992 draw = bchanl_subject_getdraw(bchanl->currentsubject);
996 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1002 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1003 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1006 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1007 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1008 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1015 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1016 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1020 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1021 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1022 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1029 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1030 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1034 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1040 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1041 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1044 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1050 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1051 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1054 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1055 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1056 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1057 if (b + (b - t) > b1) {
1063 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1064 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1068 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1069 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1070 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1071 if (r + (r - l) > r1) {
1077 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1078 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1082 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1088 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1089 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1091 case TK_E: /* temporary */
1092 if (stat & ES_CMD) {
1093 bchanl_killme(bchanl);
1099 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1101 W l,t,r,b,l1,t1,r1,b1,scr;
1102 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
1103 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
1107 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1113 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1114 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1117 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1118 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1125 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1126 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1133 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1139 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1140 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1143 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1144 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1145 if (b + (b - t) > b1) {
1151 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1152 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1159 bchanl_networkrequest_bbsmenu(bchanl);
1161 case TK_E: /* temporary */
1162 if (stat & ES_CMD) {
1163 bchanl_killme(bchanl);
1170 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1174 act = subjectwindow_isactive(bchanl->subjectwindow);
1176 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1179 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1181 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1186 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl)
1190 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1192 bchanl_mainmenu_setup(&bchanl->mainmenu, isopen);
1195 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel)
1200 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1201 bchanl_killme(bchanl);
1203 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1204 subjectwindow_requestredisp(bchanl->subjectwindow);
1205 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1207 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1208 bchanl_networkrequest_bbsmenu(bchanl);
1210 case BCHANL_MAINMENU_SELECT_SUBJECTOPTION: /* [¥¹¥ì°ìÍ÷ÀßÄê] */
1211 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1212 if (isopen == False) {
1213 subjectoptionwindow_open(bchanl->subjectoptionwindow);
1215 subjectoptionwindow_close(bchanl->subjectoptionwindow);
1222 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos)
1225 bchanl_setupmenu(bchanl);
1226 gset_ptr(PS_SELECT, NULL, -1, -1);
1227 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1229 bchanl_selectmenu(bchanl, sel);
1233 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode)
1236 bchanl_setupmenu(bchanl);
1237 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1239 bchanl_selectmenu(bchanl, sel);
1244 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1247 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1248 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1249 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1252 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1253 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1259 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1261 bchanlhmievent_t *evt;
1264 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1269 switch (evt->type) {
1270 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1272 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1273 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1274 bchanl_setupmenu(bchanl);
1275 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode);
1277 bchanl_selectmenu(bchanl, sel);
1281 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1283 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
1284 bchanl_popupmenu(bchanl, evt->data.common_menu.pos);
1286 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
1287 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
1289 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_DRAW:
1290 bchanl_subjectwindow_draw(bchanl);
1292 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_RESIZE:
1293 bchanl_subjectwindow_resize(bchanl, evt->data.subjectwindow_resize.work_sz);
1295 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_CLOSE:
1296 bchanl_subjectwindow_close(bchanl);
1298 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_BUTDN:
1299 bchanl_subjectwindow_butdn(bchanl, evt->data.subjectwindow_butdn.type, evt->data.subjectwindow_butdn.pos);
1301 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_PASTE:
1302 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
1304 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_MOUSEMOVE:
1305 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1307 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_SCROLL:
1308 bchanl_subjectwindow_scroll(bchanl, evt->data.subjectwindow_scroll.dh, evt->data.subjectwindow_scroll.dv);
1310 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_DRAW:
1311 bchanl_bbsmenuwindow_draw(bchanl);
1313 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_RESIZE:
1314 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenuwindow_resize.work_sz);
1316 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_CLOSE:
1317 bchanl_bbsmenuwindow_close(bchanl);
1319 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_BUTDN:
1320 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenuwindow_butdn.type, evt->data.bbsmenuwindow_butdn.pos);
1322 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_MOUSEMOVE:
1323 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1325 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_SCROLL:
1326 bchanl_bbsmenuwindow_scroll(bchanl, evt->data.bbsmenuwindow_scroll.dh, evt->data.bbsmenuwindow_scroll.dv);
1328 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_DETERMINE:
1329 bchanl_changesubjectfilterword(bchanl, evt->data.subjectoptionwindow_filter_determine.value, evt->data.subjectoptionwindow_filter_determine.len);
1331 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_COPY:
1333 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MOVE:
1335 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MENU:
1337 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_KEYMENU:
1339 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDER_CHANGE:
1340 bchanl_changesubjectorder(bchanl, evt->data.subjectoptionwindow_order_change.value);
1342 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDERBY_CHANGE:
1343 bchanl_changesubjectorderby(bchanl, evt->data.subjectoptionwindow_order_change.value);
1345 case BCHANLHMIEVENT_TYPE_NONE:
1349 LOCAL TC filename_dbg_databox[] = (TC[]){TK_b, TK_c, TK_h, TK_a, TK_n, TK_l, TK_PROD, TK_d, TK_b, TK_x, TNULL};
1350 LOCAL TC filename_dbg_storage[] = (TC[]){TK_c, TK_o, TK_m, TK_m, TK_o, TK_n, TK_s, TK_t, TK_o, TK_r, TK_a, TK_g, TK_e, TK_2, TNULL};
1351 LOCAL TC filename_storage[] = (TC[]){TK_c, TK_o, TK_m, TK_m, TK_o, TK_n, TK_s, TK_t, TK_o, TK_r, TK_a, TK_g, TK_e, TNULL};
1353 LOCAL W main_CLI_args(VID *vid, LINK *storage)
1359 err = get_lnk(filename_dbg_databox, &dbx, F_NORM);
1361 DP_ER("get_lnk:test databox error", err);
1364 err = dopn_dat(&dbx);
1366 DP_ER("dopn_dat error", err);
1369 err = get_lnk(filename_dbg_storage, storage, F_NORM);
1371 DP_ER("get_lnk;commonstorage error", err);
1378 LOCAL W main_EXECREC_args(M_EXECREQ *msg, VID *vid, LINK *storage)
1383 err = dopn_dat(&msg->self);
1385 DP_ER("dopn_dat", err);
1390 err = get_lnk(filename_storage, &lnk, F_BASED);
1392 DP_ER("get_lnk;commonstorage error", err);
1402 typedef struct _arg {
1407 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1414 len = src->msg_size / sizeof(TC);
1415 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1418 if(str[i] == TK_KSP){
1424 if(str[i] == TK_KSP){
1431 argv = (TC**)malloc(sizeof(TC*)*ac);
1435 if(str[i] == TNULL){
1441 if(str[i] == TNULL){
1454 EXPORT W MAIN(MESSAGE *msg)
1462 err = dopn_dat(NULL);
1464 DP_ER("dopn_dat error:", err);
1468 switch (msg->msg_type) {
1470 arg = MESSAGEtoargv(msg);
1471 err = main_CLI_args(&vid, &storage);
1477 oend_req(((M_DISPREQ*)msg)->vid, -1);
1481 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1485 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
1488 err = main_EXECREC_args((M_EXECREQ*)msg, &vid, &storage);
1498 err = bchanl_initialize(&bchanl, vid, msg->msg_type);
1500 DP_ER("bchanl_initialize error", err);
1503 err = bchanl_prepare_network(&bchanl);
1505 DP_ER("bchanl_prepare_network error", err);
1506 bchanl_killme(&bchanl);
1510 if (msg->msg_type == 0) {
1511 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
1512 } else if (msg->msg_type == EXECREQ) {
1513 bchanl_networkrequest_bbsmenu(&bchanl);
1516 subjectwindow_requestredisp(bchanl.subjectwindow);
1517 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
1520 bchanl_eventdispatch(&bchanl);