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"
56 #include "bchanl_subject.h"
57 #include "bchanl_hmi.h"
58 #include "bchanl_menus.h"
59 #include "bchanl_panels.h"
61 #ifdef BCHANL_CONFIG_DEBUG
62 # define DP(arg) printf arg
63 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
66 # define DP_ER(msg, err) /**/
69 #define BCHANL_DBX_MENU_TEST 20
70 #define BCHANL_DBX_TEXT_MLIST0 21
71 #define BCHANL_DBX_TEXT_MLIST1 22
72 #define BCHANL_DBX_TEXT_MLIST2 23
73 #define BCHANL_DBX_VIEWER_FUSEN 24
74 #define BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU 25
75 #define BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT 26
76 #define BCHANL_DBX_TEXT_MSG_RETRBBSMENU 27
77 #define BCHANL_DBX_TEXT_MSG_RETRSUBJECT 28
78 #define BCHANL_DBX_TEXT_MSG_ERRRETR 29
79 #define BCHANL_DBX_TB_SBJTOPT_FLT 30
80 #define BCHANL_DBX_WS_SBJTOPT_ODR 31
81 #define BCHANL_DBX_WS_SBJTOPT_ODRBY 32
82 #define BCHANL_DBX_TEXT_CATE_EXTBBS 33
84 #define BCHANL_MENU_WINDOW 3
86 #define BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE 30
87 #define BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE 1
89 typedef struct bchanl_hmistate_t_ bchanl_hmistate_t;
90 struct bchanl_hmistate_t_ {
98 LOCAL VOID bchanl_hmistate_updateptrstyle(bchanl_hmistate_t *hmistate, PTRSTL ptr)
100 if (hmistate->ptr == ptr) {
104 gset_ptr(hmistate->ptr, NULL, -1, -1);
107 LOCAL VOID bchanl_hmistate_initialize(bchanl_hmistate_t *hmistate)
111 hmistate->ptr = PS_SELECT;
113 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRBBSMENU, (void**)&hmistate->msg_retr_bbsmenu);
115 DP_ER("dget_dtp: message retrieving error", err);
116 hmistate->msg_retr_bbsmenu = NULL;
118 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRSUBJECT, (void**)&hmistate->msg_retr_subject);
120 DP_ER("dget_dtp: message not modified error", err);
121 hmistate->msg_retr_subject = NULL;
123 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_ERRRETR, (void**)&hmistate->msg_error_retr);
125 DP_ER("dget_dtp: message retrieve error error", err);
126 hmistate->msg_error_retr = NULL;
130 typedef struct bchanl_bbsmenu_t_ bchanl_bbsmenu_t;
131 struct bchanl_bbsmenu_t_ {
134 bbsmnretriever_t *retriever;
136 bbsmnparser_t *parser;
137 bbsmnfilter_t *filter;
138 bbsmnlayout_t *layout;
141 bchanl_subjecthash_t *subjecthash;
142 extbbslist_t *extbbslist;
143 extbbslist_editcontext_t *editctx;
151 bchanl_mainmenu_t mainmenu;
155 bchanl_hmistate_t hmistate;
157 sbjtretriever_t *retriever;
159 bchanl_subjecthash_t *subjecthash;
160 bchanl_bbsmenu_t bbsmenu;
161 bchanl_subject_t *currentsubject;
164 subjectwindow_t *subjectwindow;
165 bbsmenuwindow_t *bbsmenuwindow;
166 subjectoptionwindow_t *subjectoptionwindow;
167 registerexternalwindow_t *registerexternalwindow;
168 externalbbswindow_t *externalbbswindow;
170 typedef struct bchanl_t_ bchanl_t;
172 LOCAL VOID bchanl_killme(bchanl_t *bchanl);
174 LOCAL VOID bchanl_subjectwindow_draw(bchanl_t *bchanl)
178 if (bchanl->currentsubject == NULL) {
180 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
183 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
184 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
186 draw = bchanl_subject_getdraw(bchanl->currentsubject);
188 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
191 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
192 sbjtdraw_draw(draw, &r);
193 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
197 LOCAL VOID bchanl_subjectwindow_scroll(bchanl_t *bchanl, W dh, W dv)
200 if (bchanl->currentsubject == NULL) {
203 draw = bchanl_subject_getdraw(bchanl->currentsubject);
204 sbjtdraw_scrollviewrect(draw, dh, dv);
205 subjectwindow_scrollworkarea(bchanl->subjectwindow, -dh, -dv);
206 bchanl_subjectwindow_draw(bchanl);
209 LOCAL VOID bchanl_subjectwindow_resize(bchanl_t *bchanl, SIZE newsize)
214 if (bchanl->currentsubject == NULL) {
217 draw = bchanl_subject_getdraw(bchanl->currentsubject);
219 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
224 sbjtdraw_setviewrect(draw, l, t, r, b);
225 subjectwindow_setworkrect(bchanl->subjectwindow, l, t, r, b);
227 bchanl_subjectwindow_draw(bchanl);
230 LOCAL VOID bchanl_subjectwindow_close(bchanl_t *bchanl)
232 bchanl_killme(bchanl);
235 LOCAL VOID bchanl_subjectwindow_press(bchanl_t *bchanl, PNT evpos)
237 sbjtlist_tuple_t *tuple;
240 W event_type, size, err, fsn_len, dx, dy;
243 PNT pos, p1, pos_butup;
250 if (bchanl->currentsubject == NULL) {
253 draw = bchanl_subject_getdraw(bchanl->currentsubject);
255 err = sbjtdraw_findthread(draw, evpos, &tuple, &vframe);
260 gid = subjectwindow_startdrag(bchanl->subjectwindow);
262 DP_ER("wsta_drg error:", gid);
269 dx = vframe.c.left - evpos.x;
270 dy = vframe.c.top - evpos.y;
274 sel.rgn.r.c.left = vframe.c.left;
275 sel.rgn.r.c.top = vframe.c.top;
276 sel.rgn.r.c.right = vframe.c.right;
277 sel.rgn.r.c.bottom = vframe.c.bottom;
278 adsp_sel(gid, &sel, 1);
280 gset_ptr(PS_GRIP, NULL, -1, -1);
282 event_type = subjectwindow_getdrag(bchanl->subjectwindow, &pos, &wid_butup, &pos_butup);
283 if (event_type == EV_BUTUP) {
286 if (event_type != EV_NULL) {
289 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
292 adsp_sel(gid, &sel, 0);
293 sel.rgn.r.c.left += pos.x - p1.x;
294 sel.rgn.r.c.top += pos.y - p1.y;
295 sel.rgn.r.c.right += pos.x - p1.x;
296 sel.rgn.r.c.bottom += pos.y - p1.y;
297 adsp_sel(gid, &sel, 1);
300 gset_ptr(PS_SELECT, NULL, -1, -1);
301 adsp_sel(gid, &sel, 0);
302 subjectwindow_enddrag(bchanl->subjectwindow);
304 /* BUTUP on self window or no window or system message panel */
305 if ((wid_butup == subjectwindow_getWID(bchanl->subjectwindow))||(wid_butup == 0)||(wid_butup == -1)) {
309 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
314 err = dget_dtp(64, BCHANL_DBX_VIEWER_FUSEN, (void**)&fsn);
316 DP_ER("dget_dtp: ", err);
319 fsn_len = dget_siz((B*)fsn);
320 err = bchanl_subject_createviewervobj(bchanl->currentsubject, tuple, fsn, fsn_len, &vrec.vseg, (LINK*)&vrec.vlnk);
322 DP_ER("bchanl_subject_createviewervobj error", err);
325 if (err == BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED) {
331 tr_rec.len = sizeof(TR_VOBJREC);
332 tr_rec.dt = (B*)&vrec;
333 err = tset_dat(&tr_rec, 1);
335 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
337 DP_ER("error del_fil:", err);
342 paste_ev.r.type = EV_REQUEST;
343 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
344 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
345 paste_ev.r.cmd = W_PASTE;
346 paste_ev.r.wid = wid_butup;
347 err = wsnd_evt(&paste_ev);
350 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
352 DP_ER("error del_fil:", err);
356 err = wwai_rsp(NULL, W_PASTE, 60000);
359 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
361 DP_ER("error del_fil:", err);
365 wswi_wnd(wid_butup, NULL);
368 LOCAL VOID bchanl_subjectwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
377 bchanl_subjectwindow_press(bchanl, evpos);
381 LOCAL VOID bchanl_setcurrentsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
383 bchanl->currentsubject = sbjt;
384 subjectwindow_requestredisp(bchanl->subjectwindow);
387 LOCAL VOID bchanl_bbsmenuwindow_draw(bchanl_t *bchanl)
391 if (bbsmenuwindow_startredisp(bchanl->bbsmenuwindow, &r) == 0) {
394 bbsmenuwindow_eraseworkarea(bchanl->bbsmenuwindow, &r);
395 bbsmndraw_draw(bchanl->bbsmenu.draw, &r);
396 } while (bbsmenuwindow_endredisp(bchanl->bbsmenuwindow) > 0);
399 LOCAL VOID bchanl_bbsmenuwindow_scroll(bchanl_t *bchanl, W dh, W dv)
401 bbsmndraw_scrollviewrect(bchanl->bbsmenu.draw, dh, dv);
402 bbsmenuwindow_scrollworkarea(bchanl->bbsmenuwindow, -dh, -dv);
403 bchanl_bbsmenuwindow_draw(bchanl);
406 LOCAL VOID bchanl_bbsmenuwindow_resize(bchanl_t *bchanl, SIZE newsize)
410 bbsmndraw_getviewrect(bchanl->bbsmenu.draw, &l, &t, &r, &b);
415 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, l, t, r, b);
416 bbsmenuwindow_setworkrect(bchanl->bbsmenuwindow, l, t, r, b);
418 bchanl_bbsmenuwindow_draw(bchanl);
421 LOCAL VOID bchanl_bbsmenuwindow_close(bchanl_t *bchanl)
423 bchanl_killme(bchanl);
426 LOCAL VOID bchanl_updatesubjectorder(bchanl_t *bchanl, SUBJECTOPTIONWINDOW_ORDERVALUE_T order, SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby, TC *filterword, W filterword_len)
431 if (order == SUBJECTOPTIONWINDOW_ORDERVALUE_DESCENDING) {
437 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER:
439 sbjt_orderby = BCHANL_SUBJECT_SORTBY_NUMBER;
441 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_RES:
442 sbjt_orderby = BCHANL_SUBJECT_SORTBY_RES;
444 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_SINCE:
445 sbjt_orderby = BCHANL_SUBJECT_SORTBY_SINCE;
447 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_VIGOR:
448 sbjt_orderby = BCHANL_SUBJECT_SORTBY_VIGOR;
452 bchanl_subject_reorder(bchanl->currentsubject, filterword, filterword_len, sbjt_orderby, descending);
454 subjectwindow_requestredisp(bchanl->subjectwindow);
457 LOCAL VOID bchanl_changesubjectorder(bchanl_t *bchanl, W neworder)
459 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
463 if (bchanl->currentsubject == NULL) {
467 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
468 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
470 bchanl_updatesubjectorder(bchanl, neworder, orderby, buf, len);
473 LOCAL VOID bchanl_changesubjectorderby(bchanl_t *bchanl, W neworderby)
475 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
479 if (bchanl->currentsubject == NULL) {
483 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
484 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
486 bchanl_updatesubjectorder(bchanl, order, neworderby, buf, len);
489 LOCAL VOID bchanl_changesubjectfilterword(bchanl_t *bchanl, TC *newstr, W newstr_len)
491 sbjtlayout_t *layout;
493 SUBJECTOPTIONWINDOW_ORDERVALUE_T order;
494 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
498 if (bchanl->currentsubject == NULL) {
502 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
503 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
505 bchanl_updatesubjectorder(bchanl, order, orderby, newstr, newstr_len);
507 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
508 draw = bchanl_subject_getdraw(bchanl->currentsubject);
509 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
510 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
512 layout = bchanl_subject_getlayout(bchanl->currentsubject);
513 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
514 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
517 LOCAL VOID bchanl_sendsubjectrequest(bchanl_t *bchanl, bchanl_subject_t *subject)
520 sbjtlayout_t *layout;
524 W l, t, r, b, title_len, err;
526 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
527 pdsp_msg(bchanl->hmistate.msg_retr_subject);
529 cache = bchanl_subject_getcache(subject);
530 err = sbjtretriever_sendrequest(bchanl->retriever, cache);
532 pdsp_msg(bchanl->hmistate.msg_error_retr);
533 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
538 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
540 subjectoptionwindow_setfiltertext(bchanl->subjectoptionwindow, NULL, 0);
541 err = subjectoptionwindow_setordervalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERVALUE_ASCENDING);
542 subjectoptionwindow_setorderbyvalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER);
544 bchanl_subject_relayout(subject);
546 bchanl_setcurrentsubject(bchanl, subject);
548 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
549 draw = bchanl_subject_getdraw(subject);
550 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
551 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
553 layout = bchanl_subject_getlayout(subject);
554 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
555 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
557 bchanl_subject_gettitle(subject, &title, &title_len);
558 subjectwindow_settitle(bchanl->subjectwindow, title);
561 LOCAL VOID bchanl_bbsmenuwindow_click(bchanl_t *bchanl, PNT pos)
563 bbsmnparser_item_t *item;
564 bchanl_subject_t *subject;
567 W host_len, board_len;
571 fnd = bbsmndraw_findboard(bchanl->bbsmenu.draw, pos, &item);
576 if (item->category != NULL) {
579 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
580 subject = bchanl_subjecthash_search(bchanl->subjecthash, host, host_len, board, board_len);
581 if (subject == NULL) {
582 DP(("not found by subject hash"));
585 bchanl_subject_gettitle(subject, &title, &title_len);
587 bchanl_sendsubjectrequest(bchanl, subject);
590 LOCAL VOID bchanl_bbsmenuwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
599 bchanl_bbsmenuwindow_click(bchanl, evpos);
603 LOCAL W bchanl_bbsmenu_initialize(bchanl_bbsmenu_t *bchanl, GID gid, bchanl_subjecthash_t *subjecthash, LINK *storage)
605 bbsmnretriever_t *retriever;
607 bbsmnparser_t *parser;
608 bbsmnfilter_t *filter;
609 bbsmnlayout_t *layout;
611 extbbslist_t *extbbslist;
614 cache = bbsmncache_new();
618 retriever = bbsmnretriever_new();
619 if (retriever == NULL) {
620 goto error_retriever;
622 parser = bbsmnparser_new(cache);
623 if (parser == NULL) {
626 filter = bbsmnfilter_new();
627 if (filter == NULL) {
630 layout = bbsmnlayout_new(gid);
631 if (layout == NULL) {
634 draw = bbsmndraw_new(layout);
638 extbbslist = extbbslist_new(storage, BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE, BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE);
639 if (extbbslist == NULL) {
640 DP_ER("extbbslist_new", 0);
641 goto error_extbbslist;
643 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_CATE_EXTBBS, (void**)&category_extbbs);
646 bchanl->retriever = retriever;
647 bchanl->cache = cache;
648 bchanl->parser = parser;
649 bchanl->filter = filter;
650 bchanl->layout = layout;
652 bchanl->subjecthash = subjecthash;
653 bchanl->extbbslist = extbbslist;
654 bchanl->editctx = NULL;
655 bchanl->category_extbbs = category_extbbs;
660 bbsmndraw_delete(draw);
662 bbsmnlayout_delete(layout);
664 bbsmnfilter_delete(filter);
666 bbsmnparser_delete(parser);
668 bbsmnretriever_delete(retriever);
670 bbsmncache_delete(cache);
672 return -1; /* TODO */
675 LOCAL W bchanl_bbsmenu_appenditemtohash(bchanl_bbsmenu_t *bchanl, bbsmnparser_item_t *item)
679 W host_len, board_len;
681 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
682 err = bchanl_subjecthash_append(bchanl->subjecthash, host, host_len, board, board_len, item->title, item->title_len);
686 LOCAL VOID bchanl_bbsmenu_registerexternalbbs(bchanl_bbsmenu_t *bchanl, TC *title, W title_len, TC *url, W url_len)
688 extbbslist_editcontext_append(bchanl->editctx, title, title_len, url, url_len);
691 LOCAL VOID bchanl_bbsmenu_relayoutcache(bchanl_bbsmenu_t *bchanl)
694 bbsmnparser_t *parser = bchanl->parser;
695 bbsmnparser_item_t *item;
696 bbsmnfilter_t *filter = bchanl->filter;
697 bbsmnlayout_t *layout = bchanl->layout;
700 err = bbsmnparser_getnextitem(parser, &item);
704 bbsmnfilter_inputitem(filter, item);
706 ret = bbsmnfilter_outputitem(filter, &item);
708 if (item->category == NULL) {
709 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
714 err = bbsmnlayout_appenditem(layout, item);
719 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
723 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
727 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
740 LOCAL VOID bchanl_bbsmenu_relayoutexternal(bchanl_bbsmenu_t *bchanl)
742 W err, ret, category_len, title_len, url_len;
744 TC *category, *title;
746 extbbslist_readcontext_t *ctx;
747 bbsmnparser_t *parser = bchanl->parser;
748 bbsmnparser_item_t *item;
749 bbsmnlayout_t *layout = bchanl->layout;
750 extbbslist_t *list = bchanl->extbbslist;
752 ret = extbbslist_number(bchanl->extbbslist);
757 category = bchanl->category_extbbs;
758 category_len = tc_strlen(category);
759 item = bbsmnparser_newcategoryitem(parser, category, category_len);
763 err = bbsmnlayout_appenditem(layout, item);
768 ctx = extbbslist_startread(list);
773 cont = extbbslist_readcontext_getnext(ctx, &title, &title_len, &url, &url_len);
778 item = bbsmnparser_newboarditem(parser, title, title_len, url, url_len);
782 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
786 err = bbsmnlayout_appenditem(layout, item);
791 extbbslist_endread(list, ctx);
794 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
798 bbsmnlayout_clear(bchanl->layout);
799 bbsmnfilter_clear(bchanl->filter);
800 bbsmnparser_clear(bchanl->parser);
802 bchanl_bbsmenu_relayoutcache(bchanl);
803 bchanl_bbsmenu_relayoutexternal(bchanl);
805 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
806 bbsmenuwindow_setdrawrect(window, l, t, r, b);
808 bbsmenuwindow_requestredisp(window);
811 LOCAL Bool bchanl_registerexternalbbs(bchanl_t *bchanl)
815 W title_len, url_len;
816 TCURL_CHECK_VALID_BBSURL ret;
818 title_len = registerexternalwindow_getboradnametext(bchanl->registerexternalwindow, title, 128);
820 DP_ER("registerexternalwindow_getboradnametext error", title_len);
823 title[title_len] = TNULL;
824 url_len = registerexternalwindow_geturltext(bchanl->registerexternalwindow, url, 255);
826 DP_ER("registerexternalwindow_geturltext error", url_len);
829 url[url_len] = TNULL;
831 ret = tcurl_check_valid_bbsurl(url, url_len);
833 case TCURL_CHECK_VALID_BBSURL_NO_LAST_SLSH:
834 url[url_len+1] = TK_SLSH;
837 case TCURL_CHECK_VALID_BBSURL_OK:
839 case TCURL_CHECK_VALID_BBSURL_INVALID_SCHEME:
840 bchan_panels_urlerror_scheme();
842 case TCURL_CHECK_VALID_BBSURL_INVALID_HOST:
843 bchan_panels_urlerror_host();
845 case TCURL_CHECK_VALID_BBSURL_INVALID_PATH:
846 bchan_panels_urlerror_path();
850 bchanl_bbsmenu_registerexternalbbs(&bchanl->bbsmenu, title, title_len, url, url_len);
852 registerexternalwindow_setboradnametext(bchanl->registerexternalwindow, NULL, 0);
853 registerexternalwindow_seturltext(bchanl->registerexternalwindow, NULL, 0);
855 externalbbswindow_requestredisp(bchanl->externalbbswindow);
860 LOCAL VOID bchanl_externalbbswindow_draw(bchanl_t *bchanl)
865 if (externalbbswindow_startredisp(bchanl->externalbbswindow, &r) == 0) {
868 externalbbswindow_eraseworkarea(bchanl->externalbbswindow, &r);
869 extbbslist_editcontext_draw(bchanl->bbsmenu.editctx, externalbbswindow_getGID(bchanl->externalbbswindow), &r);
870 } while (externalbbswindow_endredisp(bchanl->externalbbswindow) > 0);
873 LOCAL VOID bchanl_externalbbswindow_resize(bchanl_t *bchanl, SIZE newsize)
877 extbbslist_editcontext_getviewrect(bchanl->bbsmenu.editctx, &l, &t, &r, &b);
882 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, l, t, r, b);
883 externalbbswindow_setworkrect(bchanl->externalbbswindow, l, t, r, b);
886 LOCAL VOID bchanl_externalbbswindow_close(bchanl_t *bchanl)
888 Bool changed, save = False;
889 BCHAN_PANELS_SAVECONFIRM_RESULT confirm;
891 changed = extbbslist_editcontext_ischanged(bchanl->bbsmenu.editctx);
892 if (changed != False) {
893 confirm = bchan_panels_saveconfirm();
895 case BCHAN_PANELS_SAVECONFIRM_RESULT_CANCEL:
897 case BCHAN_PANELS_SAVECONFIRM_RESULT_OK_NOSAVE:
900 case BCHAN_PANELS_SAVECONFIRM_RESULT_OK_SAVE:
908 extbbslist_endedit(bchanl->bbsmenu.extbbslist, bchanl->bbsmenu.editctx, save);
909 bchanl->bbsmenu.editctx = NULL;
910 externalbbswindow_close(bchanl->externalbbswindow);
912 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
916 LOCAL VOID bchanl_externalbbswindow_butdn(bchanl_t *bchanl, W type, PNT pos)
921 if (type == W_CLICK) {
922 found = extbbslist_editcontext_finditem(bchanl->bbsmenu.editctx, pos, &sel);
923 if (found != False) {
924 extbbslist_editcontext_setselect(bchanl->bbsmenu.editctx, sel);
926 externalbbswindow_requestredisp(bchanl->externalbbswindow);
930 LOCAL VOID bchanl_externalbbswindow_paste(bchanl_t *bchanl)
932 externalbbswindow_responsepasterequest(bchanl->externalbbswindow, /* NACK */ 1, NULL);
935 LOCAL VOID bchanl_externalbbswindow_scroll(bchanl_t *bchanl, W dh, W dv)
937 extbbslist_editcontext_scrollviewrect(bchanl->bbsmenu.editctx, dh, dv);
938 externalbbswindow_scrollworkarea(bchanl->externalbbswindow, -dh, -dv);
941 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
942 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
944 LOCAL VOID bchanl_retriever_task(W arg)
947 bbsmnretriever_t *retr;
951 bchanl = (bchanl_t*)arg;
952 retr = bchanl->bbsmenu.retriever;
953 cache = bchanl->bbsmenu.cache;
956 DP(("before rcv_mbf %d\n", bchanl->mbfid));
957 err = rcv_mbf(bchanl->mbfid, (VP)&msg, T_FOREVER);
958 DP_ER("rcv_mbf error:",err);
963 err = bbsmnretriever_sendrequest(retr, cache);
966 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
967 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
970 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
971 DP_ER("bbsmnretreiver_request error",err);
979 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
981 if (bchanl->retriever == NULL) {
985 bchanl->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
986 if (bchanl->mbfid < 0) {
987 DP_ER("error cre_mbf:", bchanl->mbfid);
990 bchanl->taskid = cre_tsk(bchanl_retriever_task, -1, (W)bchanl);
991 if (bchanl->taskid < 0) {
992 del_mbf(bchanl->mbfid);
994 DP_ER("error cre_tsk:", bchanl->taskid);
1001 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
1004 static UW lastrequest = 0;
1007 if (bchanl->mbfid < 0) {
1011 err = get_etm(&etime);
1013 DP_ER("get_etm error:", err);
1016 if (lastrequest + 10000 > etime) {
1019 lastrequest = etime;
1021 err = snd_mbf(bchanl->mbfid, &msg, sizeof(W), T_FOREVER);
1023 DP_ER("snd_mbf error:", err);
1027 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
1028 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
1033 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype, LINK *storage)
1035 static RECT r0 = {{400, 100, 700+7, 200+30}};
1036 static RECT r1 = {{100, 100, 300+7, 300+30}};
1037 static RECT r2 = {{400, 300, 800+7, 400+30}};
1038 TC *title0 = NULL, *title1 = NULL;
1044 sbjtretriever_t *retriever;
1046 bchanl_subjecthash_t *subjecthash;
1047 subjectwindow_t *subjectwindow;
1048 bbsmenuwindow_t *bbsmenuwindow;
1049 subjectoptionwindow_t *subjectoptionwindow;
1050 registerexternalwindow_t *registerexternalwindow;
1051 externalbbswindow_t *externalbbswindow;
1053 retriever = sbjtretriever_new();
1054 if (retriever == NULL) {
1055 DP_ER("sbjtretriever_new error", 0);
1056 goto error_retriever;
1058 hmi = bchanlhmi_new();
1060 DP_ER("bchanlhmi_new error", 0);
1061 goto error_bchanlhmi;
1063 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
1064 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, 0, title0, NULL);
1065 if (subjectwindow == NULL) {
1066 DP_ER("bchanlhmi_newsubjectwindow error", 0);
1067 goto error_subjectwindow;
1069 gid = subjectwindow_getGID(subjectwindow);
1070 subjecthash = bchanl_subjecthash_new(gid, 100);
1071 if (subjecthash == NULL) {
1072 DP_ER("bchanl_subjecthash_new error", 0);
1073 goto error_subjecthash;
1075 subjectoptionwindow = bchanlhmi_newsubjectoptionwindow(hmi, &p0, subjectwindow, NULL, NULL, BCHANL_DBX_TB_SBJTOPT_FLT, BCHANL_DBX_WS_SBJTOPT_ODR, BCHANL_DBX_WS_SBJTOPT_ODRBY);
1076 if (subjectoptionwindow == NULL) {
1077 DP_ER("bchanlhmi_newsubjectoptionwindow", 0);
1078 goto error_subjectoptionwindow;
1080 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
1081 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, 0, title1, NULL);
1082 if (bbsmenuwindow == NULL) {
1083 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
1084 goto error_bbsmenuwindow;
1086 gid = bbsmenuwindow_getGID(bbsmenuwindow);
1087 registerexternalwindow = bchanlhmi_newregisterexternalwindow(hmi, &p0, 0, NULL, NULL);
1088 if (registerexternalwindow == NULL) {
1089 DP_ER("bchanlhmi_newregisterexternalwindow error", 0);
1090 goto error_registerexternalwindow;
1092 externalbbswindow = bchanlhmi_newexternalbbswindow(hmi, &r2, 0, NULL, NULL);
1093 if (externalbbswindow == NULL) {
1094 DP_ER("bchanlhmi_newexternalbbswindow", 0);
1095 goto error_externalbbswindow;
1097 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash, storage);
1099 DP_ER("bchanl_bbsmenu_initialize error", err);
1102 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
1104 DP_ER("bchanl_mainmenu_initialize %d", err);
1105 goto error_mainmenu;
1108 bchanl_hmistate_initialize(&bchanl->hmistate);
1110 if (exectype == EXECREQ) {
1111 wid = bbsmenuwindow_getWID(bbsmenuwindow);
1115 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
1116 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
1117 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1119 bchanl->retriever = retriever;
1120 bchanl->subjecthash = subjecthash;
1122 bchanl->currentsubject = NULL;
1125 bchanl->exectype = exectype;
1128 bchanl->subjectwindow = subjectwindow;
1129 bchanl->bbsmenuwindow = bbsmenuwindow;
1130 bchanl->subjectoptionwindow = subjectoptionwindow;
1131 bchanl->registerexternalwindow = registerexternalwindow;
1132 bchanl->externalbbswindow = externalbbswindow;
1137 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
1139 bchanlhmi_deleteexternalbbswindow(hmi, externalbbswindow);
1140 error_externalbbswindow:
1141 bchanlhmi_deleteregisterexternalwindow(hmi, registerexternalwindow);
1142 error_registerexternalwindow:
1143 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
1144 error_bbsmenuwindow:
1145 bchanlhmi_deletesubjectoptionwindow(hmi, subjectoptionwindow);
1146 error_subjectoptionwindow:
1147 bchanl_subjecthash_delete(subjecthash);
1149 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
1150 error_subjectwindow:
1151 bchanlhmi_delete(hmi);
1153 sbjtretriever_delete(retriever);
1155 return -1; /* TODO */
1158 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
1160 gset_ptr(PS_BUSY, NULL, -1, -1);
1163 if (bchanl->exectype == EXECREQ) {
1164 oend_prc(bchanl->vid, NULL, 0);
1166 bchanl_mainmenu_finalize(&bchanl->mainmenu);
1167 bchanlhmi_deleteexternalbbswindow(bchanl->hmi, bchanl->externalbbswindow);
1168 bchanlhmi_deleteregisterexternalwindow(bchanl->hmi, bchanl->registerexternalwindow);
1169 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
1170 bchanlhmi_deletesubjectoptionwindow(bchanl->hmi, bchanl->subjectoptionwindow);
1171 bchanl_subjecthash_delete(bchanl->subjecthash);
1172 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
1173 bchanlhmi_delete(bchanl->hmi);
1174 sbjtretriever_delete(bchanl->retriever);
1179 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
1181 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};
1186 bbsmncache_t *cache = bchanl->cache;
1187 bbsmndraw_t *draw = bchanl->draw;
1189 err = get_lnk(fname, &lnk, F_NORM);
1191 DP_ER("error get_lnk", err);
1194 fd = opn_fil(&lnk, F_READ, NULL);
1198 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
1208 err = rea_rec(fd, 0, bin, len, 0, NULL);
1216 bbsmncache_appenddata(cache, bin, len);
1219 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1221 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
1222 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1223 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
1226 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1228 W l,t,r,b,l1,t1,r1,b1,scr;
1229 sbjtlayout_t *layout;
1232 if (bchanl->currentsubject == NULL) {
1235 draw = bchanl_subject_getdraw(bchanl->currentsubject);
1239 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1245 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1246 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1249 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1250 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1251 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1258 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1259 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1263 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1264 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1265 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1272 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1273 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1277 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1283 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1284 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1287 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1293 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1294 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1297 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1298 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1299 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1300 if (b + (b - t) > b1) {
1306 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1307 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1311 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1312 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1313 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1314 if (r + (r - l) > r1) {
1320 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1321 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1325 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1331 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1332 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1334 case TK_E: /* temporary */
1335 if (stat & ES_CMD) {
1336 bchanl_killme(bchanl);
1342 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1344 W l,t,r,b,l1,t1,r1,b1,scr;
1345 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
1346 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
1350 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1356 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1357 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1360 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1361 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1368 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1369 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1376 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1382 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1383 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1386 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1387 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1388 if (b + (b - t) > b1) {
1394 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1395 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1402 bchanl_networkrequest_bbsmenu(bchanl);
1404 case TK_E: /* temporary */
1405 if (stat & ES_CMD) {
1406 bchanl_killme(bchanl);
1413 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1417 act = subjectwindow_isactive(bchanl->subjectwindow);
1419 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1422 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1424 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1429 enum BCHANL_TEXTBOX_MENU_TYPE_ {
1430 BCHANL_TEXTBOX_MENU_TYPE_NONE,
1431 BCHANL_TEXTBOX_MENU_TYPE_FILTER,
1432 BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE,
1433 BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL,
1435 typedef enum BCHANL_TEXTBOX_MENU_TYPE_ BCHANL_TEXTBOX_MENU_TYPE;
1437 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl, BCHANL_TEXTBOX_MENU_TYPE type)
1439 Bool isopen, isopen_extbbs, selected = False, fromtray, totray, trayempty;
1442 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1443 isopen_extbbs = externalbbswindow_isopen(bchanl->externalbbswindow);
1444 if (isopen_extbbs != False) {
1445 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1451 case BCHANL_TEXTBOX_MENU_TYPE_NONE:
1453 fromtray = totray = False;
1455 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1456 trayempty = tray_isempty();
1457 if (trayempty == False) {
1462 num = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, NULL, 0, False);
1469 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1470 trayempty = tray_isempty();
1471 if (trayempty == False) {
1476 num = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, NULL, 0, False);
1483 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1484 trayempty = tray_isempty();
1485 if (trayempty == False) {
1490 num = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, NULL, 0, False);
1499 bchanl_mainmenu_setup(&bchanl->mainmenu, isopen, isopen_extbbs, selected, fromtray, totray);
1502 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel, BCHANL_TEXTBOX_MENU_TYPE type)
1506 #define BCHANL_SELECTMENU_STRBUF_LENGTH 256
1507 TC str[BCHANL_SELECTMENU_STRBUF_LENGTH];
1511 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1512 bchanl_killme(bchanl);
1514 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1515 subjectwindow_requestredisp(bchanl->subjectwindow);
1516 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1518 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1519 bchanl_networkrequest_bbsmenu(bchanl);
1521 case BCHANL_MAINMENU_SELECT_SUBJECTOPTION: /* [¥¹¥ì°ìÍ÷ÀßÄê] */
1522 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1523 if (isopen == False) {
1524 subjectoptionwindow_open(bchanl->subjectoptionwindow);
1526 subjectoptionwindow_close(bchanl->subjectoptionwindow);
1529 case BCHANL_MAINMENU_SELECT_EXTBBS_MANAGER: /* [³°ÉôÈĤÎÄɲÃ] */
1530 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1531 if (isopen == False) {
1533 bchanl->bbsmenu.editctx = extbbslist_startedit(bchanl->bbsmenu.extbbslist);
1534 if (bchanl->bbsmenu.editctx == NULL) {
1537 externalbbswindow_open(bchanl->externalbbswindow);
1538 externalbbswindow_getworkrect(bchanl->externalbbswindow, &work);
1539 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1540 externalbbswindow_setworkrect(bchanl->externalbbswindow, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1543 case BCHANL_MAINMENU_SELECT_EXTBBS_REGISTER:
1544 isopen = registerexternalwindow_isopen(bchanl->registerexternalwindow);
1545 if (isopen == False) {
1546 registerexternalwindow_open(bchanl->registerexternalwindow);
1549 case BCHANL_MAINMENU_SELECT_EXTBBS_UP:
1550 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1551 if (isopen != False) {
1552 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1556 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index-1, index);
1557 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1560 case BCHANL_MAINMENU_SELECT_EXTBBS_DOWN:
1561 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1562 if (isopen != False) {
1563 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1567 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index, index+1);
1568 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1571 case BCHANL_MAINMENU_SELECT_EXTBBS_DELETE:
1572 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1573 if (isopen != False) {
1574 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1578 extbbslist_editcontext_deleteitem(bchanl->bbsmenu.editctx, index);
1579 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1582 case BCHANL_MAINMENU_SELECT_EDIT_COPY_TO_TRAY:
1584 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1585 len = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1587 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1588 len = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1590 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1591 len = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1597 tray_pushstring(str, len);
1600 case BCHANL_MAINMENU_SELECT_EDIT_COPY_FROM_TRAY:
1601 len = tray_popstring(str, BCHANL_SELECTMENU_STRBUF_LENGTH);
1603 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1604 subjectoptionwindow_insertfiltertext(bchanl->subjectoptionwindow, str, len);
1606 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1607 registerexternalwindow_insertboradnametext(bchanl->registerexternalwindow, str, len);
1609 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1610 registerexternalwindow_inserturltext(bchanl->registerexternalwindow, str, len);
1616 case BCHANL_MAINMENU_SELECT_EDIT_MOVE_TO_TRAY:
1618 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1619 len = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1621 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1622 len = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1624 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1625 len = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1631 tray_pushstring(str, len);
1634 case BCHANL_MAINMENU_SELECT_EDIT_MOVE_FROM_TRAY:
1635 len = tray_popstring(str, BCHANL_SELECTMENU_STRBUF_LENGTH);
1637 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1638 subjectoptionwindow_insertfiltertext(bchanl->subjectoptionwindow, str, len);
1640 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1641 registerexternalwindow_insertboradnametext(bchanl->registerexternalwindow, str, len);
1643 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1644 registerexternalwindow_inserturltext(bchanl->registerexternalwindow, str, len);
1651 case BCHANL_MAINMENU_SELECT_EDIT_DELETE:
1653 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1654 subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1656 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1657 registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1659 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1660 registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1670 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos, BCHANL_TEXTBOX_MENU_TYPE type)
1673 bchanl_setupmenu(bchanl, type);
1674 gset_ptr(PS_SELECT, NULL, -1, -1);
1675 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1677 bchanl_selectmenu(bchanl, sel, type);
1681 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode, BCHANL_TEXTBOX_MENU_TYPE type)
1684 bchanl_setupmenu(bchanl, type);
1685 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1687 bchanl_selectmenu(bchanl, sel, type);
1692 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1695 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1696 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1697 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1700 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1701 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1707 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1709 bchanlhmievent_t *evt;
1713 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1718 switch (evt->type) {
1719 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1721 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1722 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1723 bchanl_setupmenu(bchanl, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1724 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1726 bchanl_selectmenu(bchanl, sel, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1730 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1732 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
1733 bchanl_popupmenu(bchanl, evt->data.common_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1735 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
1736 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
1738 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_DRAW:
1739 bchanl_subjectwindow_draw(bchanl);
1741 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_RESIZE:
1742 bchanl_subjectwindow_resize(bchanl, evt->data.subjectwindow_resize.work_sz);
1744 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_CLOSE:
1745 bchanl_subjectwindow_close(bchanl);
1747 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_BUTDN:
1748 bchanl_subjectwindow_butdn(bchanl, evt->data.subjectwindow_butdn.type, evt->data.subjectwindow_butdn.pos);
1750 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_PASTE:
1751 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
1753 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_MOUSEMOVE:
1754 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1756 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_SCROLL:
1757 bchanl_subjectwindow_scroll(bchanl, evt->data.subjectwindow_scroll.dh, evt->data.subjectwindow_scroll.dv);
1759 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_DRAW:
1760 bchanl_bbsmenuwindow_draw(bchanl);
1762 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_RESIZE:
1763 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenuwindow_resize.work_sz);
1765 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_CLOSE:
1766 bchanl_bbsmenuwindow_close(bchanl);
1768 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_BUTDN:
1769 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenuwindow_butdn.type, evt->data.bbsmenuwindow_butdn.pos);
1771 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_MOUSEMOVE:
1772 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1774 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_SCROLL:
1775 bchanl_bbsmenuwindow_scroll(bchanl, evt->data.bbsmenuwindow_scroll.dh, evt->data.bbsmenuwindow_scroll.dv);
1777 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_DETERMINE:
1778 bchanl_changesubjectfilterword(bchanl, evt->data.subjectoptionwindow_filter_determine.value, evt->data.subjectoptionwindow_filter_determine.len);
1780 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_COPY:
1782 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MOVE:
1784 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MENU:
1785 bchanl_popupmenu(bchanl, evt->data.subjectoptionwindow_filter_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_FILTER);
1787 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_KEYMENU:
1788 bchanl_keyselect(bchanl, evt->data.subjectoptionwindow_filter_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_FILTER);
1790 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDER_CHANGE:
1791 bchanl_changesubjectorder(bchanl, evt->data.subjectoptionwindow_order_change.value);
1793 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDERBY_CHANGE:
1794 bchanl_changesubjectorderby(bchanl, evt->data.subjectoptionwindow_order_change.value);
1796 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_DETERMINE:
1798 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_COPY:
1800 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MOVE:
1802 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MENU:
1803 bchanl_popupmenu(bchanl, evt->data.registerexternalwindow_boradname_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE);
1805 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_KEYMENU:
1806 bchanl_keyselect(bchanl, evt->data.registerexternalwindow_boradname_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE);
1808 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_DETERMINE:
1810 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_COPY:
1812 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MOVE:
1814 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MENU:
1815 bchanl_popupmenu(bchanl, evt->data.registerexternalwindow_url_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL);
1817 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_KEYMENU:
1818 bchanl_keyselect(bchanl, evt->data.registerexternalwindow_url_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL);
1820 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_DETERMINE_PUSH:
1821 close = bchanl_registerexternalbbs(bchanl);
1822 if (close != False) {
1823 registerexternalwindow_close(bchanl->registerexternalwindow);
1826 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_CANCEL_PUSH:
1827 registerexternalwindow_close(bchanl->registerexternalwindow);
1829 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_DRAW:
1830 bchanl_externalbbswindow_draw(bchanl);
1832 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_RESIZE:
1834 bchanl_externalbbswindow_resize(bchanl, evt->data.externalbbswindow_resize.work_sz);
1835 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_CLOSE:
1836 bchanl_externalbbswindow_close(bchanl);
1838 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_BUTDN:
1839 bchanl_externalbbswindow_butdn(bchanl, evt->data.externalbbswindow_butdn.type, evt->data.externalbbswindow_butdn.pos);
1841 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_PASTE:
1842 bchanl_externalbbswindow_paste(bchanl);
1844 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_SCROLL:
1845 bchanl_externalbbswindow_scroll(bchanl, evt->data.externalbbswindow_scroll.dh, evt->data.externalbbswindow_scroll.dv);
1847 case BCHANLHMIEVENT_TYPE_NONE:
1851 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};
1852 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};
1853 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};
1855 LOCAL W main_CLI_args(VID *vid, LINK *storage)
1861 err = get_lnk(filename_dbg_databox, &dbx, F_NORM);
1863 DP_ER("get_lnk:test databox error", err);
1866 err = dopn_dat(&dbx);
1868 DP_ER("dopn_dat error", err);
1871 err = get_lnk(filename_dbg_storage, storage, F_NORM);
1873 DP_ER("get_lnk;commonstorage error", err);
1880 LOCAL W main_EXECREC_args(M_EXECREQ *msg, VID *vid, LINK *storage)
1885 err = dopn_dat(&msg->self);
1887 DP_ER("dopn_dat", err);
1892 err = get_lnk(filename_storage, &lnk, F_BASED);
1894 DP_ER("get_lnk;commonstorage error", err);
1904 typedef struct _arg {
1909 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1916 len = src->msg_size / sizeof(TC);
1917 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1920 if(str[i] == TK_KSP){
1926 if(str[i] == TK_KSP){
1933 argv = (TC**)malloc(sizeof(TC*)*ac);
1937 if(str[i] == TNULL){
1943 if(str[i] == TNULL){
1956 EXPORT W MAIN(MESSAGE *msg)
1964 err = dopn_dat(NULL);
1966 DP_ER("dopn_dat error:", err);
1970 switch (msg->msg_type) {
1972 arg = MESSAGEtoargv(msg);
1973 err = main_CLI_args(&vid, &storage);
1979 oend_req(((M_DISPREQ*)msg)->vid, -1);
1983 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1987 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
1990 err = main_EXECREC_args((M_EXECREQ*)msg, &vid, &storage);
2000 err = bchanl_initialize(&bchanl, vid, msg->msg_type, &storage);
2002 DP_ER("bchanl_initialize error", err);
2005 err = bchanl_prepare_network(&bchanl);
2007 DP_ER("bchanl_prepare_network error", err);
2008 bchanl_killme(&bchanl);
2012 if (msg->msg_type == 0) {
2013 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
2014 } else if (msg->msg_type == EXECREQ) {
2015 bchanl_networkrequest_bbsmenu(&bchanl);
2018 subjectwindow_requestredisp(bchanl.subjectwindow);
2019 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
2022 bchanl_eventdispatch(&bchanl);