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)
689 url_asc_len = tcstosjs(NULL, url);
690 url_asc = malloc(sizeof(UB)*(url_asc_len+1));
691 if (url_asc == NULL) {
695 tcstosjs(url_asc, url);
696 url_asc[url_asc_len] = '\0';
698 extbbslist_appenditem(bchanl->extbbslist, title, title_len, url_asc, url_asc_len);
703 LOCAL VOID bchanl_bbsmenu_relayoutcache(bchanl_bbsmenu_t *bchanl)
706 bbsmnparser_t *parser = bchanl->parser;
707 bbsmnparser_item_t *item;
708 bbsmnfilter_t *filter = bchanl->filter;
709 bbsmnlayout_t *layout = bchanl->layout;
712 err = bbsmnparser_getnextitem(parser, &item);
716 bbsmnfilter_inputitem(filter, item);
718 ret = bbsmnfilter_outputitem(filter, &item);
720 if (item->category == NULL) {
721 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
726 err = bbsmnlayout_appenditem(layout, item);
731 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
735 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
739 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
752 LOCAL VOID bchanl_bbsmenu_relayoutexternal(bchanl_bbsmenu_t *bchanl)
754 W err, ret, category_len, title_len, url_len;
756 TC *category, *title;
758 extbbslist_readcontext_t *ctx;
759 bbsmnparser_t *parser = bchanl->parser;
760 bbsmnparser_item_t *item;
761 bbsmnlayout_t *layout = bchanl->layout;
762 extbbslist_t *list = bchanl->extbbslist;
764 ret = extbbslist_number(bchanl->extbbslist);
769 category = bchanl->category_extbbs;
770 category_len = tc_strlen(category);
771 item = bbsmnparser_newcategoryitem(parser, category, category_len);
775 err = bbsmnlayout_appenditem(layout, item);
780 ctx = extbbslist_startread(list);
785 cont = extbbslist_readcontext_getnext(ctx, &title, &title_len, &url, &url_len);
790 item = bbsmnparser_newboarditem(parser, title, title_len, url, url_len);
794 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
798 err = bbsmnlayout_appenditem(layout, item);
803 extbbslist_endread(list, ctx);
806 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
810 bbsmnlayout_clear(bchanl->layout);
811 bbsmnfilter_clear(bchanl->filter);
812 bbsmnparser_clear(bchanl->parser);
814 bchanl_bbsmenu_relayoutcache(bchanl);
815 bchanl_bbsmenu_relayoutexternal(bchanl);
817 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
818 bbsmenuwindow_setdrawrect(window, l, t, r, b);
820 bbsmenuwindow_requestredisp(window);
823 LOCAL VOID bchanl_registerexternalbbs(bchanl_t *bchanl)
827 W title_len, url_len;
829 title_len = registerexternalwindow_getboradnametext(bchanl->registerexternalwindow, title, 128);
831 DP_ER("registerexternalwindow_getboradnametext error", title_len);
834 title[title_len] = TNULL;
835 url_len = registerexternalwindow_geturltext(bchanl->registerexternalwindow, url, 256);
837 DP_ER("registerexternalwindow_geturltext error", url_len);
840 url[url_len] = TNULL;
842 bchanl_bbsmenu_registerexternalbbs(&bchanl->bbsmenu, title, title_len, url, url_len);
844 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
847 LOCAL VOID bchanl_externalbbswindow_draw(bchanl_t *bchanl)
852 if (externalbbswindow_startredisp(bchanl->externalbbswindow, &r) == 0) {
855 externalbbswindow_eraseworkarea(bchanl->externalbbswindow, &r);
856 extbbslist_editcontext_draw(bchanl->bbsmenu.editctx, externalbbswindow_getGID(bchanl->externalbbswindow), &r);
857 } while (externalbbswindow_endredisp(bchanl->externalbbswindow) > 0);
860 LOCAL VOID bchanl_externalbbswindow_resize(bchanl_t *bchanl, SIZE newsize)
864 extbbslist_editcontext_getviewrect(bchanl->bbsmenu.editctx, &l, &t, &r, &b);
869 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, l, t, r, b);
870 externalbbswindow_setworkrect(bchanl->externalbbswindow, l, t, r, b);
873 LOCAL VOID bchanl_externalbbswindow_close(bchanl_t *bchanl)
875 extbbslist_endedit(bchanl->bbsmenu.extbbslist, bchanl->bbsmenu.editctx, False);
876 bchanl->bbsmenu.editctx = NULL;
877 externalbbswindow_close(bchanl->externalbbswindow);
880 LOCAL VOID bchanl_externalbbswindow_butdn(bchanl_t *bchanl, W type, PNT pos)
885 if (type == W_CLICK) {
886 found = extbbslist_editcontext_finditem(bchanl->bbsmenu.editctx, pos, &sel);
887 if (found != False) {
888 extbbslist_editcontext_setselect(bchanl->bbsmenu.editctx, sel);
890 externalbbswindow_requestredisp(bchanl->externalbbswindow);
894 LOCAL VOID bchanl_externalbbswindow_paste(bchanl_t *bchanl)
896 externalbbswindow_responsepasterequest(bchanl->externalbbswindow, /* NACK */ 1, NULL);
899 LOCAL VOID bchanl_externalbbswindow_scroll(bchanl_t *bchanl, W dh, W dv)
901 extbbslist_editcontext_scrollviewrect(bchanl->bbsmenu.editctx, dh, dv);
902 externalbbswindow_scrollworkarea(bchanl->externalbbswindow, -dh, -dv);
905 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
906 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
908 LOCAL VOID bchanl_retriever_task(W arg)
911 bbsmnretriever_t *retr;
915 bchanl = (bchanl_t*)arg;
916 retr = bchanl->bbsmenu.retriever;
917 cache = bchanl->bbsmenu.cache;
920 DP(("before rcv_mbf %d\n", bchanl->mbfid));
921 err = rcv_mbf(bchanl->mbfid, (VP)&msg, T_FOREVER);
922 DP_ER("rcv_mbf error:",err);
927 err = bbsmnretriever_sendrequest(retr, cache);
930 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
931 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
934 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
935 DP_ER("bbsmnretreiver_request error",err);
943 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
945 if (bchanl->retriever == NULL) {
949 bchanl->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
950 if (bchanl->mbfid < 0) {
951 DP_ER("error cre_mbf:", bchanl->mbfid);
954 bchanl->taskid = cre_tsk(bchanl_retriever_task, -1, (W)bchanl);
955 if (bchanl->taskid < 0) {
956 del_mbf(bchanl->mbfid);
958 DP_ER("error cre_tsk:", bchanl->taskid);
965 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
968 static UW lastrequest = 0;
971 if (bchanl->mbfid < 0) {
975 err = get_etm(&etime);
977 DP_ER("get_etm error:", err);
980 if (lastrequest + 10000 > etime) {
985 err = snd_mbf(bchanl->mbfid, &msg, sizeof(W), T_FOREVER);
987 DP_ER("snd_mbf error:", err);
991 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
992 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
997 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype, LINK *storage)
999 static RECT r0 = {{400, 100, 700+7, 200+30}};
1000 static RECT r1 = {{100, 100, 300+7, 300+30}};
1001 static RECT r2 = {{400, 400, 700+7, 600+30}};
1002 TC *title0 = NULL, *title1 = NULL;
1008 sbjtretriever_t *retriever;
1010 bchanl_subjecthash_t *subjecthash;
1011 subjectwindow_t *subjectwindow;
1012 bbsmenuwindow_t *bbsmenuwindow;
1013 subjectoptionwindow_t *subjectoptionwindow;
1014 registerexternalwindow_t *registerexternalwindow;
1015 externalbbswindow_t *externalbbswindow;
1017 retriever = sbjtretriever_new();
1018 if (retriever == NULL) {
1019 DP_ER("sbjtretriever_new error", 0);
1020 goto error_retriever;
1022 hmi = bchanlhmi_new();
1024 DP_ER("bchanlhmi_new error", 0);
1025 goto error_bchanlhmi;
1027 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
1028 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, 0, title0, NULL);
1029 if (subjectwindow == NULL) {
1030 DP_ER("bchanlhmi_newsubjectwindow error", 0);
1031 goto error_subjectwindow;
1033 gid = subjectwindow_getGID(subjectwindow);
1034 subjecthash = bchanl_subjecthash_new(gid, 100);
1035 if (subjecthash == NULL) {
1036 DP_ER("bchanl_subjecthash_new error", 0);
1037 goto error_subjecthash;
1039 subjectoptionwindow = bchanlhmi_newsubjectoptionwindow(hmi, &p0, subjectwindow, NULL, NULL, BCHANL_DBX_TB_SBJTOPT_FLT, BCHANL_DBX_WS_SBJTOPT_ODR, BCHANL_DBX_WS_SBJTOPT_ODRBY);
1040 if (subjectoptionwindow == NULL) {
1041 DP_ER("bchanlhmi_newsubjectoptionwindow", 0);
1042 goto error_subjectoptionwindow;
1044 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
1045 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, 0, title1, NULL);
1046 if (bbsmenuwindow == NULL) {
1047 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
1048 goto error_bbsmenuwindow;
1050 gid = bbsmenuwindow_getGID(bbsmenuwindow);
1051 registerexternalwindow = bchanlhmi_newregisterexternalwindow(hmi, &p0, 0, NULL, NULL);
1052 if (registerexternalwindow == NULL) {
1053 DP_ER("bchanlhmi_newregisterexternalwindow error", 0);
1054 goto error_registerexternalwindow;
1056 externalbbswindow = bchanlhmi_newexternalbbswindow(hmi, &r2, 0, NULL, NULL);
1057 if (externalbbswindow == NULL) {
1058 DP_ER("bchanlhmi_newexternalbbswindow", 0);
1059 goto error_externalbbswindow;
1061 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash, storage);
1063 DP_ER("bchanl_bbsmenu_initialize error", err);
1066 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
1068 DP_ER("bchanl_mainmenu_initialize %d", err);
1069 goto error_mainmenu;
1072 bchanl_hmistate_initialize(&bchanl->hmistate);
1074 if (exectype == EXECREQ) {
1075 wid = bbsmenuwindow_getWID(bbsmenuwindow);
1079 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
1080 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
1081 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1083 bchanl->retriever = retriever;
1084 bchanl->subjecthash = subjecthash;
1086 bchanl->currentsubject = NULL;
1089 bchanl->exectype = exectype;
1092 bchanl->subjectwindow = subjectwindow;
1093 bchanl->bbsmenuwindow = bbsmenuwindow;
1094 bchanl->subjectoptionwindow = subjectoptionwindow;
1095 bchanl->registerexternalwindow = registerexternalwindow;
1096 bchanl->externalbbswindow = externalbbswindow;
1101 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
1103 bchanlhmi_deleteexternalbbswindow(hmi, externalbbswindow);
1104 error_externalbbswindow:
1105 bchanlhmi_deleteregisterexternalwindow(hmi, registerexternalwindow);
1106 error_registerexternalwindow:
1107 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
1108 error_bbsmenuwindow:
1109 bchanlhmi_deletesubjectoptionwindow(hmi, subjectoptionwindow);
1110 error_subjectoptionwindow:
1111 bchanl_subjecthash_delete(subjecthash);
1113 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
1114 error_subjectwindow:
1115 bchanlhmi_delete(hmi);
1117 sbjtretriever_delete(retriever);
1119 return -1; /* TODO */
1122 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
1124 gset_ptr(PS_BUSY, NULL, -1, -1);
1127 if (bchanl->exectype == EXECREQ) {
1128 oend_prc(bchanl->vid, NULL, 0);
1130 bchanl_mainmenu_finalize(&bchanl->mainmenu);
1131 bchanlhmi_deleteexternalbbswindow(bchanl->hmi, bchanl->externalbbswindow);
1132 bchanlhmi_deleteregisterexternalwindow(bchanl->hmi, bchanl->registerexternalwindow);
1133 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
1134 bchanlhmi_deletesubjectoptionwindow(bchanl->hmi, bchanl->subjectoptionwindow);
1135 bchanl_subjecthash_delete(bchanl->subjecthash);
1136 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
1137 bchanlhmi_delete(bchanl->hmi);
1138 sbjtretriever_delete(bchanl->retriever);
1143 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
1145 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};
1150 bbsmncache_t *cache = bchanl->cache;
1151 bbsmndraw_t *draw = bchanl->draw;
1153 err = get_lnk(fname, &lnk, F_NORM);
1155 DP_ER("error get_lnk", err);
1158 fd = opn_fil(&lnk, F_READ, NULL);
1162 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
1172 err = rea_rec(fd, 0, bin, len, 0, NULL);
1180 bbsmncache_appenddata(cache, bin, len);
1183 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1185 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
1186 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1187 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
1190 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1192 W l,t,r,b,l1,t1,r1,b1,scr;
1193 sbjtlayout_t *layout;
1196 if (bchanl->currentsubject == NULL) {
1199 draw = bchanl_subject_getdraw(bchanl->currentsubject);
1203 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1209 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1210 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1213 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1214 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1215 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1222 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1223 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1227 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1228 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1229 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1236 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1237 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1241 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1247 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1248 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1251 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1257 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1258 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1261 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1262 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1263 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1264 if (b + (b - t) > b1) {
1270 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1271 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1275 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1276 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1277 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1278 if (r + (r - l) > r1) {
1284 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1285 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1289 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1295 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1296 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1298 case TK_E: /* temporary */
1299 if (stat & ES_CMD) {
1300 bchanl_killme(bchanl);
1306 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1308 W l,t,r,b,l1,t1,r1,b1,scr;
1309 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
1310 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
1314 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1320 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1321 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1324 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1325 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1332 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1333 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1340 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1346 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1347 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1350 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1351 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1352 if (b + (b - t) > b1) {
1358 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1359 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1366 bchanl_networkrequest_bbsmenu(bchanl);
1368 case TK_E: /* temporary */
1369 if (stat & ES_CMD) {
1370 bchanl_killme(bchanl);
1377 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1381 act = subjectwindow_isactive(bchanl->subjectwindow);
1383 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1386 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1388 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1393 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl)
1397 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1399 bchanl_mainmenu_setup(&bchanl->mainmenu, isopen);
1402 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel)
1408 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1409 bchanl_killme(bchanl);
1411 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1412 subjectwindow_requestredisp(bchanl->subjectwindow);
1413 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1415 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1416 bchanl_networkrequest_bbsmenu(bchanl);
1418 case BCHANL_MAINMENU_SELECT_SUBJECTOPTION: /* [¥¹¥ì°ìÍ÷ÀßÄê] */
1419 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1420 if (isopen == False) {
1421 subjectoptionwindow_open(bchanl->subjectoptionwindow);
1423 subjectoptionwindow_close(bchanl->subjectoptionwindow);
1426 case BCHANL_MAINMENU_SELECT_REGISTEREXTBBS: /* [³°ÉôÈĤÎÄɲÃ] */
1427 isopen = registerexternalwindow_isopen(bchanl->registerexternalwindow);
1428 if (isopen == False) {
1429 registerexternalwindow_open(bchanl->registerexternalwindow);
1431 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1432 if (isopen == False) {
1434 bchanl->bbsmenu.editctx = extbbslist_startedit(bchanl->bbsmenu.extbbslist);
1435 if (bchanl->bbsmenu.editctx == NULL) {
1438 externalbbswindow_open(bchanl->externalbbswindow);
1439 externalbbswindow_getworkrect(bchanl->externalbbswindow, &work);
1440 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1441 externalbbswindow_setworkrect(bchanl->externalbbswindow, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1447 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos)
1450 bchanl_setupmenu(bchanl);
1451 gset_ptr(PS_SELECT, NULL, -1, -1);
1452 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1454 bchanl_selectmenu(bchanl, sel);
1458 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode)
1461 bchanl_setupmenu(bchanl);
1462 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1464 bchanl_selectmenu(bchanl, sel);
1469 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1472 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1473 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1474 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1477 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1478 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1484 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1486 bchanlhmievent_t *evt;
1489 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1494 switch (evt->type) {
1495 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1497 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1498 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1499 bchanl_setupmenu(bchanl);
1500 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode);
1502 bchanl_selectmenu(bchanl, sel);
1506 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1508 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
1509 bchanl_popupmenu(bchanl, evt->data.common_menu.pos);
1511 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
1512 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
1514 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_DRAW:
1515 bchanl_subjectwindow_draw(bchanl);
1517 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_RESIZE:
1518 bchanl_subjectwindow_resize(bchanl, evt->data.subjectwindow_resize.work_sz);
1520 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_CLOSE:
1521 bchanl_subjectwindow_close(bchanl);
1523 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_BUTDN:
1524 bchanl_subjectwindow_butdn(bchanl, evt->data.subjectwindow_butdn.type, evt->data.subjectwindow_butdn.pos);
1526 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_PASTE:
1527 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
1529 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_MOUSEMOVE:
1530 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1532 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_SCROLL:
1533 bchanl_subjectwindow_scroll(bchanl, evt->data.subjectwindow_scroll.dh, evt->data.subjectwindow_scroll.dv);
1535 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_DRAW:
1536 bchanl_bbsmenuwindow_draw(bchanl);
1538 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_RESIZE:
1539 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenuwindow_resize.work_sz);
1541 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_CLOSE:
1542 bchanl_bbsmenuwindow_close(bchanl);
1544 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_BUTDN:
1545 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenuwindow_butdn.type, evt->data.bbsmenuwindow_butdn.pos);
1547 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_MOUSEMOVE:
1548 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1550 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_SCROLL:
1551 bchanl_bbsmenuwindow_scroll(bchanl, evt->data.bbsmenuwindow_scroll.dh, evt->data.bbsmenuwindow_scroll.dv);
1553 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_DETERMINE:
1554 bchanl_changesubjectfilterword(bchanl, evt->data.subjectoptionwindow_filter_determine.value, evt->data.subjectoptionwindow_filter_determine.len);
1556 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_COPY:
1558 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MOVE:
1560 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MENU:
1562 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_KEYMENU:
1564 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDER_CHANGE:
1565 bchanl_changesubjectorder(bchanl, evt->data.subjectoptionwindow_order_change.value);
1567 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDERBY_CHANGE:
1568 bchanl_changesubjectorderby(bchanl, evt->data.subjectoptionwindow_order_change.value);
1570 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_DETERMINE:
1572 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_COPY:
1574 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MOVE:
1576 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MENU:
1578 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_KEYMENU:
1580 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_DETERMINE:
1582 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_COPY:
1584 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MOVE:
1586 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MENU:
1588 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_KEYMENU:
1590 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_DETERMINE_PUSH:
1591 registerexternalwindow_close(bchanl->registerexternalwindow);
1592 bchanl_registerexternalbbs(bchanl);
1594 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_CANCEL_PUSH:
1595 registerexternalwindow_close(bchanl->registerexternalwindow);
1597 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_DRAW:
1598 bchanl_externalbbswindow_draw(bchanl);
1600 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_RESIZE:
1602 bchanl_externalbbswindow_resize(bchanl, evt->data.externalbbswindow_resize.work_sz);
1603 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_CLOSE:
1604 bchanl_externalbbswindow_close(bchanl);
1606 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_BUTDN:
1607 bchanl_externalbbswindow_butdn(bchanl, evt->data.externalbbswindow_butdn.type, evt->data.externalbbswindow_butdn.pos);
1609 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_PASTE:
1610 bchanl_externalbbswindow_paste(bchanl);
1612 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_SCROLL:
1613 bchanl_externalbbswindow_scroll(bchanl, evt->data.externalbbswindow_scroll.dh, evt->data.externalbbswindow_scroll.dv);
1615 case BCHANLHMIEVENT_TYPE_NONE:
1619 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};
1620 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};
1621 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};
1623 LOCAL W main_CLI_args(VID *vid, LINK *storage)
1629 err = get_lnk(filename_dbg_databox, &dbx, F_NORM);
1631 DP_ER("get_lnk:test databox error", err);
1634 err = dopn_dat(&dbx);
1636 DP_ER("dopn_dat error", err);
1639 err = get_lnk(filename_dbg_storage, storage, F_NORM);
1641 DP_ER("get_lnk;commonstorage error", err);
1648 LOCAL W main_EXECREC_args(M_EXECREQ *msg, VID *vid, LINK *storage)
1653 err = dopn_dat(&msg->self);
1655 DP_ER("dopn_dat", err);
1660 err = get_lnk(filename_storage, &lnk, F_BASED);
1662 DP_ER("get_lnk;commonstorage error", err);
1672 typedef struct _arg {
1677 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1684 len = src->msg_size / sizeof(TC);
1685 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1688 if(str[i] == TK_KSP){
1694 if(str[i] == TK_KSP){
1701 argv = (TC**)malloc(sizeof(TC*)*ac);
1705 if(str[i] == TNULL){
1711 if(str[i] == TNULL){
1724 EXPORT W MAIN(MESSAGE *msg)
1732 err = dopn_dat(NULL);
1734 DP_ER("dopn_dat error:", err);
1738 switch (msg->msg_type) {
1740 arg = MESSAGEtoargv(msg);
1741 err = main_CLI_args(&vid, &storage);
1747 oend_req(((M_DISPREQ*)msg)->vid, -1);
1751 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1755 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
1758 err = main_EXECREC_args((M_EXECREQ*)msg, &vid, &storage);
1768 err = bchanl_initialize(&bchanl, vid, msg->msg_type, &storage);
1770 DP_ER("bchanl_initialize error", err);
1773 err = bchanl_prepare_network(&bchanl);
1775 DP_ER("bchanl_prepare_network error", err);
1776 bchanl_killme(&bchanl);
1780 if (msg->msg_type == 0) {
1781 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
1782 } else if (msg->msg_type == EXECREQ) {
1783 bchanl_networkrequest_bbsmenu(&bchanl);
1786 subjectwindow_requestredisp(bchanl.subjectwindow);
1787 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
1790 bchanl_eventdispatch(&bchanl);