4 * Copyright (c) 2009-2015 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 #include <http/http_connector.h>
63 #ifdef BCHANL_CONFIG_DEBUG
64 # define DP(arg) printf arg
65 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
68 # define DP_ER(msg, err) /**/
71 #define BCHANL_DBX_MENU_TEST 20
72 #define BCHANL_DBX_TEXT_MLIST0 21
73 #define BCHANL_DBX_TEXT_MLIST1 22
74 #define BCHANL_DBX_TEXT_MLIST2 23
75 #define BCHANL_DBX_VIEWER_FUSEN 24
76 #define BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU 25
77 #define BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT 26
78 #define BCHANL_DBX_TEXT_MSG_RETRBBSMENU 27
79 #define BCHANL_DBX_TEXT_MSG_RETRSUBJECT 28
80 #define BCHANL_DBX_TEXT_MSG_ERRRETR 29
81 #define BCHANL_DBX_TB_SBJTOPT_FLT 30
82 #define BCHANL_DBX_WS_SBJTOPT_ODR 31
83 #define BCHANL_DBX_WS_SBJTOPT_ODRBY 32
84 #define BCHANL_DBX_TEXT_CATE_EXTBBS 33
86 #define BCHANL_MENU_WINDOW 3
88 #define BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE 30
89 #define BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE 1
91 LOCAL UB bchanl_httpheader_useragent[] = "Monazilla/1.00 (bchanl/0.201)";
92 LOCAL W bchanl_httpheader_useragent_len = sizeof(bchanl_httpheader_useragent) - 1;
94 typedef struct bchanl_hmistate_t_ bchanl_hmistate_t;
95 struct bchanl_hmistate_t_ {
103 LOCAL VOID bchanl_hmistate_updateptrstyle(bchanl_hmistate_t *hmistate, PTRSTL ptr)
105 if (hmistate->ptr == ptr) {
109 gset_ptr(hmistate->ptr, NULL, -1, -1);
112 LOCAL VOID bchanl_hmistate_initialize(bchanl_hmistate_t *hmistate)
116 hmistate->ptr = PS_SELECT;
118 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRBBSMENU, (void**)&hmistate->msg_retr_bbsmenu);
120 DP_ER("dget_dtp: message retrieving error", err);
121 hmistate->msg_retr_bbsmenu = NULL;
123 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRSUBJECT, (void**)&hmistate->msg_retr_subject);
125 DP_ER("dget_dtp: message not modified error", err);
126 hmistate->msg_retr_subject = NULL;
128 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_ERRRETR, (void**)&hmistate->msg_error_retr);
130 DP_ER("dget_dtp: message retrieve error error", err);
131 hmistate->msg_error_retr = NULL;
135 typedef struct bchanl_bbsmenu_t_ bchanl_bbsmenu_t;
136 struct bchanl_bbsmenu_t_ {
139 bbsmnretriever_t *retriever;
141 bbsmnparser_t *parser;
142 bbsmnfilter_t *filter;
143 bbsmnlayout_t *layout;
146 bchanl_subjecthash_t *subjecthash;
147 extbbslist_t *extbbslist;
148 extbbslist_editcontext_t *editctx;
152 #define BCHANL_NETWORK_FLAG_WAITHTTPEVENT 0x00000001
156 W flgid; /* for reduce TMOUT message sending. */
158 bchanl_mainmenu_t mainmenu;
162 bchanl_hmistate_t hmistate;
164 http_connector_t *connector;
166 sbjtretriever_t *retriever;
168 bchanl_subjecthash_t *subjecthash;
169 bchanl_bbsmenu_t bbsmenu;
170 bchanl_subject_t *currentsubject;
171 bchanl_subject_t *nextsubject;
179 subjectwindow_t *subjectwindow;
180 bbsmenuwindow_t *bbsmenuwindow;
181 subjectoptionwindow_t *subjectoptionwindow;
182 registerexternalwindow_t *registerexternalwindow;
183 externalbbswindow_t *externalbbswindow;
185 typedef struct bchanl_t_ bchanl_t;
187 LOCAL VOID bchanl_swapresnumberdisplay(bchanl_t *bchanl)
189 if (bchanl->subjectdisplay.resnum != False) {
190 bchanl->subjectdisplay.resnum = False;
192 bchanl->subjectdisplay.resnum = True;
196 LOCAL VOID bchanl_swapsincedisplay(bchanl_t *bchanl)
198 if (bchanl->subjectdisplay.since != False) {
199 bchanl->subjectdisplay.since = False;
201 bchanl->subjectdisplay.since = True;
205 LOCAL VOID bchanl_swapvigordisplay(bchanl_t *bchanl)
207 if (bchanl->subjectdisplay.vigor != False) {
208 bchanl->subjectdisplay.vigor = False;
210 bchanl->subjectdisplay.vigor = True;
214 LOCAL VOID bchanl_killme(bchanl_t *bchanl);
216 LOCAL VOID bchanl_subjectwindow_draw(bchanl_t *bchanl)
220 if (bchanl->currentsubject == NULL) {
222 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
225 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
226 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
228 draw = bchanl_subject_getdraw(bchanl->currentsubject);
230 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
233 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
234 sbjtdraw_draw(draw, &r);
235 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
239 LOCAL VOID bchanl_subjectwindow_scroll(bchanl_t *bchanl, W dh, W dv)
242 if (bchanl->currentsubject == NULL) {
245 draw = bchanl_subject_getdraw(bchanl->currentsubject);
246 sbjtdraw_scrollviewrect(draw, dh, dv);
247 subjectwindow_scrollworkarea(bchanl->subjectwindow, -dh, -dv);
248 bchanl_subjectwindow_draw(bchanl);
251 LOCAL VOID bchanl_subjectwindow_resize(bchanl_t *bchanl, SIZE newsize)
256 if (bchanl->currentsubject == NULL) {
259 draw = bchanl_subject_getdraw(bchanl->currentsubject);
261 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
266 sbjtdraw_setviewrect(draw, l, t, r, b);
267 subjectwindow_setworkrect(bchanl->subjectwindow, l, t, r, b);
269 bchanl_subjectwindow_draw(bchanl);
272 LOCAL VOID bchanl_subjectwindow_close(bchanl_t *bchanl)
274 bchanl_killme(bchanl);
277 LOCAL VOID bchanl_subjectwindow_press(bchanl_t *bchanl, PNT evpos)
279 sbjtlist_tuple_t *tuple;
282 W event_type, size, err, fsn_len, dx, dy;
285 PNT pos, p1, pos_butup;
292 if (bchanl->currentsubject == NULL) {
295 draw = bchanl_subject_getdraw(bchanl->currentsubject);
297 err = sbjtdraw_findthread(draw, evpos, &tuple, &vframe);
302 gid = subjectwindow_startdrag(bchanl->subjectwindow);
304 DP_ER("wsta_drg error:", gid);
311 dx = vframe.c.left - evpos.x;
312 dy = vframe.c.top - evpos.y;
316 sel.rgn.r.c.left = vframe.c.left;
317 sel.rgn.r.c.top = vframe.c.top;
318 sel.rgn.r.c.right = vframe.c.right;
319 sel.rgn.r.c.bottom = vframe.c.bottom;
320 adsp_sel(gid, &sel, 1);
322 gset_ptr(PS_GRIP, NULL, -1, -1);
324 event_type = subjectwindow_getdrag(bchanl->subjectwindow, &pos, &wid_butup, &pos_butup);
325 if (event_type == EV_BUTUP) {
328 if (event_type != EV_NULL) {
331 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
334 adsp_sel(gid, &sel, 0);
335 sel.rgn.r.c.left += pos.x - p1.x;
336 sel.rgn.r.c.top += pos.y - p1.y;
337 sel.rgn.r.c.right += pos.x - p1.x;
338 sel.rgn.r.c.bottom += pos.y - p1.y;
339 adsp_sel(gid, &sel, 1);
342 gset_ptr(PS_SELECT, NULL, -1, -1);
343 adsp_sel(gid, &sel, 0);
344 subjectwindow_enddrag(bchanl->subjectwindow);
346 /* BUTUP on self window or no window or system message panel */
347 if ((wid_butup == subjectwindow_getWID(bchanl->subjectwindow))||(wid_butup == 0)||(wid_butup == -1)) {
351 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
356 err = dget_dtp(64, BCHANL_DBX_VIEWER_FUSEN, (void**)&fsn);
358 DP_ER("dget_dtp: ", err);
361 fsn_len = dget_siz((B*)fsn);
362 err = bchanl_subject_createviewervobj(bchanl->currentsubject, tuple, fsn, fsn_len, &vrec.vseg, (LINK*)&vrec.vlnk);
364 DP_ER("bchanl_subject_createviewervobj error", err);
367 if (err == BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED) {
373 tr_rec.len = sizeof(TR_VOBJREC);
374 tr_rec.dt = (B*)&vrec;
375 err = tset_dat(&tr_rec, 1);
377 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
379 DP_ER("error del_fil:", err);
384 paste_ev.r.type = EV_REQUEST;
385 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
386 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
387 paste_ev.r.cmd = W_PASTE;
388 paste_ev.r.wid = wid_butup;
389 err = wsnd_evt(&paste_ev);
392 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
394 DP_ER("error del_fil:", err);
398 err = wwai_rsp(NULL, W_PASTE, 60000);
401 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
403 DP_ER("error del_fil:", err);
407 wswi_wnd(wid_butup, NULL);
410 LOCAL VOID bchanl_subjectwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
419 bchanl_subjectwindow_press(bchanl, evpos);
423 LOCAL VOID bchanl_setcurrentsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
425 bchanl->currentsubject = sbjt;
426 bchanl_subject_setresnumberdisplay(sbjt, bchanl->subjectdisplay.resnum);
427 bchanl_subject_setsincedisplay(sbjt, bchanl->subjectdisplay.since);
428 bchanl_subject_setvigordisplay(sbjt, bchanl->subjectdisplay.vigor);
429 subjectwindow_requestredisp(bchanl->subjectwindow);
432 LOCAL VOID bchanl_setnextsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
434 bchanl->nextsubject = sbjt;
437 LOCAL VOID bchanl_bbsmenuwindow_draw(bchanl_t *bchanl)
441 if (bbsmenuwindow_startredisp(bchanl->bbsmenuwindow, &r) == 0) {
444 bbsmenuwindow_eraseworkarea(bchanl->bbsmenuwindow, &r);
445 bbsmndraw_draw(bchanl->bbsmenu.draw, &r);
446 } while (bbsmenuwindow_endredisp(bchanl->bbsmenuwindow) > 0);
449 LOCAL VOID bchanl_bbsmenuwindow_scroll(bchanl_t *bchanl, W dh, W dv)
451 bbsmndraw_scrollviewrect(bchanl->bbsmenu.draw, dh, dv);
452 bbsmenuwindow_scrollworkarea(bchanl->bbsmenuwindow, -dh, -dv);
453 bchanl_bbsmenuwindow_draw(bchanl);
456 LOCAL VOID bchanl_bbsmenuwindow_resize(bchanl_t *bchanl, SIZE newsize)
460 bbsmndraw_getviewrect(bchanl->bbsmenu.draw, &l, &t, &r, &b);
465 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, l, t, r, b);
466 bbsmenuwindow_setworkrect(bchanl->bbsmenuwindow, l, t, r, b);
468 bchanl_bbsmenuwindow_draw(bchanl);
471 LOCAL VOID bchanl_bbsmenuwindow_close(bchanl_t *bchanl)
473 bchanl_killme(bchanl);
476 LOCAL VOID bchanl_updatesubjectorder(bchanl_t *bchanl, SUBJECTOPTIONWINDOW_ORDERVALUE_T order, SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby, TC *filterword, W filterword_len)
481 if (order == SUBJECTOPTIONWINDOW_ORDERVALUE_DESCENDING) {
487 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER:
489 sbjt_orderby = BCHANL_SUBJECT_SORTBY_NUMBER;
491 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_RES:
492 sbjt_orderby = BCHANL_SUBJECT_SORTBY_RES;
494 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_SINCE:
495 sbjt_orderby = BCHANL_SUBJECT_SORTBY_SINCE;
497 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_VIGOR:
498 sbjt_orderby = BCHANL_SUBJECT_SORTBY_VIGOR;
502 bchanl_subject_reorder(bchanl->currentsubject, filterword, filterword_len, sbjt_orderby, descending);
504 subjectwindow_requestredisp(bchanl->subjectwindow);
507 LOCAL VOID bchanl_changesubjectorder(bchanl_t *bchanl, W neworder)
509 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
513 if (bchanl->currentsubject == NULL) {
517 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
518 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
520 bchanl_updatesubjectorder(bchanl, neworder, orderby, buf, len);
523 LOCAL VOID bchanl_changesubjectorderby(bchanl_t *bchanl, W neworderby)
525 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
529 if (bchanl->currentsubject == NULL) {
533 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
534 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
536 bchanl_updatesubjectorder(bchanl, order, neworderby, buf, len);
539 LOCAL VOID bchanl_changesubjectfilterword(bchanl_t *bchanl, TC *newstr, W newstr_len)
541 sbjtlayout_t *layout;
543 SUBJECTOPTIONWINDOW_ORDERVALUE_T order;
544 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
548 if (bchanl->currentsubject == NULL) {
552 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
553 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
555 bchanl_updatesubjectorder(bchanl, order, orderby, newstr, newstr_len);
557 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
558 draw = bchanl_subject_getdraw(bchanl->currentsubject);
559 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
560 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
562 layout = bchanl_subject_getlayout(bchanl->currentsubject);
563 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
564 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
567 LOCAL VOID bchanl_changedisplayattribute(bchanl_t *bchanl)
569 sbjtlayout_t *layout;
570 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
571 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
576 if (bchanl->currentsubject == NULL) {
580 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
581 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
582 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
584 bchanl_updatesubjectorder(bchanl, order, orderby, buf, len);
586 layout = bchanl_subject_getlayout(bchanl->currentsubject);
587 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
588 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
591 LOCAL VOID bchanl_sendsubjectrequest(bchanl_t *bchanl, bchanl_subject_t *subject)
596 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
597 pdsp_msg(bchanl->hmistate.msg_retr_subject);
599 cache = bchanl_subject_getcache(subject);
600 err = sbjtretriever_sendrequest(bchanl->retriever, cache);
602 pdsp_msg(bchanl->hmistate.msg_error_retr);
603 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
606 bchanl_setnextsubject(bchanl, subject);
607 set_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT);
610 LOCAL VOID bchanl_bbsmenuwindow_click(bchanl_t *bchanl, PNT pos)
612 bbsmnparser_item_t *item;
613 bchanl_subject_t *subject;
616 W host_len, board_len;
621 fnd = bbsmndraw_findboard(bchanl->bbsmenu.draw, pos, &item);
626 if (item->category != NULL) {
629 bbsmnparser_item_gethostboard(item, &host, &host_len, &port, &board, &board_len);
630 subject = bchanl_subjecthash_search(bchanl->subjecthash, host, host_len, port, board, board_len);
631 if (subject == NULL) {
632 DP(("not found by subject hash"));
635 bchanl_subject_gettitle(subject, &title, &title_len);
637 bchanl_sendsubjectrequest(bchanl, subject);
640 LOCAL VOID bchanl_bbsmenuwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
649 bchanl_bbsmenuwindow_click(bchanl, evpos);
653 LOCAL W bchanl_bbsmenu_initialize(bchanl_bbsmenu_t *bchanl, GID gid, bchanl_subjecthash_t *subjecthash, LINK *storage, http_connector_t *connector)
655 bbsmnretriever_t *retriever;
657 bbsmnparser_t *parser;
658 bbsmnfilter_t *filter;
659 bbsmnlayout_t *layout;
661 extbbslist_t *extbbslist;
665 cache = bbsmncache_new();
669 retriever = bbsmnretriever_new(connector, bchanl_httpheader_useragent, bchanl_httpheader_useragent_len);
670 if (retriever == NULL) {
671 goto error_retriever;
673 parser = bbsmnparser_new(cache);
674 if (parser == NULL) {
677 filter = bbsmnfilter_new();
678 if (filter == NULL) {
681 layout = bbsmnlayout_new(gid);
682 if (layout == NULL) {
685 draw = bbsmndraw_new(layout);
689 extbbslist = extbbslist_new(storage, BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE, BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE);
690 if (extbbslist == NULL) {
691 DP_ER("extbbslist_new", 0);
692 goto error_extbbslist;
694 err = extbbslist_readfile(extbbslist);
696 DP_ER("extbbslist_readfile", 0);
697 goto error_extbbslist_readfile;
699 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_CATE_EXTBBS, (void**)&category_extbbs);
702 bchanl->retriever = retriever;
703 bchanl->cache = cache;
704 bchanl->parser = parser;
705 bchanl->filter = filter;
706 bchanl->layout = layout;
708 bchanl->subjecthash = subjecthash;
709 bchanl->extbbslist = extbbslist;
710 bchanl->editctx = NULL;
711 bchanl->category_extbbs = category_extbbs;
715 error_extbbslist_readfile:
716 extbbslist_delete(extbbslist);
718 bbsmndraw_delete(draw);
720 bbsmnlayout_delete(layout);
722 bbsmnfilter_delete(filter);
724 bbsmnparser_delete(parser);
726 bbsmnretriever_delete(retriever);
728 bbsmncache_delete(cache);
730 return -1; /* TODO */
733 LOCAL W bchanl_bbsmenu_appenditemtohash(bchanl_bbsmenu_t *bchanl, bbsmnparser_item_t *item)
737 W host_len, board_len;
740 bbsmnparser_item_gethostboard(item, &host, &host_len, &port, &board, &board_len);
741 err = bchanl_subjecthash_append(bchanl->subjecthash, host, host_len, port, board, board_len, item->title, item->title_len);
745 LOCAL VOID bchanl_bbsmenu_registerexternalbbs(bchanl_bbsmenu_t *bchanl, TC *title, W title_len, TC *url, W url_len)
747 extbbslist_editcontext_append(bchanl->editctx, title, title_len, url, url_len);
750 LOCAL VOID bchanl_bbsmenu_relayoutcache(bchanl_bbsmenu_t *bchanl)
753 bbsmnparser_t *parser = bchanl->parser;
754 bbsmnparser_item_t *item;
755 bbsmnfilter_t *filter = bchanl->filter;
756 bbsmnlayout_t *layout = bchanl->layout;
759 err = bbsmnparser_getnextitem(parser, &item);
763 bbsmnfilter_inputitem(filter, item);
765 ret = bbsmnfilter_outputitem(filter, &item);
767 if (item->category == NULL) {
768 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
773 err = bbsmnlayout_appenditem(layout, item);
778 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
782 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
786 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
799 LOCAL VOID bchanl_bbsmenu_relayoutexternal(bchanl_bbsmenu_t *bchanl)
801 W err, ret, category_len, title_len, url_len;
803 TC *category, *title;
805 extbbslist_readcontext_t *ctx;
806 bbsmnparser_t *parser = bchanl->parser;
807 bbsmnparser_item_t *item;
808 bbsmnlayout_t *layout = bchanl->layout;
809 extbbslist_t *list = bchanl->extbbslist;
811 ret = extbbslist_number(bchanl->extbbslist);
816 category = bchanl->category_extbbs;
817 category_len = tc_strlen(category);
818 item = bbsmnparser_newcategoryitem(parser, category, category_len);
822 err = bbsmnlayout_appenditem(layout, item);
827 ctx = extbbslist_startread(list);
832 cont = extbbslist_readcontext_getnext(ctx, &title, &title_len, &url, &url_len);
837 item = bbsmnparser_newboarditem(parser, title, title_len, url, url_len);
841 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
845 err = bbsmnlayout_appenditem(layout, item);
850 extbbslist_endread(list, ctx);
853 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
857 bbsmnlayout_clear(bchanl->layout);
858 bbsmnfilter_clear(bchanl->filter);
859 bbsmnparser_clear(bchanl->parser);
861 bchanl_bbsmenu_relayoutcache(bchanl);
862 bchanl_bbsmenu_relayoutexternal(bchanl);
864 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
865 bbsmenuwindow_setdrawrect(window, l, t, r, b);
867 bbsmenuwindow_requestredisp(window);
870 LOCAL Bool bchanl_registerexternalbbs(bchanl_t *bchanl)
874 W title_len, url_len, l, t, r, b;
875 TCURL_CHECK_VALID_BBSURL ret;
878 title_len = registerexternalwindow_getboradnametext(bchanl->registerexternalwindow, title, 128);
880 DP_ER("registerexternalwindow_getboradnametext error", title_len);
883 title[title_len] = TNULL;
884 url_len = registerexternalwindow_geturltext(bchanl->registerexternalwindow, url, 255);
886 DP_ER("registerexternalwindow_geturltext error", url_len);
889 url[url_len] = TNULL;
891 ret = tcurl_check_valid_bbsurl(url, url_len);
893 case TCURL_CHECK_VALID_BBSURL_NO_LAST_SLSH:
894 url[url_len] = TK_SLSH;
897 case TCURL_CHECK_VALID_BBSURL_OK:
899 case TCURL_CHECK_VALID_BBSURL_INVALID_SCHEME:
900 bchan_panels_urlerror_scheme();
902 case TCURL_CHECK_VALID_BBSURL_INVALID_HOST:
903 bchan_panels_urlerror_host();
905 case TCURL_CHECK_VALID_BBSURL_INVALID_PATH:
906 bchan_panels_urlerror_path();
910 bchanl_bbsmenu_registerexternalbbs(&bchanl->bbsmenu, title, title_len, url, url_len);
912 registerexternalwindow_setboradnametext(bchanl->registerexternalwindow, NULL, 0);
913 registerexternalwindow_seturltext(bchanl->registerexternalwindow, NULL, 0);
915 gid = externalbbswindow_getGID(bchanl->externalbbswindow);
916 extbbslist_editcontext_getdrawrect(bchanl->bbsmenu.editctx, gid, &l, &t, &r, &b);
917 externalbbswindow_setdrawrect(bchanl->externalbbswindow, l, t, r, b);
918 externalbbswindow_requestredisp(bchanl->externalbbswindow);
923 LOCAL VOID bchanl_externalbbswindow_draw(bchanl_t *bchanl)
928 if (externalbbswindow_startredisp(bchanl->externalbbswindow, &r) == 0) {
931 externalbbswindow_eraseworkarea(bchanl->externalbbswindow, &r);
932 extbbslist_editcontext_draw(bchanl->bbsmenu.editctx, externalbbswindow_getGID(bchanl->externalbbswindow), &r);
933 } while (externalbbswindow_endredisp(bchanl->externalbbswindow) > 0);
936 LOCAL VOID bchanl_externalbbswindow_resize(bchanl_t *bchanl, SIZE newsize)
940 extbbslist_editcontext_getviewrect(bchanl->bbsmenu.editctx, &l, &t, &r, &b);
945 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, l, t, r, b);
946 externalbbswindow_setworkrect(bchanl->externalbbswindow, l, t, r, b);
949 LOCAL VOID bchanl_externalbbswindow_close(bchanl_t *bchanl)
951 Bool changed, save = False;
952 BCHAN_PANELS_SAVECONFIRM_RESULT confirm;
954 changed = extbbslist_editcontext_ischanged(bchanl->bbsmenu.editctx);
955 if (changed != False) {
956 confirm = bchan_panels_saveconfirm();
958 case BCHAN_PANELS_SAVECONFIRM_RESULT_CANCEL:
960 case BCHAN_PANELS_SAVECONFIRM_RESULT_OK_NOSAVE:
963 case BCHAN_PANELS_SAVECONFIRM_RESULT_OK_SAVE:
971 extbbslist_endedit(bchanl->bbsmenu.extbbslist, bchanl->bbsmenu.editctx, save);
972 bchanl->bbsmenu.editctx = NULL;
973 externalbbswindow_close(bchanl->externalbbswindow);
975 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
979 LOCAL VOID bchanl_externalbbswindow_butdn(bchanl_t *bchanl, W type, PNT pos)
984 if (type == W_CLICK) {
985 found = extbbslist_editcontext_finditem(bchanl->bbsmenu.editctx, pos, &sel);
986 if (found != False) {
987 extbbslist_editcontext_setselect(bchanl->bbsmenu.editctx, sel);
989 externalbbswindow_requestredisp(bchanl->externalbbswindow);
993 LOCAL W bchanl_externalbbswindow_paste_readtray(bchanl_t *bchanl)
995 W err, name_len, url_len;
998 err = tray_getextbbsinfo(NULL, &name_len, NULL, &url_len);
1003 name = malloc(sizeof(TC)*(name_len+1));
1007 url = malloc(sizeof(TC)*url_len+1);
1013 err = tray_getextbbsinfo(name, &name_len, url, &url_len);
1019 name[name_len] = TNULL;
1020 url[url_len] = TNULL;
1022 registerexternalwindow_setboradnametext(bchanl->registerexternalwindow, name, name_len);
1023 registerexternalwindow_seturltext(bchanl->registerexternalwindow, url, url_len);
1024 registerexternalwindow_open(bchanl->registerexternalwindow);
1032 LOCAL VOID bchanl_externalbbswindow_paste(bchanl_t *bchanl)
1035 PNT p = {0x8000, 0x8000};
1036 nak = bchanl_externalbbswindow_paste_readtray(bchanl);
1037 externalbbswindow_responsepasterequest(bchanl->externalbbswindow, nak, &p);
1040 LOCAL VOID bchanl_externalbbswindow_scroll(bchanl_t *bchanl, W dh, W dv)
1042 extbbslist_editcontext_scrollviewrect(bchanl->bbsmenu.editctx, dh, dv);
1043 externalbbswindow_scrollworkarea(bchanl->externalbbswindow, -dh, -dv);
1046 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
1047 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
1048 #define BCHANL_MESSAGE_HTTP_EVENT 2
1050 LOCAL Bool bchanl_bbsmenu_httpevent(bchanl_bbsmenu_t *bchanl, http_connector_event *hevent)
1055 ok = bbsmnretriever_iswaitingendpoint(bchanl->retriever, hevent->endpoint);
1059 err = bbsmnretriever_recievehttpevent(bchanl->retriever, bchanl->cache, hevent);
1062 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
1063 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1065 case BBSMNRETRIEVER_REQUEST_WAITNEXT:
1068 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
1069 DP_ER("bbsmnretriever_recievehttpevent", err);
1076 LOCAL Bool bchanl_subject_httpevent(bchanl_t *bchanl, http_connector_event *hevent)
1081 sbjtlayout_t *layout;
1085 W l, t, r, b, title_len;
1087 if (bchanl->nextsubject == NULL) {
1091 ok = sbjtretriever_iswaitingendpoint(bchanl->retriever, hevent->endpoint);
1095 cache = bchanl_subject_getcache(bchanl->nextsubject);
1096 err = sbjtretriever_recievehttpevent(bchanl->retriever, cache, hevent);
1099 case SBJTRETRIEVER_REQUEST_ALLRELOAD:
1100 /* should asynchronous layout? */
1102 subjectoptionwindow_setfiltertext(bchanl->subjectoptionwindow, NULL, 0);
1103 err = subjectoptionwindow_setordervalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERVALUE_ASCENDING);
1104 subjectoptionwindow_setorderbyvalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER);
1106 bchanl_setcurrentsubject(bchanl, bchanl->nextsubject);
1107 bchanl_setnextsubject(bchanl, NULL);
1108 bchanl_subject_relayout(bchanl->currentsubject);
1110 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
1111 draw = bchanl_subject_getdraw(bchanl->currentsubject);
1112 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1113 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1115 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1116 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
1117 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
1119 bchanl_subject_gettitle(bchanl->currentsubject, &title, &title_len);
1120 subjectwindow_settitle(bchanl->subjectwindow, title);
1123 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1126 case SBJTRETRIEVER_REQUEST_WAITNEXT:
1129 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
1130 DP_ER("sbjtretriever_recievehttpevent", err);
1137 LOCAL VOID bchanl_http_task(W arg)
1140 http_connector_t *connector;
1141 bbsmnretriever_t *retr;
1142 bbsmncache_t *cache;
1145 bchanl = (bchanl_t*)arg;
1146 connector = bchanl->connector;
1147 retr = bchanl->bbsmenu.retriever;
1148 cache = bchanl->bbsmenu.cache;
1151 err = http_connector_waitconnection(connector, T_FOREVER);
1153 DP_ER("http_connector_waitconnection", err);
1154 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
1158 err = wai_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT, WF_AND, T_FOREVER);
1160 DP_ER("wai_flg", err);
1162 req_tmg(0, BCHANL_MESSAGE_HTTP_EVENT);
1168 LOCAL VOID bchanl_handle_httpevent(bchanl_t *bchanl)
1171 http_connector_event hevent;
1174 set_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT);
1176 err = http_connector_getevent(bchanl->connector, &hevent);
1181 rcv = bchanl_bbsmenu_httpevent(&bchanl->bbsmenu, &hevent);
1186 rcv = bchanl_subject_httpevent(bchanl, &hevent);
1189 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
1191 if (bchanl->retriever == NULL) {
1195 bchanl->taskid = cre_tsk(bchanl_http_task, -1, (W)bchanl);
1196 if (bchanl->taskid < 0) {
1197 DP_ER("error cre_tsk:", bchanl->taskid);
1200 bchanl->flgid = cre_flg(0, DELEXIT);
1201 if (bchanl->flgid < 0) {
1202 ter_tsk(bchanl->taskid);
1203 bchanl->taskid = -1;
1204 DP_ER("error cre_flg:", bchanl->flgid);
1211 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
1214 static UW lastrequest = 0;
1217 if (bchanl->flgid < 0) {
1221 err = get_etm(&etime);
1223 DP_ER("get_etm error:", err);
1226 if (lastrequest + 10000 > etime) {
1229 lastrequest = etime;
1231 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
1232 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
1234 err = bbsmnretriever_sendrequest(bchanl->bbsmenu.retriever, bchanl->bbsmenu.cache);
1236 DP_ER("bbsmnretriever_sendrequest error:", err);
1237 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1240 set_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT);
1245 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype, LINK *storage)
1247 static RECT r0 = {{400, 100, 700+7, 200+30}};
1248 static RECT r1 = {{100, 100, 300+7, 300+30}};
1249 static RECT r2 = {{400, 300, 800+7, 400+30}};
1250 static PAT white = {{0, 16, 16, 0x10ffffff, 0, FILL100}};
1253 TC *title0 = NULL, *title1 = NULL;
1259 http_connector_t *connector;
1260 sbjtretriever_t *retriever;
1262 bchanl_subjecthash_t *subjecthash;
1263 subjectwindow_t *subjectwindow;
1264 bbsmenuwindow_t *bbsmenuwindow;
1265 subjectoptionwindow_t *subjectoptionwindow;
1266 registerexternalwindow_t *registerexternalwindow;
1267 externalbbswindow_t *externalbbswindow;
1269 err = wget_inf(WI_PANELBACK, &bgpat0, sizeof(bgpat0));
1270 if (err != sizeof(bgpat0)) {
1276 connector = http_connector_new();
1277 if (connector == NULL) {
1278 DP_ER("http_connector_new error", 0);
1279 goto error_http_connector;
1282 retriever = sbjtretriever_new(connector, bchanl_httpheader_useragent, bchanl_httpheader_useragent_len);
1283 if (retriever == NULL) {
1284 DP_ER("sbjtretriever_new error", 0);
1285 goto error_retriever;
1287 hmi = bchanlhmi_new();
1289 DP_ER("bchanlhmi_new error", 0);
1290 goto error_bchanlhmi;
1292 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
1293 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, 0, title0, NULL);
1294 if (subjectwindow == NULL) {
1295 DP_ER("bchanlhmi_newsubjectwindow error", 0);
1296 goto error_subjectwindow;
1298 gid = subjectwindow_getGID(subjectwindow);
1299 subjecthash = bchanl_subjecthash_new(gid, 100);
1300 if (subjecthash == NULL) {
1301 DP_ER("bchanl_subjecthash_new error", 0);
1302 goto error_subjecthash;
1304 subjectoptionwindow = bchanlhmi_newsubjectoptionwindow(hmi, &p0, subjectwindow, NULL, bgpat, BCHANL_DBX_TB_SBJTOPT_FLT, BCHANL_DBX_WS_SBJTOPT_ODR, BCHANL_DBX_WS_SBJTOPT_ODRBY);
1305 if (subjectoptionwindow == NULL) {
1306 DP_ER("bchanlhmi_newsubjectoptionwindow", 0);
1307 goto error_subjectoptionwindow;
1309 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
1310 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, 0, title1, NULL);
1311 if (bbsmenuwindow == NULL) {
1312 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
1313 goto error_bbsmenuwindow;
1315 gid = bbsmenuwindow_getGID(bbsmenuwindow);
1316 registerexternalwindow = bchanlhmi_newregisterexternalwindow(hmi, &p0, 0, NULL, bgpat);
1317 if (registerexternalwindow == NULL) {
1318 DP_ER("bchanlhmi_newregisterexternalwindow error", 0);
1319 goto error_registerexternalwindow;
1321 externalbbswindow = bchanlhmi_newexternalbbswindow(hmi, &r2, 0, NULL, NULL);
1322 if (externalbbswindow == NULL) {
1323 DP_ER("bchanlhmi_newexternalbbswindow", 0);
1324 goto error_externalbbswindow;
1326 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash, storage, connector);
1328 DP_ER("bchanl_bbsmenu_initialize error", err);
1331 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
1333 DP_ER("bchanl_mainmenu_initialize %d", err);
1334 goto error_mainmenu;
1337 bchanl_hmistate_initialize(&bchanl->hmistate);
1339 if (exectype == EXECREQ) {
1340 wid = bbsmenuwindow_getWID(bbsmenuwindow);
1344 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
1345 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
1346 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1348 bchanl->connector = connector;
1349 bchanl->retriever = retriever;
1350 bchanl->subjecthash = subjecthash;
1352 bchanl->currentsubject = NULL;
1353 bchanl->nextsubject = NULL;
1354 bchanl->subjectdisplay.resnum = True;
1355 bchanl->subjectdisplay.since = False;
1356 bchanl->subjectdisplay.vigor = False;
1359 bchanl->exectype = exectype;
1362 bchanl->subjectwindow = subjectwindow;
1363 bchanl->bbsmenuwindow = bbsmenuwindow;
1364 bchanl->subjectoptionwindow = subjectoptionwindow;
1365 bchanl->registerexternalwindow = registerexternalwindow;
1366 bchanl->externalbbswindow = externalbbswindow;
1371 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
1373 bchanlhmi_deleteexternalbbswindow(hmi, externalbbswindow);
1374 error_externalbbswindow:
1375 bchanlhmi_deleteregisterexternalwindow(hmi, registerexternalwindow);
1376 error_registerexternalwindow:
1377 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
1378 error_bbsmenuwindow:
1379 bchanlhmi_deletesubjectoptionwindow(hmi, subjectoptionwindow);
1380 error_subjectoptionwindow:
1381 bchanl_subjecthash_delete(subjecthash);
1383 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
1384 error_subjectwindow:
1385 bchanlhmi_delete(hmi);
1387 sbjtretriever_delete(retriever);
1389 http_connector_delete(connector);
1390 error_http_connector:
1391 return -1; /* TODO */
1394 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
1396 gset_ptr(PS_BUSY, NULL, -1, -1);
1399 extbbslist_writefile(bchanl->bbsmenu.extbbslist);
1400 if (bchanl->exectype == EXECREQ) {
1401 oend_prc(bchanl->vid, NULL, 0);
1403 bchanl_mainmenu_finalize(&bchanl->mainmenu);
1404 bchanlhmi_deleteexternalbbswindow(bchanl->hmi, bchanl->externalbbswindow);
1405 bchanlhmi_deleteregisterexternalwindow(bchanl->hmi, bchanl->registerexternalwindow);
1406 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
1407 bchanlhmi_deletesubjectoptionwindow(bchanl->hmi, bchanl->subjectoptionwindow);
1408 bchanl_subjecthash_delete(bchanl->subjecthash);
1409 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
1410 bchanlhmi_delete(bchanl->hmi);
1411 sbjtretriever_delete(bchanl->retriever);
1412 http_connector_delete(bchanl->connector);
1417 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
1419 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};
1424 bbsmncache_t *cache = bchanl->cache;
1425 bbsmndraw_t *draw = bchanl->draw;
1427 err = get_lnk(fname, &lnk, F_NORM);
1429 DP_ER("error get_lnk", err);
1432 fd = opn_fil(&lnk, F_READ, NULL);
1436 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
1446 err = rea_rec(fd, 0, bin, len, 0, NULL);
1454 bbsmncache_appenddata(cache, bin, len);
1457 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1459 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
1460 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1461 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
1464 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1466 W l,t,r,b,l1,t1,r1,b1,scr;
1467 sbjtlayout_t *layout;
1470 if (bchanl->currentsubject == NULL) {
1473 draw = bchanl_subject_getdraw(bchanl->currentsubject);
1477 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1483 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1484 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1487 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1488 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1489 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1496 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1497 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1501 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1502 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1503 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1510 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1511 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1515 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1521 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1522 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1525 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1531 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1532 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1535 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1536 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1537 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1538 if (b + (b - t) > b1) {
1544 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1545 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1549 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1550 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1551 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1552 if (r + (r - l) > r1) {
1558 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1559 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1563 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1569 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1570 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1572 case TK_E: /* temporary */
1573 if (stat & ES_CMD) {
1574 bchanl_killme(bchanl);
1580 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1582 W l,t,r,b,l1,t1,r1,b1,scr;
1583 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
1584 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
1588 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1594 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1595 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1598 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1599 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1606 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1607 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1614 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1620 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1621 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1624 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1625 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1626 if (b + (b - t) > b1) {
1632 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1633 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1640 bchanl_networkrequest_bbsmenu(bchanl);
1642 case TK_E: /* temporary */
1643 if (stat & ES_CMD) {
1644 bchanl_killme(bchanl);
1651 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1655 act = subjectwindow_isactive(bchanl->subjectwindow);
1657 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1660 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1662 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1667 enum BCHANL_TEXTBOX_MENU_TYPE_ {
1668 BCHANL_TEXTBOX_MENU_TYPE_NONE,
1669 BCHANL_TEXTBOX_MENU_TYPE_FILTER,
1670 BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE,
1671 BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL,
1673 typedef enum BCHANL_TEXTBOX_MENU_TYPE_ BCHANL_TEXTBOX_MENU_TYPE;
1675 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl, BCHANL_TEXTBOX_MENU_TYPE type)
1677 Bool isactive, isopen, isopen_extbbs, selected = False, fromtray, totray, trayempty;
1680 isactive = subjectwindow_isactive(bchanl->subjectwindow);
1681 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1682 isopen_extbbs = externalbbswindow_isopen(bchanl->externalbbswindow);
1683 if (isopen_extbbs != False) {
1684 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1690 case BCHANL_TEXTBOX_MENU_TYPE_NONE:
1692 fromtray = totray = False;
1694 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1695 trayempty = tray_isempty();
1696 if (trayempty == False) {
1701 num = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, NULL, 0, False);
1708 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1709 trayempty = tray_isempty();
1710 if (trayempty == False) {
1715 num = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, NULL, 0, False);
1722 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1723 trayempty = tray_isempty();
1724 if (trayempty == False) {
1729 num = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, NULL, 0, False);
1738 bchanl_mainmenu_setup(&bchanl->mainmenu, isactive, isopen, isopen_extbbs, selected, fromtray, totray, bchanl->subjectdisplay.resnum, bchanl->subjectdisplay.since, bchanl->subjectdisplay.vigor);
1741 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel, BCHANL_TEXTBOX_MENU_TYPE type)
1745 #define BCHANL_SELECTMENU_STRBUF_LENGTH 256
1746 TC str[BCHANL_SELECTMENU_STRBUF_LENGTH];
1747 W index, len = 0, l, t, r, b;
1751 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1752 bchanl_killme(bchanl);
1754 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1755 subjectwindow_requestredisp(bchanl->subjectwindow);
1756 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1758 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1759 bchanl_networkrequest_bbsmenu(bchanl);
1761 case BCHANL_MAINMENU_SELECT_SUBJECTOPTION: /* [¥¹¥ì°ìÍ÷ÀßÄê] */
1762 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1763 if (isopen == False) {
1764 subjectoptionwindow_open(bchanl->subjectoptionwindow);
1766 subjectoptionwindow_close(bchanl->subjectoptionwindow);
1769 case BCHANL_MAINMENU_SELECT_EXTBBS_MANAGER: /* [³°ÉôÈĤÎÄɲÃ] */
1770 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1771 if (isopen == False) {
1773 bchanl->bbsmenu.editctx = extbbslist_startedit(bchanl->bbsmenu.extbbslist);
1774 if (bchanl->bbsmenu.editctx == NULL) {
1777 externalbbswindow_open(bchanl->externalbbswindow);
1778 externalbbswindow_getworkrect(bchanl->externalbbswindow, &work);
1779 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1780 externalbbswindow_setworkrect(bchanl->externalbbswindow, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1781 gid = externalbbswindow_getGID(bchanl->externalbbswindow);
1782 extbbslist_editcontext_getdrawrect(bchanl->bbsmenu.editctx, gid, &l, &t, &r, &b);
1783 externalbbswindow_setdrawrect(bchanl->externalbbswindow, l, t, r, b);
1786 case BCHANL_MAINMENU_SELECT_EXTBBS_REGISTER:
1787 isopen = registerexternalwindow_isopen(bchanl->registerexternalwindow);
1788 if (isopen == False) {
1789 registerexternalwindow_open(bchanl->registerexternalwindow);
1792 case BCHANL_MAINMENU_SELECT_EXTBBS_UP:
1793 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1794 if (isopen != False) {
1795 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1799 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index-1, index);
1800 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1803 case BCHANL_MAINMENU_SELECT_EXTBBS_DOWN:
1804 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1805 if (isopen != False) {
1806 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1810 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index, index+1);
1811 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1814 case BCHANL_MAINMENU_SELECT_EXTBBS_DELETE:
1815 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1816 if (isopen != False) {
1817 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1821 extbbslist_editcontext_deleteitem(bchanl->bbsmenu.editctx, index);
1822 gid = externalbbswindow_getGID(bchanl->externalbbswindow);
1823 extbbslist_editcontext_getdrawrect(bchanl->bbsmenu.editctx, gid, &l, &t, &r, &b);
1824 externalbbswindow_setdrawrect(bchanl->externalbbswindow, l, t, r, b);
1825 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1828 case BCHANL_MAINMENU_SELECT_EDIT_COPY_TO_TRAY:
1830 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1831 len = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1833 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1834 len = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1836 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1837 len = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1843 tray_pushstring(str, len);
1846 case BCHANL_MAINMENU_SELECT_EDIT_COPY_FROM_TRAY:
1847 len = tray_popstring(str, BCHANL_SELECTMENU_STRBUF_LENGTH);
1849 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1850 subjectoptionwindow_insertfiltertext(bchanl->subjectoptionwindow, str, len);
1852 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1853 registerexternalwindow_insertboradnametext(bchanl->registerexternalwindow, str, len);
1855 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1856 registerexternalwindow_inserturltext(bchanl->registerexternalwindow, str, len);
1862 case BCHANL_MAINMENU_SELECT_EDIT_MOVE_TO_TRAY:
1864 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1865 len = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1867 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1868 len = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1870 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1871 len = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1877 tray_pushstring(str, len);
1880 case BCHANL_MAINMENU_SELECT_EDIT_MOVE_FROM_TRAY:
1881 len = tray_popstring(str, BCHANL_SELECTMENU_STRBUF_LENGTH);
1883 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1884 subjectoptionwindow_insertfiltertext(bchanl->subjectoptionwindow, str, len);
1886 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1887 registerexternalwindow_insertboradnametext(bchanl->registerexternalwindow, str, len);
1889 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1890 registerexternalwindow_inserturltext(bchanl->registerexternalwindow, str, len);
1897 case BCHANL_MAINMENU_SELECT_EDIT_DELETE:
1899 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1900 subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1902 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1903 registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1905 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1906 registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1912 case BCHANL_MAINMENU_SELECT_DISPLAY_RESNUMBER:
1913 bchanl_swapresnumberdisplay(bchanl);
1914 if (bchanl->currentsubject != NULL) {
1915 bchanl_subject_setresnumberdisplay(bchanl->currentsubject, bchanl->subjectdisplay.resnum);
1916 bchanl_changedisplayattribute(bchanl);
1919 case BCHANL_MAINMENU_SELECT_DISPLAY_SINCE:
1920 bchanl_swapsincedisplay(bchanl);
1921 if (bchanl->currentsubject != NULL) {
1922 bchanl_subject_setsincedisplay(bchanl->currentsubject, bchanl->subjectdisplay.since);
1923 bchanl_changedisplayattribute(bchanl);
1926 case BCHANL_MAINMENU_SELECT_DISPLAY_VIGOR:
1927 bchanl_swapvigordisplay(bchanl);
1928 if (bchanl->currentsubject != NULL) {
1929 bchanl_subject_setvigordisplay(bchanl->currentsubject, bchanl->subjectdisplay.vigor);
1930 bchanl_changedisplayattribute(bchanl);
1937 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos, BCHANL_TEXTBOX_MENU_TYPE type)
1940 bchanl_setupmenu(bchanl, type);
1941 gset_ptr(PS_SELECT, NULL, -1, -1);
1942 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1944 bchanl_selectmenu(bchanl, sel, type);
1948 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode, BCHANL_TEXTBOX_MENU_TYPE type)
1951 bchanl_setupmenu(bchanl, type);
1952 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1954 bchanl_selectmenu(bchanl, sel, type);
1959 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1962 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1963 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1964 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1967 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1968 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1971 case BCHANL_MESSAGE_HTTP_EVENT:
1972 bchanl_handle_httpevent(bchanl);
1977 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1979 bchanlhmievent_t *evt;
1983 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1988 switch (evt->type) {
1989 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1991 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1992 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1993 bchanl_setupmenu(bchanl, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1994 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1996 bchanl_selectmenu(bchanl, sel, BCHANL_TEXTBOX_MENU_TYPE_NONE);
2000 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
2002 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
2003 bchanl_popupmenu(bchanl, evt->data.common_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_NONE);
2005 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
2006 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
2008 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_DRAW:
2009 bchanl_subjectwindow_draw(bchanl);
2011 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_RESIZE:
2012 bchanl_subjectwindow_resize(bchanl, evt->data.subjectwindow_resize.work_sz);
2014 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_CLOSE:
2015 bchanl_subjectwindow_close(bchanl);
2017 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_BUTDN:
2018 bchanl_subjectwindow_butdn(bchanl, evt->data.subjectwindow_butdn.type, evt->data.subjectwindow_butdn.pos);
2020 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_PASTE:
2021 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
2023 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_MOUSEMOVE:
2024 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
2026 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_SCROLL:
2027 bchanl_subjectwindow_scroll(bchanl, evt->data.subjectwindow_scroll.dh, evt->data.subjectwindow_scroll.dv);
2029 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_DRAW:
2030 bchanl_bbsmenuwindow_draw(bchanl);
2032 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_RESIZE:
2033 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenuwindow_resize.work_sz);
2035 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_CLOSE:
2036 bchanl_bbsmenuwindow_close(bchanl);
2038 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_BUTDN:
2039 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenuwindow_butdn.type, evt->data.bbsmenuwindow_butdn.pos);
2041 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_MOUSEMOVE:
2042 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
2044 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_SCROLL:
2045 bchanl_bbsmenuwindow_scroll(bchanl, evt->data.bbsmenuwindow_scroll.dh, evt->data.bbsmenuwindow_scroll.dv);
2047 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_DETERMINE:
2048 bchanl_changesubjectfilterword(bchanl, evt->data.subjectoptionwindow_filter_determine.value, evt->data.subjectoptionwindow_filter_determine.len);
2050 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_COPY:
2052 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MOVE:
2054 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MENU:
2055 bchanl_popupmenu(bchanl, evt->data.subjectoptionwindow_filter_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_FILTER);
2057 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_KEYMENU:
2058 bchanl_keyselect(bchanl, evt->data.subjectoptionwindow_filter_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_FILTER);
2060 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDER_CHANGE:
2061 bchanl_changesubjectorder(bchanl, evt->data.subjectoptionwindow_order_change.value);
2063 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDERBY_CHANGE:
2064 bchanl_changesubjectorderby(bchanl, evt->data.subjectoptionwindow_order_change.value);
2066 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_DETERMINE:
2068 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_COPY:
2070 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MOVE:
2072 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MENU:
2073 bchanl_popupmenu(bchanl, evt->data.registerexternalwindow_boradname_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE);
2075 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_KEYMENU:
2076 bchanl_keyselect(bchanl, evt->data.registerexternalwindow_boradname_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE);
2078 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_DETERMINE:
2080 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_COPY:
2082 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MOVE:
2084 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MENU:
2085 bchanl_popupmenu(bchanl, evt->data.registerexternalwindow_url_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL);
2087 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_KEYMENU:
2088 bchanl_keyselect(bchanl, evt->data.registerexternalwindow_url_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL);
2090 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_DETERMINE_PUSH:
2091 close = bchanl_registerexternalbbs(bchanl);
2092 if (close != False) {
2093 registerexternalwindow_close(bchanl->registerexternalwindow);
2096 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_CANCEL_PUSH:
2097 registerexternalwindow_close(bchanl->registerexternalwindow);
2099 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_DRAW:
2100 bchanl_externalbbswindow_draw(bchanl);
2102 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_RESIZE:
2103 bchanl_externalbbswindow_resize(bchanl, evt->data.externalbbswindow_resize.work_sz);
2105 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_CLOSE:
2106 bchanl_externalbbswindow_close(bchanl);
2108 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_BUTDN:
2109 bchanl_externalbbswindow_butdn(bchanl, evt->data.externalbbswindow_butdn.type, evt->data.externalbbswindow_butdn.pos);
2111 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_PASTE:
2112 bchanl_externalbbswindow_paste(bchanl);
2114 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_SCROLL:
2115 bchanl_externalbbswindow_scroll(bchanl, evt->data.externalbbswindow_scroll.dh, evt->data.externalbbswindow_scroll.dv);
2117 case BCHANLHMIEVENT_TYPE_NONE:
2121 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};
2122 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};
2123 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};
2125 LOCAL W main_CLI_args(VID *vid, LINK *storage)
2131 err = get_lnk(filename_dbg_databox, &dbx, F_NORM);
2133 DP_ER("get_lnk:test databox error", err);
2136 err = dopn_dat(&dbx);
2138 DP_ER("dopn_dat error", err);
2141 err = get_lnk(filename_dbg_storage, storage, F_NORM);
2143 DP_ER("get_lnk;commonstorage error", err);
2150 LOCAL W main_EXECREC_args(M_EXECREQ *msg, VID *vid, LINK *storage)
2155 err = dopn_dat(&msg->self);
2157 DP_ER("dopn_dat", err);
2162 err = get_lnk(filename_storage, &lnk, F_BASED);
2164 DP_ER("get_lnk;commonstorage error", err);
2174 typedef struct _arg {
2179 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
2186 len = src->msg_size / sizeof(TC);
2187 str = (TC*)(src->msg_body.ANYMSG.msg_str);
2190 if(str[i] == TK_KSP){
2196 if(str[i] == TK_KSP){
2203 argv = (TC**)malloc(sizeof(TC*)*ac);
2207 if(str[i] == TNULL){
2213 if(str[i] == TNULL){
2226 EXPORT W MAIN(MESSAGE *msg)
2234 err = dopn_dat(NULL);
2236 DP_ER("dopn_dat error:", err);
2240 switch (msg->msg_type) {
2242 arg = MESSAGEtoargv(msg);
2243 err = main_CLI_args(&vid, &storage);
2249 oend_req(((M_DISPREQ*)msg)->vid, -1);
2253 oend_req(((M_PASTEREQ*)msg)->vid, -1);
2257 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
2260 err = main_EXECREC_args((M_EXECREQ*)msg, &vid, &storage);
2270 err = bchanl_initialize(&bchanl, vid, msg->msg_type, &storage);
2272 DP_ER("bchanl_initialize error", err);
2275 err = bchanl_prepare_network(&bchanl);
2277 DP_ER("bchanl_prepare_network error", err);
2278 bchanl_killme(&bchanl);
2282 if (msg->msg_type == 0) {
2283 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
2284 } else if (msg->msg_type == EXECREQ) {
2285 bchanl_networkrequest_bbsmenu(&bchanl);
2288 subjectwindow_requestredisp(bchanl.subjectwindow);
2289 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
2292 bchanl_eventdispatch(&bchanl);