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"
53 #include "extbbslist.h"
55 #include "bchanl_subject.h"
56 #include "bchanl_hmi.h"
57 #include "bchanl_menus.h"
59 #ifdef BCHANL_CONFIG_DEBUG
60 # define DP(arg) printf arg
61 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
64 # define DP_ER(msg, err) /**/
67 #define BCHANL_DBX_MENU_TEST 20
68 #define BCHANL_DBX_TEXT_MLIST0 21
69 #define BCHANL_DBX_TEXT_MLIST1 22
70 #define BCHANL_DBX_TEXT_MLIST2 23
71 #define BCHANL_DBX_VIEWER_FUSEN 24
72 #define BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU 25
73 #define BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT 26
74 #define BCHANL_DBX_TEXT_MSG_RETRBBSMENU 27
75 #define BCHANL_DBX_TEXT_MSG_RETRSUBJECT 28
76 #define BCHANL_DBX_TEXT_MSG_ERRRETR 29
77 #define BCHANL_DBX_TB_SBJTOPT_FLT 30
78 #define BCHANL_DBX_WS_SBJTOPT_ODR 31
79 #define BCHANL_DBX_WS_SBJTOPT_ODRBY 32
80 #define BCHANL_DBX_TEXT_CATE_EXTBBS 33
82 #define BCHANL_MENU_WINDOW 3
84 #define BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE 30
85 #define BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE 1
87 typedef struct bchanl_hmistate_t_ bchanl_hmistate_t;
88 struct bchanl_hmistate_t_ {
96 LOCAL VOID bchanl_hmistate_updateptrstyle(bchanl_hmistate_t *hmistate, PTRSTL ptr)
98 if (hmistate->ptr == ptr) {
102 gset_ptr(hmistate->ptr, NULL, -1, -1);
105 LOCAL VOID bchanl_hmistate_initialize(bchanl_hmistate_t *hmistate)
109 hmistate->ptr = PS_SELECT;
111 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRBBSMENU, (void**)&hmistate->msg_retr_bbsmenu);
113 DP_ER("dget_dtp: message retrieving error", err);
114 hmistate->msg_retr_bbsmenu = NULL;
116 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRSUBJECT, (void**)&hmistate->msg_retr_subject);
118 DP_ER("dget_dtp: message not modified error", err);
119 hmistate->msg_retr_subject = NULL;
121 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_ERRRETR, (void**)&hmistate->msg_error_retr);
123 DP_ER("dget_dtp: message retrieve error error", err);
124 hmistate->msg_error_retr = NULL;
128 typedef struct bchanl_bbsmenu_t_ bchanl_bbsmenu_t;
129 struct bchanl_bbsmenu_t_ {
132 bbsmnretriever_t *retriever;
134 bbsmnparser_t *parser;
135 bbsmnfilter_t *filter;
136 bbsmnlayout_t *layout;
139 bchanl_subjecthash_t *subjecthash;
140 extbbslist_t *extbbslist;
141 extbbslist_editcontext_t *editctx;
149 bchanl_mainmenu_t mainmenu;
153 bchanl_hmistate_t hmistate;
155 sbjtretriever_t *retriever;
157 bchanl_subjecthash_t *subjecthash;
158 bchanl_bbsmenu_t bbsmenu;
159 bchanl_subject_t *currentsubject;
162 subjectwindow_t *subjectwindow;
163 bbsmenuwindow_t *bbsmenuwindow;
164 subjectoptionwindow_t *subjectoptionwindow;
165 registerexternalwindow_t *registerexternalwindow;
166 externalbbswindow_t *externalbbswindow;
168 typedef struct bchanl_t_ bchanl_t;
170 LOCAL VOID bchanl_killme(bchanl_t *bchanl);
172 LOCAL VOID bchanl_subjectwindow_draw(bchanl_t *bchanl)
176 if (bchanl->currentsubject == NULL) {
178 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
181 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
182 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
184 draw = bchanl_subject_getdraw(bchanl->currentsubject);
186 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
189 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
190 sbjtdraw_draw(draw, &r);
191 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
195 LOCAL VOID bchanl_subjectwindow_scroll(bchanl_t *bchanl, W dh, W dv)
198 if (bchanl->currentsubject == NULL) {
201 draw = bchanl_subject_getdraw(bchanl->currentsubject);
202 sbjtdraw_scrollviewrect(draw, dh, dv);
203 subjectwindow_scrollworkarea(bchanl->subjectwindow, -dh, -dv);
204 bchanl_subjectwindow_draw(bchanl);
207 LOCAL VOID bchanl_subjectwindow_resize(bchanl_t *bchanl, SIZE newsize)
212 if (bchanl->currentsubject == NULL) {
215 draw = bchanl_subject_getdraw(bchanl->currentsubject);
217 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
222 sbjtdraw_setviewrect(draw, l, t, r, b);
223 subjectwindow_setworkrect(bchanl->subjectwindow, l, t, r, b);
225 bchanl_subjectwindow_draw(bchanl);
228 LOCAL VOID bchanl_subjectwindow_close(bchanl_t *bchanl)
230 bchanl_killme(bchanl);
233 LOCAL VOID bchanl_subjectwindow_press(bchanl_t *bchanl, PNT evpos)
235 sbjtlist_tuple_t *tuple;
238 W event_type, size, err, fsn_len, dx, dy;
241 PNT pos, p1, pos_butup;
248 if (bchanl->currentsubject == NULL) {
251 draw = bchanl_subject_getdraw(bchanl->currentsubject);
253 err = sbjtdraw_findthread(draw, evpos, &tuple, &vframe);
258 gid = subjectwindow_startdrag(bchanl->subjectwindow);
260 DP_ER("wsta_drg error:", gid);
267 dx = vframe.c.left - evpos.x;
268 dy = vframe.c.top - evpos.y;
272 sel.rgn.r.c.left = vframe.c.left;
273 sel.rgn.r.c.top = vframe.c.top;
274 sel.rgn.r.c.right = vframe.c.right;
275 sel.rgn.r.c.bottom = vframe.c.bottom;
276 adsp_sel(gid, &sel, 1);
278 gset_ptr(PS_GRIP, NULL, -1, -1);
280 event_type = subjectwindow_getdrag(bchanl->subjectwindow, &pos, &wid_butup, &pos_butup);
281 if (event_type == EV_BUTUP) {
284 if (event_type != EV_NULL) {
287 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
290 adsp_sel(gid, &sel, 0);
291 sel.rgn.r.c.left += pos.x - p1.x;
292 sel.rgn.r.c.top += pos.y - p1.y;
293 sel.rgn.r.c.right += pos.x - p1.x;
294 sel.rgn.r.c.bottom += pos.y - p1.y;
295 adsp_sel(gid, &sel, 1);
298 gset_ptr(PS_SELECT, NULL, -1, -1);
299 adsp_sel(gid, &sel, 0);
300 subjectwindow_enddrag(bchanl->subjectwindow);
302 /* BUTUP on self window or no window or system message panel */
303 if ((wid_butup == subjectwindow_getWID(bchanl->subjectwindow))||(wid_butup == 0)||(wid_butup == -1)) {
307 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
312 err = dget_dtp(64, BCHANL_DBX_VIEWER_FUSEN, (void**)&fsn);
314 DP_ER("dget_dtp: ", err);
317 fsn_len = dget_siz((B*)fsn);
318 err = bchanl_subject_createviewervobj(bchanl->currentsubject, tuple, fsn, fsn_len, &vrec.vseg, (LINK*)&vrec.vlnk);
320 DP_ER("bchanl_subject_createviewervobj error", err);
323 if (err == BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED) {
329 tr_rec.len = sizeof(TR_VOBJREC);
330 tr_rec.dt = (B*)&vrec;
331 err = tset_dat(&tr_rec, 1);
333 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
335 DP_ER("error del_fil:", err);
340 paste_ev.r.type = EV_REQUEST;
341 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
342 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
343 paste_ev.r.cmd = W_PASTE;
344 paste_ev.r.wid = wid_butup;
345 err = wsnd_evt(&paste_ev);
348 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
350 DP_ER("error del_fil:", err);
354 err = wwai_rsp(NULL, W_PASTE, 60000);
357 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
359 DP_ER("error del_fil:", err);
363 wswi_wnd(wid_butup, NULL);
366 LOCAL VOID bchanl_subjectwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
375 bchanl_subjectwindow_press(bchanl, evpos);
379 LOCAL VOID bchanl_setcurrentsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
381 bchanl->currentsubject = sbjt;
382 subjectwindow_requestredisp(bchanl->subjectwindow);
385 LOCAL VOID bchanl_bbsmenuwindow_draw(bchanl_t *bchanl)
389 if (bbsmenuwindow_startredisp(bchanl->bbsmenuwindow, &r) == 0) {
392 bbsmenuwindow_eraseworkarea(bchanl->bbsmenuwindow, &r);
393 bbsmndraw_draw(bchanl->bbsmenu.draw, &r);
394 } while (bbsmenuwindow_endredisp(bchanl->bbsmenuwindow) > 0);
397 LOCAL VOID bchanl_bbsmenuwindow_scroll(bchanl_t *bchanl, W dh, W dv)
399 bbsmndraw_scrollviewrect(bchanl->bbsmenu.draw, dh, dv);
400 bbsmenuwindow_scrollworkarea(bchanl->bbsmenuwindow, -dh, -dv);
401 bchanl_bbsmenuwindow_draw(bchanl);
404 LOCAL VOID bchanl_bbsmenuwindow_resize(bchanl_t *bchanl, SIZE newsize)
408 bbsmndraw_getviewrect(bchanl->bbsmenu.draw, &l, &t, &r, &b);
413 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, l, t, r, b);
414 bbsmenuwindow_setworkrect(bchanl->bbsmenuwindow, l, t, r, b);
416 bchanl_bbsmenuwindow_draw(bchanl);
419 LOCAL VOID bchanl_bbsmenuwindow_close(bchanl_t *bchanl)
421 bchanl_killme(bchanl);
424 LOCAL VOID bchanl_updatesubjectorder(bchanl_t *bchanl, SUBJECTOPTIONWINDOW_ORDERVALUE_T order, SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby, TC *filterword, W filterword_len)
429 if (order == SUBJECTOPTIONWINDOW_ORDERVALUE_DESCENDING) {
435 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER:
437 sbjt_orderby = BCHANL_SUBJECT_SORTBY_NUMBER;
439 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_RES:
440 sbjt_orderby = BCHANL_SUBJECT_SORTBY_RES;
442 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_SINCE:
443 sbjt_orderby = BCHANL_SUBJECT_SORTBY_SINCE;
445 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_VIGOR:
446 sbjt_orderby = BCHANL_SUBJECT_SORTBY_VIGOR;
450 bchanl_subject_reorder(bchanl->currentsubject, filterword, filterword_len, sbjt_orderby, descending);
452 subjectwindow_requestredisp(bchanl->subjectwindow);
455 LOCAL VOID bchanl_changesubjectorder(bchanl_t *bchanl, W neworder)
457 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
461 if (bchanl->currentsubject == NULL) {
465 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
466 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
468 bchanl_updatesubjectorder(bchanl, neworder, orderby, buf, len);
471 LOCAL VOID bchanl_changesubjectorderby(bchanl_t *bchanl, W neworderby)
473 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
477 if (bchanl->currentsubject == NULL) {
481 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
482 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
484 bchanl_updatesubjectorder(bchanl, order, neworderby, buf, len);
487 LOCAL VOID bchanl_changesubjectfilterword(bchanl_t *bchanl, TC *newstr, W newstr_len)
489 sbjtlayout_t *layout;
491 SUBJECTOPTIONWINDOW_ORDERVALUE_T order;
492 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
496 if (bchanl->currentsubject == NULL) {
500 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
501 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
503 bchanl_updatesubjectorder(bchanl, order, orderby, newstr, newstr_len);
505 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
506 draw = bchanl_subject_getdraw(bchanl->currentsubject);
507 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
508 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
510 layout = bchanl_subject_getlayout(bchanl->currentsubject);
511 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
512 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
515 LOCAL VOID bchanl_sendsubjectrequest(bchanl_t *bchanl, bchanl_subject_t *subject)
518 sbjtlayout_t *layout;
522 W l, t, r, b, title_len, err;
524 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
525 pdsp_msg(bchanl->hmistate.msg_retr_subject);
527 cache = bchanl_subject_getcache(subject);
528 err = sbjtretriever_sendrequest(bchanl->retriever, cache);
530 pdsp_msg(bchanl->hmistate.msg_error_retr);
531 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
536 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
538 subjectoptionwindow_setfiltertext(bchanl->subjectoptionwindow, NULL, 0);
539 err = subjectoptionwindow_setordervalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERVALUE_ASCENDING);
540 subjectoptionwindow_setorderbyvalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER);
542 bchanl_subject_relayout(subject);
544 bchanl_setcurrentsubject(bchanl, subject);
546 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
547 draw = bchanl_subject_getdraw(subject);
548 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
549 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
551 layout = bchanl_subject_getlayout(subject);
552 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
553 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
555 bchanl_subject_gettitle(subject, &title, &title_len);
556 subjectwindow_settitle(bchanl->subjectwindow, title);
559 LOCAL VOID bchanl_bbsmenuwindow_click(bchanl_t *bchanl, PNT pos)
561 bbsmnparser_item_t *item;
562 bchanl_subject_t *subject;
565 W host_len, board_len;
569 fnd = bbsmndraw_findboard(bchanl->bbsmenu.draw, pos, &item);
574 if (item->category != NULL) {
577 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
578 subject = bchanl_subjecthash_search(bchanl->subjecthash, host, host_len, board, board_len);
579 if (subject == NULL) {
580 DP(("not found by subject hash"));
583 bchanl_subject_gettitle(subject, &title, &title_len);
585 bchanl_sendsubjectrequest(bchanl, subject);
588 LOCAL VOID bchanl_bbsmenuwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
597 bchanl_bbsmenuwindow_click(bchanl, evpos);
601 LOCAL W bchanl_bbsmenu_initialize(bchanl_bbsmenu_t *bchanl, GID gid, bchanl_subjecthash_t *subjecthash, LINK *storage)
603 bbsmnretriever_t *retriever;
605 bbsmnparser_t *parser;
606 bbsmnfilter_t *filter;
607 bbsmnlayout_t *layout;
609 extbbslist_t *extbbslist;
612 cache = bbsmncache_new();
616 retriever = bbsmnretriever_new();
617 if (retriever == NULL) {
618 goto error_retriever;
620 parser = bbsmnparser_new(cache);
621 if (parser == NULL) {
624 filter = bbsmnfilter_new();
625 if (filter == NULL) {
628 layout = bbsmnlayout_new(gid);
629 if (layout == NULL) {
632 draw = bbsmndraw_new(layout);
636 extbbslist = extbbslist_new(storage, BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE, BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE);
637 if (extbbslist == NULL) {
638 DP_ER("extbbslist_new", 0);
639 goto error_extbbslist;
641 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_CATE_EXTBBS, (void**)&category_extbbs);
644 bchanl->retriever = retriever;
645 bchanl->cache = cache;
646 bchanl->parser = parser;
647 bchanl->filter = filter;
648 bchanl->layout = layout;
650 bchanl->subjecthash = subjecthash;
651 bchanl->extbbslist = extbbslist;
652 bchanl->editctx = NULL;
653 bchanl->category_extbbs = category_extbbs;
658 bbsmndraw_delete(draw);
660 bbsmnlayout_delete(layout);
662 bbsmnfilter_delete(filter);
664 bbsmnparser_delete(parser);
666 bbsmnretriever_delete(retriever);
668 bbsmncache_delete(cache);
670 return -1; /* TODO */
673 LOCAL W bchanl_bbsmenu_appenditemtohash(bchanl_bbsmenu_t *bchanl, bbsmnparser_item_t *item)
677 W host_len, board_len;
679 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
680 err = bchanl_subjecthash_append(bchanl->subjecthash, host, host_len, board, board_len, item->title, item->title_len);
684 LOCAL VOID bchanl_bbsmenu_registerexternalbbs(bchanl_bbsmenu_t *bchanl, TC *title, W title_len, TC *url, W url_len)
686 extbbslist_editcontext_append(bchanl->editctx, title, title_len, url, url_len);
689 LOCAL VOID bchanl_bbsmenu_relayoutcache(bchanl_bbsmenu_t *bchanl)
692 bbsmnparser_t *parser = bchanl->parser;
693 bbsmnparser_item_t *item;
694 bbsmnfilter_t *filter = bchanl->filter;
695 bbsmnlayout_t *layout = bchanl->layout;
698 err = bbsmnparser_getnextitem(parser, &item);
702 bbsmnfilter_inputitem(filter, item);
704 ret = bbsmnfilter_outputitem(filter, &item);
706 if (item->category == NULL) {
707 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
712 err = bbsmnlayout_appenditem(layout, item);
717 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
721 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
725 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
738 LOCAL VOID bchanl_bbsmenu_relayoutexternal(bchanl_bbsmenu_t *bchanl)
740 W err, ret, category_len, title_len, url_len;
742 TC *category, *title;
744 extbbslist_readcontext_t *ctx;
745 bbsmnparser_t *parser = bchanl->parser;
746 bbsmnparser_item_t *item;
747 bbsmnlayout_t *layout = bchanl->layout;
748 extbbslist_t *list = bchanl->extbbslist;
750 ret = extbbslist_number(bchanl->extbbslist);
755 category = bchanl->category_extbbs;
756 category_len = tc_strlen(category);
757 item = bbsmnparser_newcategoryitem(parser, category, category_len);
761 err = bbsmnlayout_appenditem(layout, item);
766 ctx = extbbslist_startread(list);
771 cont = extbbslist_readcontext_getnext(ctx, &title, &title_len, &url, &url_len);
776 item = bbsmnparser_newboarditem(parser, title, title_len, url, url_len);
780 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
784 err = bbsmnlayout_appenditem(layout, item);
789 extbbslist_endread(list, ctx);
792 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
796 bbsmnlayout_clear(bchanl->layout);
797 bbsmnfilter_clear(bchanl->filter);
798 bbsmnparser_clear(bchanl->parser);
800 bchanl_bbsmenu_relayoutcache(bchanl);
801 bchanl_bbsmenu_relayoutexternal(bchanl);
803 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
804 bbsmenuwindow_setdrawrect(window, l, t, r, b);
806 bbsmenuwindow_requestredisp(window);
809 LOCAL VOID bchanl_registerexternalbbs(bchanl_t *bchanl)
813 W title_len, url_len;
815 title_len = registerexternalwindow_getboradnametext(bchanl->registerexternalwindow, title, 128);
817 DP_ER("registerexternalwindow_getboradnametext error", title_len);
820 title[title_len] = TNULL;
821 url_len = registerexternalwindow_geturltext(bchanl->registerexternalwindow, url, 256);
823 DP_ER("registerexternalwindow_geturltext error", url_len);
826 url[url_len] = TNULL;
828 bchanl_bbsmenu_registerexternalbbs(&bchanl->bbsmenu, title, title_len, url, url_len);
830 registerexternalwindow_setboradnametext(bchanl->registerexternalwindow, NULL, 0);
831 registerexternalwindow_seturltext(bchanl->registerexternalwindow, NULL, 0);
833 externalbbswindow_requestredisp(bchanl->externalbbswindow);
836 LOCAL VOID bchanl_externalbbswindow_draw(bchanl_t *bchanl)
841 if (externalbbswindow_startredisp(bchanl->externalbbswindow, &r) == 0) {
844 externalbbswindow_eraseworkarea(bchanl->externalbbswindow, &r);
845 extbbslist_editcontext_draw(bchanl->bbsmenu.editctx, externalbbswindow_getGID(bchanl->externalbbswindow), &r);
846 } while (externalbbswindow_endredisp(bchanl->externalbbswindow) > 0);
849 LOCAL VOID bchanl_externalbbswindow_resize(bchanl_t *bchanl, SIZE newsize)
853 extbbslist_editcontext_getviewrect(bchanl->bbsmenu.editctx, &l, &t, &r, &b);
858 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, l, t, r, b);
859 externalbbswindow_setworkrect(bchanl->externalbbswindow, l, t, r, b);
862 LOCAL VOID bchanl_externalbbswindow_close(bchanl_t *bchanl)
864 extbbslist_endedit(bchanl->bbsmenu.extbbslist, bchanl->bbsmenu.editctx, True);
865 bchanl->bbsmenu.editctx = NULL;
866 externalbbswindow_close(bchanl->externalbbswindow);
867 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
870 LOCAL VOID bchanl_externalbbswindow_butdn(bchanl_t *bchanl, W type, PNT pos)
875 if (type == W_CLICK) {
876 found = extbbslist_editcontext_finditem(bchanl->bbsmenu.editctx, pos, &sel);
877 if (found != False) {
878 extbbslist_editcontext_setselect(bchanl->bbsmenu.editctx, sel);
880 externalbbswindow_requestredisp(bchanl->externalbbswindow);
884 LOCAL VOID bchanl_externalbbswindow_paste(bchanl_t *bchanl)
886 externalbbswindow_responsepasterequest(bchanl->externalbbswindow, /* NACK */ 1, NULL);
889 LOCAL VOID bchanl_externalbbswindow_scroll(bchanl_t *bchanl, W dh, W dv)
891 extbbslist_editcontext_scrollviewrect(bchanl->bbsmenu.editctx, dh, dv);
892 externalbbswindow_scrollworkarea(bchanl->externalbbswindow, -dh, -dv);
895 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
896 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
898 LOCAL VOID bchanl_retriever_task(W arg)
901 bbsmnretriever_t *retr;
905 bchanl = (bchanl_t*)arg;
906 retr = bchanl->bbsmenu.retriever;
907 cache = bchanl->bbsmenu.cache;
910 DP(("before rcv_mbf %d\n", bchanl->mbfid));
911 err = rcv_mbf(bchanl->mbfid, (VP)&msg, T_FOREVER);
912 DP_ER("rcv_mbf error:",err);
917 err = bbsmnretriever_sendrequest(retr, cache);
920 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
921 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
924 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
925 DP_ER("bbsmnretreiver_request error",err);
933 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
935 if (bchanl->retriever == NULL) {
939 bchanl->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
940 if (bchanl->mbfid < 0) {
941 DP_ER("error cre_mbf:", bchanl->mbfid);
944 bchanl->taskid = cre_tsk(bchanl_retriever_task, -1, (W)bchanl);
945 if (bchanl->taskid < 0) {
946 del_mbf(bchanl->mbfid);
948 DP_ER("error cre_tsk:", bchanl->taskid);
955 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
958 static UW lastrequest = 0;
961 if (bchanl->mbfid < 0) {
965 err = get_etm(&etime);
967 DP_ER("get_etm error:", err);
970 if (lastrequest + 10000 > etime) {
975 err = snd_mbf(bchanl->mbfid, &msg, sizeof(W), T_FOREVER);
977 DP_ER("snd_mbf error:", err);
981 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
982 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
987 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype, LINK *storage)
989 static RECT r0 = {{400, 100, 700+7, 200+30}};
990 static RECT r1 = {{100, 100, 300+7, 300+30}};
991 static RECT r2 = {{400, 300, 800+7, 400+30}};
992 TC *title0 = NULL, *title1 = NULL;
998 sbjtretriever_t *retriever;
1000 bchanl_subjecthash_t *subjecthash;
1001 subjectwindow_t *subjectwindow;
1002 bbsmenuwindow_t *bbsmenuwindow;
1003 subjectoptionwindow_t *subjectoptionwindow;
1004 registerexternalwindow_t *registerexternalwindow;
1005 externalbbswindow_t *externalbbswindow;
1007 retriever = sbjtretriever_new();
1008 if (retriever == NULL) {
1009 DP_ER("sbjtretriever_new error", 0);
1010 goto error_retriever;
1012 hmi = bchanlhmi_new();
1014 DP_ER("bchanlhmi_new error", 0);
1015 goto error_bchanlhmi;
1017 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
1018 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, 0, title0, NULL);
1019 if (subjectwindow == NULL) {
1020 DP_ER("bchanlhmi_newsubjectwindow error", 0);
1021 goto error_subjectwindow;
1023 gid = subjectwindow_getGID(subjectwindow);
1024 subjecthash = bchanl_subjecthash_new(gid, 100);
1025 if (subjecthash == NULL) {
1026 DP_ER("bchanl_subjecthash_new error", 0);
1027 goto error_subjecthash;
1029 subjectoptionwindow = bchanlhmi_newsubjectoptionwindow(hmi, &p0, subjectwindow, NULL, NULL, BCHANL_DBX_TB_SBJTOPT_FLT, BCHANL_DBX_WS_SBJTOPT_ODR, BCHANL_DBX_WS_SBJTOPT_ODRBY);
1030 if (subjectoptionwindow == NULL) {
1031 DP_ER("bchanlhmi_newsubjectoptionwindow", 0);
1032 goto error_subjectoptionwindow;
1034 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
1035 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, 0, title1, NULL);
1036 if (bbsmenuwindow == NULL) {
1037 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
1038 goto error_bbsmenuwindow;
1040 gid = bbsmenuwindow_getGID(bbsmenuwindow);
1041 registerexternalwindow = bchanlhmi_newregisterexternalwindow(hmi, &p0, 0, NULL, NULL);
1042 if (registerexternalwindow == NULL) {
1043 DP_ER("bchanlhmi_newregisterexternalwindow error", 0);
1044 goto error_registerexternalwindow;
1046 externalbbswindow = bchanlhmi_newexternalbbswindow(hmi, &r2, 0, NULL, NULL);
1047 if (externalbbswindow == NULL) {
1048 DP_ER("bchanlhmi_newexternalbbswindow", 0);
1049 goto error_externalbbswindow;
1051 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash, storage);
1053 DP_ER("bchanl_bbsmenu_initialize error", err);
1056 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
1058 DP_ER("bchanl_mainmenu_initialize %d", err);
1059 goto error_mainmenu;
1062 bchanl_hmistate_initialize(&bchanl->hmistate);
1064 if (exectype == EXECREQ) {
1065 wid = bbsmenuwindow_getWID(bbsmenuwindow);
1069 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
1070 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
1071 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1073 bchanl->retriever = retriever;
1074 bchanl->subjecthash = subjecthash;
1076 bchanl->currentsubject = NULL;
1079 bchanl->exectype = exectype;
1082 bchanl->subjectwindow = subjectwindow;
1083 bchanl->bbsmenuwindow = bbsmenuwindow;
1084 bchanl->subjectoptionwindow = subjectoptionwindow;
1085 bchanl->registerexternalwindow = registerexternalwindow;
1086 bchanl->externalbbswindow = externalbbswindow;
1091 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
1093 bchanlhmi_deleteexternalbbswindow(hmi, externalbbswindow);
1094 error_externalbbswindow:
1095 bchanlhmi_deleteregisterexternalwindow(hmi, registerexternalwindow);
1096 error_registerexternalwindow:
1097 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
1098 error_bbsmenuwindow:
1099 bchanlhmi_deletesubjectoptionwindow(hmi, subjectoptionwindow);
1100 error_subjectoptionwindow:
1101 bchanl_subjecthash_delete(subjecthash);
1103 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
1104 error_subjectwindow:
1105 bchanlhmi_delete(hmi);
1107 sbjtretriever_delete(retriever);
1109 return -1; /* TODO */
1112 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
1114 gset_ptr(PS_BUSY, NULL, -1, -1);
1117 if (bchanl->exectype == EXECREQ) {
1118 oend_prc(bchanl->vid, NULL, 0);
1120 bchanl_mainmenu_finalize(&bchanl->mainmenu);
1121 bchanlhmi_deleteexternalbbswindow(bchanl->hmi, bchanl->externalbbswindow);
1122 bchanlhmi_deleteregisterexternalwindow(bchanl->hmi, bchanl->registerexternalwindow);
1123 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
1124 bchanlhmi_deletesubjectoptionwindow(bchanl->hmi, bchanl->subjectoptionwindow);
1125 bchanl_subjecthash_delete(bchanl->subjecthash);
1126 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
1127 bchanlhmi_delete(bchanl->hmi);
1128 sbjtretriever_delete(bchanl->retriever);
1133 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
1135 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};
1140 bbsmncache_t *cache = bchanl->cache;
1141 bbsmndraw_t *draw = bchanl->draw;
1143 err = get_lnk(fname, &lnk, F_NORM);
1145 DP_ER("error get_lnk", err);
1148 fd = opn_fil(&lnk, F_READ, NULL);
1152 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
1162 err = rea_rec(fd, 0, bin, len, 0, NULL);
1170 bbsmncache_appenddata(cache, bin, len);
1173 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1175 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
1176 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1177 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
1180 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1182 W l,t,r,b,l1,t1,r1,b1,scr;
1183 sbjtlayout_t *layout;
1186 if (bchanl->currentsubject == NULL) {
1189 draw = bchanl_subject_getdraw(bchanl->currentsubject);
1193 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1199 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1200 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1203 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1204 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1205 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1212 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1213 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1217 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1218 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1219 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1226 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1227 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1231 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1237 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1238 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1241 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1247 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1248 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1251 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1252 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1253 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1254 if (b + (b - t) > b1) {
1260 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1261 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1265 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1266 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1267 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1268 if (r + (r - l) > r1) {
1274 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1275 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1279 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1285 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1286 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1288 case TK_E: /* temporary */
1289 if (stat & ES_CMD) {
1290 bchanl_killme(bchanl);
1296 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1298 W l,t,r,b,l1,t1,r1,b1,scr;
1299 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
1300 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
1304 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1310 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1311 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1314 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1315 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1322 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1323 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1330 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1336 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1337 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1340 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1341 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1342 if (b + (b - t) > b1) {
1348 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1349 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1356 bchanl_networkrequest_bbsmenu(bchanl);
1358 case TK_E: /* temporary */
1359 if (stat & ES_CMD) {
1360 bchanl_killme(bchanl);
1367 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1371 act = subjectwindow_isactive(bchanl->subjectwindow);
1373 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1376 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1378 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1383 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl)
1385 Bool isopen, isopen_extbbs, selected = False;
1388 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1389 isopen_extbbs = externalbbswindow_isopen(bchanl->externalbbswindow);
1390 if (isopen_extbbs != False) {
1391 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1397 bchanl_mainmenu_setup(&bchanl->mainmenu, isopen, isopen_extbbs, selected);
1400 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel)
1407 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1408 bchanl_killme(bchanl);
1410 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1411 subjectwindow_requestredisp(bchanl->subjectwindow);
1412 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1414 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1415 bchanl_networkrequest_bbsmenu(bchanl);
1417 case BCHANL_MAINMENU_SELECT_SUBJECTOPTION: /* [¥¹¥ì°ìÍ÷ÀßÄê] */
1418 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1419 if (isopen == False) {
1420 subjectoptionwindow_open(bchanl->subjectoptionwindow);
1422 subjectoptionwindow_close(bchanl->subjectoptionwindow);
1425 case BCHANL_MAINMENU_SELECT_EXTBBS_MANAGER: /* [³°ÉôÈĤÎÄɲÃ] */
1426 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1427 if (isopen == False) {
1429 bchanl->bbsmenu.editctx = extbbslist_startedit(bchanl->bbsmenu.extbbslist);
1430 if (bchanl->bbsmenu.editctx == NULL) {
1433 externalbbswindow_open(bchanl->externalbbswindow);
1434 externalbbswindow_getworkrect(bchanl->externalbbswindow, &work);
1435 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1436 externalbbswindow_setworkrect(bchanl->externalbbswindow, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1439 case BCHANL_MAINMENU_SELECT_EXTBBS_REGISTER:
1440 isopen = registerexternalwindow_isopen(bchanl->registerexternalwindow);
1441 if (isopen == False) {
1442 registerexternalwindow_open(bchanl->registerexternalwindow);
1445 case BCHANL_MAINMENU_SELECT_EXTBBS_UP:
1446 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1447 if (isopen != False) {
1448 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1452 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index-1, index);
1453 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1456 case BCHANL_MAINMENU_SELECT_EXTBBS_DOWN:
1457 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1458 if (isopen != False) {
1459 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1463 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index, index+1);
1464 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1467 case BCHANL_MAINMENU_SELECT_EXTBBS_DELETE:
1468 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1469 if (isopen != False) {
1470 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1474 extbbslist_editcontext_deleteitem(bchanl->bbsmenu.editctx, index);
1475 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1482 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos)
1485 bchanl_setupmenu(bchanl);
1486 gset_ptr(PS_SELECT, NULL, -1, -1);
1487 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1489 bchanl_selectmenu(bchanl, sel);
1493 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode)
1496 bchanl_setupmenu(bchanl);
1497 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1499 bchanl_selectmenu(bchanl, sel);
1504 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1507 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1508 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1509 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1512 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1513 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1519 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1521 bchanlhmievent_t *evt;
1524 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1529 switch (evt->type) {
1530 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1532 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1533 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1534 bchanl_setupmenu(bchanl);
1535 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode);
1537 bchanl_selectmenu(bchanl, sel);
1541 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1543 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
1544 bchanl_popupmenu(bchanl, evt->data.common_menu.pos);
1546 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
1547 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
1549 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_DRAW:
1550 bchanl_subjectwindow_draw(bchanl);
1552 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_RESIZE:
1553 bchanl_subjectwindow_resize(bchanl, evt->data.subjectwindow_resize.work_sz);
1555 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_CLOSE:
1556 bchanl_subjectwindow_close(bchanl);
1558 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_BUTDN:
1559 bchanl_subjectwindow_butdn(bchanl, evt->data.subjectwindow_butdn.type, evt->data.subjectwindow_butdn.pos);
1561 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_PASTE:
1562 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
1564 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_MOUSEMOVE:
1565 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1567 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_SCROLL:
1568 bchanl_subjectwindow_scroll(bchanl, evt->data.subjectwindow_scroll.dh, evt->data.subjectwindow_scroll.dv);
1570 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_DRAW:
1571 bchanl_bbsmenuwindow_draw(bchanl);
1573 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_RESIZE:
1574 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenuwindow_resize.work_sz);
1576 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_CLOSE:
1577 bchanl_bbsmenuwindow_close(bchanl);
1579 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_BUTDN:
1580 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenuwindow_butdn.type, evt->data.bbsmenuwindow_butdn.pos);
1582 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_MOUSEMOVE:
1583 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1585 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_SCROLL:
1586 bchanl_bbsmenuwindow_scroll(bchanl, evt->data.bbsmenuwindow_scroll.dh, evt->data.bbsmenuwindow_scroll.dv);
1588 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_DETERMINE:
1589 bchanl_changesubjectfilterword(bchanl, evt->data.subjectoptionwindow_filter_determine.value, evt->data.subjectoptionwindow_filter_determine.len);
1591 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_COPY:
1593 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MOVE:
1595 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MENU:
1597 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_KEYMENU:
1599 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDER_CHANGE:
1600 bchanl_changesubjectorder(bchanl, evt->data.subjectoptionwindow_order_change.value);
1602 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDERBY_CHANGE:
1603 bchanl_changesubjectorderby(bchanl, evt->data.subjectoptionwindow_order_change.value);
1605 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_DETERMINE:
1607 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_COPY:
1609 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MOVE:
1611 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MENU:
1613 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_KEYMENU:
1615 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_DETERMINE:
1617 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_COPY:
1619 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MOVE:
1621 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MENU:
1623 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_KEYMENU:
1625 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_DETERMINE_PUSH:
1626 bchanl_registerexternalbbs(bchanl);
1627 registerexternalwindow_close(bchanl->registerexternalwindow);
1629 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_CANCEL_PUSH:
1630 registerexternalwindow_close(bchanl->registerexternalwindow);
1632 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_DRAW:
1633 bchanl_externalbbswindow_draw(bchanl);
1635 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_RESIZE:
1637 bchanl_externalbbswindow_resize(bchanl, evt->data.externalbbswindow_resize.work_sz);
1638 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_CLOSE:
1639 bchanl_externalbbswindow_close(bchanl);
1641 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_BUTDN:
1642 bchanl_externalbbswindow_butdn(bchanl, evt->data.externalbbswindow_butdn.type, evt->data.externalbbswindow_butdn.pos);
1644 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_PASTE:
1645 bchanl_externalbbswindow_paste(bchanl);
1647 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_SCROLL:
1648 bchanl_externalbbswindow_scroll(bchanl, evt->data.externalbbswindow_scroll.dh, evt->data.externalbbswindow_scroll.dv);
1650 case BCHANLHMIEVENT_TYPE_NONE:
1654 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};
1655 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};
1656 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};
1658 LOCAL W main_CLI_args(VID *vid, LINK *storage)
1664 err = get_lnk(filename_dbg_databox, &dbx, F_NORM);
1666 DP_ER("get_lnk:test databox error", err);
1669 err = dopn_dat(&dbx);
1671 DP_ER("dopn_dat error", err);
1674 err = get_lnk(filename_dbg_storage, storage, F_NORM);
1676 DP_ER("get_lnk;commonstorage error", err);
1683 LOCAL W main_EXECREC_args(M_EXECREQ *msg, VID *vid, LINK *storage)
1688 err = dopn_dat(&msg->self);
1690 DP_ER("dopn_dat", err);
1695 err = get_lnk(filename_storage, &lnk, F_BASED);
1697 DP_ER("get_lnk;commonstorage error", err);
1707 typedef struct _arg {
1712 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1719 len = src->msg_size / sizeof(TC);
1720 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1723 if(str[i] == TK_KSP){
1729 if(str[i] == TK_KSP){
1736 argv = (TC**)malloc(sizeof(TC*)*ac);
1740 if(str[i] == TNULL){
1746 if(str[i] == TNULL){
1759 EXPORT W MAIN(MESSAGE *msg)
1767 err = dopn_dat(NULL);
1769 DP_ER("dopn_dat error:", err);
1773 switch (msg->msg_type) {
1775 arg = MESSAGEtoargv(msg);
1776 err = main_CLI_args(&vid, &storage);
1782 oend_req(((M_DISPREQ*)msg)->vid, -1);
1786 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1790 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
1793 err = main_EXECREC_args((M_EXECREQ*)msg, &vid, &storage);
1803 err = bchanl_initialize(&bchanl, vid, msg->msg_type, &storage);
1805 DP_ER("bchanl_initialize error", err);
1808 err = bchanl_prepare_network(&bchanl);
1810 DP_ER("bchanl_prepare_network error", err);
1811 bchanl_killme(&bchanl);
1815 if (msg->msg_type == 0) {
1816 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
1817 } else if (msg->msg_type == EXECREQ) {
1818 bchanl_networkrequest_bbsmenu(&bchanl);
1821 subjectwindow_requestredisp(bchanl.subjectwindow);
1822 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
1825 bchanl_eventdispatch(&bchanl);