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 #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 typedef struct bchanl_hmistate_t_ bchanl_hmistate_t;
92 struct bchanl_hmistate_t_ {
100 LOCAL VOID bchanl_hmistate_updateptrstyle(bchanl_hmistate_t *hmistate, PTRSTL ptr)
102 if (hmistate->ptr == ptr) {
106 gset_ptr(hmistate->ptr, NULL, -1, -1);
109 LOCAL VOID bchanl_hmistate_initialize(bchanl_hmistate_t *hmistate)
113 hmistate->ptr = PS_SELECT;
115 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRBBSMENU, (void**)&hmistate->msg_retr_bbsmenu);
117 DP_ER("dget_dtp: message retrieving error", err);
118 hmistate->msg_retr_bbsmenu = NULL;
120 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRSUBJECT, (void**)&hmistate->msg_retr_subject);
122 DP_ER("dget_dtp: message not modified error", err);
123 hmistate->msg_retr_subject = NULL;
125 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_ERRRETR, (void**)&hmistate->msg_error_retr);
127 DP_ER("dget_dtp: message retrieve error error", err);
128 hmistate->msg_error_retr = NULL;
132 typedef struct bchanl_bbsmenu_t_ bchanl_bbsmenu_t;
133 struct bchanl_bbsmenu_t_ {
136 bbsmnretriever_t *retriever;
138 bbsmnparser_t *parser;
139 bbsmnfilter_t *filter;
140 bbsmnlayout_t *layout;
143 bchanl_subjecthash_t *subjecthash;
144 extbbslist_t *extbbslist;
145 extbbslist_editcontext_t *editctx;
149 #define BCHANL_NETWORK_FLAG_WAITHTTPEVENT 0x00000001
153 W flgid; /* for reduce TMOUT message sending. */
155 bchanl_mainmenu_t mainmenu;
159 bchanl_hmistate_t hmistate;
161 http_connector_t *connector;
163 sbjtretriever_t *retriever;
165 bchanl_subjecthash_t *subjecthash;
166 bchanl_bbsmenu_t bbsmenu;
167 bchanl_subject_t *currentsubject;
175 subjectwindow_t *subjectwindow;
176 bbsmenuwindow_t *bbsmenuwindow;
177 subjectoptionwindow_t *subjectoptionwindow;
178 registerexternalwindow_t *registerexternalwindow;
179 externalbbswindow_t *externalbbswindow;
181 typedef struct bchanl_t_ bchanl_t;
183 LOCAL VOID bchanl_swapresnumberdisplay(bchanl_t *bchanl)
185 if (bchanl->subjectdisplay.resnum != False) {
186 bchanl->subjectdisplay.resnum = False;
188 bchanl->subjectdisplay.resnum = True;
192 LOCAL VOID bchanl_swapsincedisplay(bchanl_t *bchanl)
194 if (bchanl->subjectdisplay.since != False) {
195 bchanl->subjectdisplay.since = False;
197 bchanl->subjectdisplay.since = True;
201 LOCAL VOID bchanl_swapvigordisplay(bchanl_t *bchanl)
203 if (bchanl->subjectdisplay.vigor != False) {
204 bchanl->subjectdisplay.vigor = False;
206 bchanl->subjectdisplay.vigor = True;
210 LOCAL VOID bchanl_killme(bchanl_t *bchanl);
212 LOCAL VOID bchanl_subjectwindow_draw(bchanl_t *bchanl)
216 if (bchanl->currentsubject == NULL) {
218 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
221 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
222 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
224 draw = bchanl_subject_getdraw(bchanl->currentsubject);
226 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
229 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
230 sbjtdraw_draw(draw, &r);
231 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
235 LOCAL VOID bchanl_subjectwindow_scroll(bchanl_t *bchanl, W dh, W dv)
238 if (bchanl->currentsubject == NULL) {
241 draw = bchanl_subject_getdraw(bchanl->currentsubject);
242 sbjtdraw_scrollviewrect(draw, dh, dv);
243 subjectwindow_scrollworkarea(bchanl->subjectwindow, -dh, -dv);
244 bchanl_subjectwindow_draw(bchanl);
247 LOCAL VOID bchanl_subjectwindow_resize(bchanl_t *bchanl, SIZE newsize)
252 if (bchanl->currentsubject == NULL) {
255 draw = bchanl_subject_getdraw(bchanl->currentsubject);
257 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
262 sbjtdraw_setviewrect(draw, l, t, r, b);
263 subjectwindow_setworkrect(bchanl->subjectwindow, l, t, r, b);
265 bchanl_subjectwindow_draw(bchanl);
268 LOCAL VOID bchanl_subjectwindow_close(bchanl_t *bchanl)
270 bchanl_killme(bchanl);
273 LOCAL VOID bchanl_subjectwindow_press(bchanl_t *bchanl, PNT evpos)
275 sbjtlist_tuple_t *tuple;
278 W event_type, size, err, fsn_len, dx, dy;
281 PNT pos, p1, pos_butup;
288 if (bchanl->currentsubject == NULL) {
291 draw = bchanl_subject_getdraw(bchanl->currentsubject);
293 err = sbjtdraw_findthread(draw, evpos, &tuple, &vframe);
298 gid = subjectwindow_startdrag(bchanl->subjectwindow);
300 DP_ER("wsta_drg error:", gid);
307 dx = vframe.c.left - evpos.x;
308 dy = vframe.c.top - evpos.y;
312 sel.rgn.r.c.left = vframe.c.left;
313 sel.rgn.r.c.top = vframe.c.top;
314 sel.rgn.r.c.right = vframe.c.right;
315 sel.rgn.r.c.bottom = vframe.c.bottom;
316 adsp_sel(gid, &sel, 1);
318 gset_ptr(PS_GRIP, NULL, -1, -1);
320 event_type = subjectwindow_getdrag(bchanl->subjectwindow, &pos, &wid_butup, &pos_butup);
321 if (event_type == EV_BUTUP) {
324 if (event_type != EV_NULL) {
327 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
330 adsp_sel(gid, &sel, 0);
331 sel.rgn.r.c.left += pos.x - p1.x;
332 sel.rgn.r.c.top += pos.y - p1.y;
333 sel.rgn.r.c.right += pos.x - p1.x;
334 sel.rgn.r.c.bottom += pos.y - p1.y;
335 adsp_sel(gid, &sel, 1);
338 gset_ptr(PS_SELECT, NULL, -1, -1);
339 adsp_sel(gid, &sel, 0);
340 subjectwindow_enddrag(bchanl->subjectwindow);
342 /* BUTUP on self window or no window or system message panel */
343 if ((wid_butup == subjectwindow_getWID(bchanl->subjectwindow))||(wid_butup == 0)||(wid_butup == -1)) {
347 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
352 err = dget_dtp(64, BCHANL_DBX_VIEWER_FUSEN, (void**)&fsn);
354 DP_ER("dget_dtp: ", err);
357 fsn_len = dget_siz((B*)fsn);
358 err = bchanl_subject_createviewervobj(bchanl->currentsubject, tuple, fsn, fsn_len, &vrec.vseg, (LINK*)&vrec.vlnk);
360 DP_ER("bchanl_subject_createviewervobj error", err);
363 if (err == BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED) {
369 tr_rec.len = sizeof(TR_VOBJREC);
370 tr_rec.dt = (B*)&vrec;
371 err = tset_dat(&tr_rec, 1);
373 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
375 DP_ER("error del_fil:", err);
380 paste_ev.r.type = EV_REQUEST;
381 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
382 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
383 paste_ev.r.cmd = W_PASTE;
384 paste_ev.r.wid = wid_butup;
385 err = wsnd_evt(&paste_ev);
388 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
390 DP_ER("error del_fil:", err);
394 err = wwai_rsp(NULL, W_PASTE, 60000);
397 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
399 DP_ER("error del_fil:", err);
403 wswi_wnd(wid_butup, NULL);
406 LOCAL VOID bchanl_subjectwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
415 bchanl_subjectwindow_press(bchanl, evpos);
419 LOCAL VOID bchanl_setcurrentsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
421 bchanl->currentsubject = sbjt;
422 bchanl_subject_setresnumberdisplay(sbjt, bchanl->subjectdisplay.resnum);
423 bchanl_subject_setsincedisplay(sbjt, bchanl->subjectdisplay.since);
424 bchanl_subject_setvigordisplay(sbjt, bchanl->subjectdisplay.vigor);
425 subjectwindow_requestredisp(bchanl->subjectwindow);
428 LOCAL VOID bchanl_bbsmenuwindow_draw(bchanl_t *bchanl)
432 if (bbsmenuwindow_startredisp(bchanl->bbsmenuwindow, &r) == 0) {
435 bbsmenuwindow_eraseworkarea(bchanl->bbsmenuwindow, &r);
436 bbsmndraw_draw(bchanl->bbsmenu.draw, &r);
437 } while (bbsmenuwindow_endredisp(bchanl->bbsmenuwindow) > 0);
440 LOCAL VOID bchanl_bbsmenuwindow_scroll(bchanl_t *bchanl, W dh, W dv)
442 bbsmndraw_scrollviewrect(bchanl->bbsmenu.draw, dh, dv);
443 bbsmenuwindow_scrollworkarea(bchanl->bbsmenuwindow, -dh, -dv);
444 bchanl_bbsmenuwindow_draw(bchanl);
447 LOCAL VOID bchanl_bbsmenuwindow_resize(bchanl_t *bchanl, SIZE newsize)
451 bbsmndraw_getviewrect(bchanl->bbsmenu.draw, &l, &t, &r, &b);
456 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, l, t, r, b);
457 bbsmenuwindow_setworkrect(bchanl->bbsmenuwindow, l, t, r, b);
459 bchanl_bbsmenuwindow_draw(bchanl);
462 LOCAL VOID bchanl_bbsmenuwindow_close(bchanl_t *bchanl)
464 bchanl_killme(bchanl);
467 LOCAL VOID bchanl_updatesubjectorder(bchanl_t *bchanl, SUBJECTOPTIONWINDOW_ORDERVALUE_T order, SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby, TC *filterword, W filterword_len)
472 if (order == SUBJECTOPTIONWINDOW_ORDERVALUE_DESCENDING) {
478 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER:
480 sbjt_orderby = BCHANL_SUBJECT_SORTBY_NUMBER;
482 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_RES:
483 sbjt_orderby = BCHANL_SUBJECT_SORTBY_RES;
485 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_SINCE:
486 sbjt_orderby = BCHANL_SUBJECT_SORTBY_SINCE;
488 case SUBJECTOPTIONWINDOW_ORDERBYVALUE_VIGOR:
489 sbjt_orderby = BCHANL_SUBJECT_SORTBY_VIGOR;
493 bchanl_subject_reorder(bchanl->currentsubject, filterword, filterword_len, sbjt_orderby, descending);
495 subjectwindow_requestredisp(bchanl->subjectwindow);
498 LOCAL VOID bchanl_changesubjectorder(bchanl_t *bchanl, W neworder)
500 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
504 if (bchanl->currentsubject == NULL) {
508 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
509 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
511 bchanl_updatesubjectorder(bchanl, neworder, orderby, buf, len);
514 LOCAL VOID bchanl_changesubjectorderby(bchanl_t *bchanl, W neworderby)
516 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
520 if (bchanl->currentsubject == NULL) {
524 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
525 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
527 bchanl_updatesubjectorder(bchanl, order, neworderby, buf, len);
530 LOCAL VOID bchanl_changesubjectfilterword(bchanl_t *bchanl, TC *newstr, W newstr_len)
532 sbjtlayout_t *layout;
534 SUBJECTOPTIONWINDOW_ORDERVALUE_T order;
535 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
539 if (bchanl->currentsubject == NULL) {
543 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
544 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
546 bchanl_updatesubjectorder(bchanl, order, orderby, newstr, newstr_len);
548 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
549 draw = bchanl_subject_getdraw(bchanl->currentsubject);
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(bchanl->currentsubject);
554 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
555 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
558 LOCAL VOID bchanl_changedisplayattribute(bchanl_t *bchanl)
560 sbjtlayout_t *layout;
561 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T order;
562 SUBJECTOPTIONWINDOW_ORDERBYVALUE_T orderby;
567 if (bchanl->currentsubject == NULL) {
571 subjectoptionwindow_getordervalue(bchanl->subjectoptionwindow, &order);
572 subjectoptionwindow_getorderbyvalue(bchanl->subjectoptionwindow, &orderby);
573 len = subjectoptionwindow_getfiltertext(bchanl->subjectoptionwindow, buf, 512);
575 bchanl_updatesubjectorder(bchanl, order, orderby, buf, len);
577 layout = bchanl_subject_getlayout(bchanl->currentsubject);
578 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
579 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
582 LOCAL VOID bchanl_sendsubjectrequest(bchanl_t *bchanl, bchanl_subject_t *subject)
585 sbjtlayout_t *layout;
589 W l, t, r, b, title_len, err;
591 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
592 pdsp_msg(bchanl->hmistate.msg_retr_subject);
594 cache = bchanl_subject_getcache(subject);
595 err = sbjtretriever_sendrequest(bchanl->retriever, cache);
597 pdsp_msg(bchanl->hmistate.msg_error_retr);
598 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
603 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
605 subjectoptionwindow_setfiltertext(bchanl->subjectoptionwindow, NULL, 0);
606 err = subjectoptionwindow_setordervalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERVALUE_ASCENDING);
607 subjectoptionwindow_setorderbyvalue(bchanl->subjectoptionwindow, SUBJECTOPTIONWINDOW_ORDERBYVALUE_NUMBER);
609 bchanl_subject_relayout(subject);
611 bchanl_setcurrentsubject(bchanl, subject);
613 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
614 draw = bchanl_subject_getdraw(subject);
615 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
616 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
618 layout = bchanl_subject_getlayout(subject);
619 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
620 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
622 bchanl_subject_gettitle(subject, &title, &title_len);
623 subjectwindow_settitle(bchanl->subjectwindow, title);
626 LOCAL VOID bchanl_bbsmenuwindow_click(bchanl_t *bchanl, PNT pos)
628 bbsmnparser_item_t *item;
629 bchanl_subject_t *subject;
632 W host_len, board_len;
636 fnd = bbsmndraw_findboard(bchanl->bbsmenu.draw, pos, &item);
641 if (item->category != NULL) {
644 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
645 subject = bchanl_subjecthash_search(bchanl->subjecthash, host, host_len, board, board_len);
646 if (subject == NULL) {
647 DP(("not found by subject hash"));
650 bchanl_subject_gettitle(subject, &title, &title_len);
652 bchanl_sendsubjectrequest(bchanl, subject);
655 LOCAL VOID bchanl_bbsmenuwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
664 bchanl_bbsmenuwindow_click(bchanl, evpos);
668 LOCAL W bchanl_bbsmenu_initialize(bchanl_bbsmenu_t *bchanl, GID gid, bchanl_subjecthash_t *subjecthash, LINK *storage, http_connector_t *connector)
670 bbsmnretriever_t *retriever;
672 bbsmnparser_t *parser;
673 bbsmnfilter_t *filter;
674 bbsmnlayout_t *layout;
676 extbbslist_t *extbbslist;
680 cache = bbsmncache_new();
684 retriever = bbsmnretriever_new(connector);
685 if (retriever == NULL) {
686 goto error_retriever;
688 parser = bbsmnparser_new(cache);
689 if (parser == NULL) {
692 filter = bbsmnfilter_new();
693 if (filter == NULL) {
696 layout = bbsmnlayout_new(gid);
697 if (layout == NULL) {
700 draw = bbsmndraw_new(layout);
704 extbbslist = extbbslist_new(storage, BCHANL_COMMONSTORAGE_EXTBBSLIST_RECTYPE, BCHANL_COMMONSTORAGE_EXTBBSLIST_SUBTYPE);
705 if (extbbslist == NULL) {
706 DP_ER("extbbslist_new", 0);
707 goto error_extbbslist;
709 err = extbbslist_readfile(extbbslist);
711 DP_ER("extbbslist_readfile", 0);
712 goto error_extbbslist_readfile;
714 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_CATE_EXTBBS, (void**)&category_extbbs);
717 bchanl->retriever = retriever;
718 bchanl->cache = cache;
719 bchanl->parser = parser;
720 bchanl->filter = filter;
721 bchanl->layout = layout;
723 bchanl->subjecthash = subjecthash;
724 bchanl->extbbslist = extbbslist;
725 bchanl->editctx = NULL;
726 bchanl->category_extbbs = category_extbbs;
730 error_extbbslist_readfile:
731 extbbslist_delete(extbbslist);
733 bbsmndraw_delete(draw);
735 bbsmnlayout_delete(layout);
737 bbsmnfilter_delete(filter);
739 bbsmnparser_delete(parser);
741 bbsmnretriever_delete(retriever);
743 bbsmncache_delete(cache);
745 return -1; /* TODO */
748 LOCAL W bchanl_bbsmenu_appenditemtohash(bchanl_bbsmenu_t *bchanl, bbsmnparser_item_t *item)
752 W host_len, board_len;
754 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
755 err = bchanl_subjecthash_append(bchanl->subjecthash, host, host_len, board, board_len, item->title, item->title_len);
759 LOCAL VOID bchanl_bbsmenu_registerexternalbbs(bchanl_bbsmenu_t *bchanl, TC *title, W title_len, TC *url, W url_len)
761 extbbslist_editcontext_append(bchanl->editctx, title, title_len, url, url_len);
764 LOCAL VOID bchanl_bbsmenu_relayoutcache(bchanl_bbsmenu_t *bchanl)
767 bbsmnparser_t *parser = bchanl->parser;
768 bbsmnparser_item_t *item;
769 bbsmnfilter_t *filter = bchanl->filter;
770 bbsmnlayout_t *layout = bchanl->layout;
773 err = bbsmnparser_getnextitem(parser, &item);
777 bbsmnfilter_inputitem(filter, item);
779 ret = bbsmnfilter_outputitem(filter, &item);
781 if (item->category == NULL) {
782 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
787 err = bbsmnlayout_appenditem(layout, item);
792 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
796 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
800 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
813 LOCAL VOID bchanl_bbsmenu_relayoutexternal(bchanl_bbsmenu_t *bchanl)
815 W err, ret, category_len, title_len, url_len;
817 TC *category, *title;
819 extbbslist_readcontext_t *ctx;
820 bbsmnparser_t *parser = bchanl->parser;
821 bbsmnparser_item_t *item;
822 bbsmnlayout_t *layout = bchanl->layout;
823 extbbslist_t *list = bchanl->extbbslist;
825 ret = extbbslist_number(bchanl->extbbslist);
830 category = bchanl->category_extbbs;
831 category_len = tc_strlen(category);
832 item = bbsmnparser_newcategoryitem(parser, category, category_len);
836 err = bbsmnlayout_appenditem(layout, item);
841 ctx = extbbslist_startread(list);
846 cont = extbbslist_readcontext_getnext(ctx, &title, &title_len, &url, &url_len);
851 item = bbsmnparser_newboarditem(parser, title, title_len, url, url_len);
855 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
859 err = bbsmnlayout_appenditem(layout, item);
864 extbbslist_endread(list, ctx);
867 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
871 bbsmnlayout_clear(bchanl->layout);
872 bbsmnfilter_clear(bchanl->filter);
873 bbsmnparser_clear(bchanl->parser);
875 bchanl_bbsmenu_relayoutcache(bchanl);
876 bchanl_bbsmenu_relayoutexternal(bchanl);
878 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
879 bbsmenuwindow_setdrawrect(window, l, t, r, b);
881 bbsmenuwindow_requestredisp(window);
884 LOCAL Bool bchanl_registerexternalbbs(bchanl_t *bchanl)
888 W title_len, url_len;
889 TCURL_CHECK_VALID_BBSURL ret;
891 title_len = registerexternalwindow_getboradnametext(bchanl->registerexternalwindow, title, 128);
893 DP_ER("registerexternalwindow_getboradnametext error", title_len);
896 title[title_len] = TNULL;
897 url_len = registerexternalwindow_geturltext(bchanl->registerexternalwindow, url, 255);
899 DP_ER("registerexternalwindow_geturltext error", url_len);
902 url[url_len] = TNULL;
904 ret = tcurl_check_valid_bbsurl(url, url_len);
906 case TCURL_CHECK_VALID_BBSURL_NO_LAST_SLSH:
907 url[url_len+1] = TK_SLSH;
910 case TCURL_CHECK_VALID_BBSURL_OK:
912 case TCURL_CHECK_VALID_BBSURL_INVALID_SCHEME:
913 bchan_panels_urlerror_scheme();
915 case TCURL_CHECK_VALID_BBSURL_INVALID_HOST:
916 bchan_panels_urlerror_host();
918 case TCURL_CHECK_VALID_BBSURL_INVALID_PATH:
919 bchan_panels_urlerror_path();
923 bchanl_bbsmenu_registerexternalbbs(&bchanl->bbsmenu, title, title_len, url, url_len);
925 registerexternalwindow_setboradnametext(bchanl->registerexternalwindow, NULL, 0);
926 registerexternalwindow_seturltext(bchanl->registerexternalwindow, NULL, 0);
928 externalbbswindow_requestredisp(bchanl->externalbbswindow);
933 LOCAL VOID bchanl_externalbbswindow_draw(bchanl_t *bchanl)
938 if (externalbbswindow_startredisp(bchanl->externalbbswindow, &r) == 0) {
941 externalbbswindow_eraseworkarea(bchanl->externalbbswindow, &r);
942 extbbslist_editcontext_draw(bchanl->bbsmenu.editctx, externalbbswindow_getGID(bchanl->externalbbswindow), &r);
943 } while (externalbbswindow_endredisp(bchanl->externalbbswindow) > 0);
946 LOCAL VOID bchanl_externalbbswindow_resize(bchanl_t *bchanl, SIZE newsize)
950 extbbslist_editcontext_getviewrect(bchanl->bbsmenu.editctx, &l, &t, &r, &b);
955 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, l, t, r, b);
956 externalbbswindow_setworkrect(bchanl->externalbbswindow, l, t, r, b);
959 LOCAL VOID bchanl_externalbbswindow_close(bchanl_t *bchanl)
961 Bool changed, save = False;
962 BCHAN_PANELS_SAVECONFIRM_RESULT confirm;
964 changed = extbbslist_editcontext_ischanged(bchanl->bbsmenu.editctx);
965 if (changed != False) {
966 confirm = bchan_panels_saveconfirm();
968 case BCHAN_PANELS_SAVECONFIRM_RESULT_CANCEL:
970 case BCHAN_PANELS_SAVECONFIRM_RESULT_OK_NOSAVE:
973 case BCHAN_PANELS_SAVECONFIRM_RESULT_OK_SAVE:
981 extbbslist_endedit(bchanl->bbsmenu.extbbslist, bchanl->bbsmenu.editctx, save);
982 bchanl->bbsmenu.editctx = NULL;
983 externalbbswindow_close(bchanl->externalbbswindow);
985 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
989 LOCAL VOID bchanl_externalbbswindow_butdn(bchanl_t *bchanl, W type, PNT pos)
994 if (type == W_CLICK) {
995 found = extbbslist_editcontext_finditem(bchanl->bbsmenu.editctx, pos, &sel);
996 if (found != False) {
997 extbbslist_editcontext_setselect(bchanl->bbsmenu.editctx, sel);
999 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1003 LOCAL VOID bchanl_externalbbswindow_paste(bchanl_t *bchanl)
1005 externalbbswindow_responsepasterequest(bchanl->externalbbswindow, /* NACK */ 1, NULL);
1008 LOCAL VOID bchanl_externalbbswindow_scroll(bchanl_t *bchanl, W dh, W dv)
1010 extbbslist_editcontext_scrollviewrect(bchanl->bbsmenu.editctx, dh, dv);
1011 externalbbswindow_scrollworkarea(bchanl->externalbbswindow, -dh, -dv);
1014 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
1015 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
1016 #define BCHANL_MESSAGE_HTTP_EVENT 2
1018 LOCAL Bool bchanl_bbsmenu_httpevent(bchanl_bbsmenu_t *bchanl, http_connector_event *hevent)
1023 ok = bbsmnretriever_iswaitingendpoint(bchanl->retriever, hevent->endpoint);
1027 err = bbsmnretriever_recievehttpevent(bchanl->retriever, bchanl->cache, hevent);
1030 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
1031 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1033 case BBSMNRETRIEVER_REQUEST_WAITNEXT:
1036 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
1037 DP_ER("bbsmnretriever_recievehttpevent", err);
1044 LOCAL VOID bchanl_http_task(W arg)
1047 http_connector_t *connector;
1048 bbsmnretriever_t *retr;
1049 bbsmncache_t *cache;
1052 bchanl = (bchanl_t*)arg;
1053 connector = bchanl->connector;
1054 retr = bchanl->bbsmenu.retriever;
1055 cache = bchanl->bbsmenu.cache;
1058 err = http_connector_waitconnection(connector, T_FOREVER);
1060 DP_ER("http_connector_waitconnection", err);
1061 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
1065 err = wai_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT, WF_AND, T_FOREVER);
1067 DP_ER("wai_flg", err);
1069 req_tmg(0, BCHANL_MESSAGE_HTTP_EVENT);
1075 LOCAL VOID bchanl_handle_httpevent(bchanl_t *bchanl)
1078 http_connector_event hevent;
1080 set_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT);
1082 err = http_connector_getevent(bchanl->connector, &hevent);
1087 bchanl_bbsmenu_httpevent(&bchanl->bbsmenu, &hevent);
1090 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
1092 if (bchanl->retriever == NULL) {
1096 bchanl->taskid = cre_tsk(bchanl_http_task, -1, (W)bchanl);
1097 if (bchanl->taskid < 0) {
1098 DP_ER("error cre_tsk:", bchanl->taskid);
1101 bchanl->flgid = cre_flg(0, DELEXIT);
1102 if (bchanl->flgid < 0) {
1103 ter_tsk(bchanl->taskid);
1104 bchanl->taskid = -1;
1105 DP_ER("error cre_flg:", bchanl->flgid);
1112 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
1115 static UW lastrequest = 0;
1118 if (bchanl->flgid < 0) {
1122 err = get_etm(&etime);
1124 DP_ER("get_etm error:", err);
1127 if (lastrequest + 10000 > etime) {
1130 lastrequest = etime;
1132 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
1134 err = bbsmnretriever_sendrequest(bchanl->bbsmenu.retriever, bchanl->bbsmenu.cache);
1136 DP_ER("bbsmnretriever_sendrequest error:", err);
1137 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1140 set_flg(bchanl->flgid, BCHANL_NETWORK_FLAG_WAITHTTPEVENT);
1142 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
1143 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
1148 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype, LINK *storage)
1150 static RECT r0 = {{400, 100, 700+7, 200+30}};
1151 static RECT r1 = {{100, 100, 300+7, 300+30}};
1152 static RECT r2 = {{400, 300, 800+7, 400+30}};
1153 static PAT white = {{0, 16, 16, 0x10ffffff, 0, FILL100}};
1156 TC *title0 = NULL, *title1 = NULL;
1162 http_connector_t *connector;
1163 sbjtretriever_t *retriever;
1165 bchanl_subjecthash_t *subjecthash;
1166 subjectwindow_t *subjectwindow;
1167 bbsmenuwindow_t *bbsmenuwindow;
1168 subjectoptionwindow_t *subjectoptionwindow;
1169 registerexternalwindow_t *registerexternalwindow;
1170 externalbbswindow_t *externalbbswindow;
1172 err = wget_inf(WI_PANELBACK, &bgpat0, sizeof(bgpat0));
1173 if (err != sizeof(bgpat0)) {
1179 connector = http_connector_new();
1180 if (connector == NULL) {
1181 DP_ER("http_connector_new error", 0);
1182 goto error_http_connector;
1185 retriever = sbjtretriever_new();
1186 if (retriever == NULL) {
1187 DP_ER("sbjtretriever_new error", 0);
1188 goto error_retriever;
1190 hmi = bchanlhmi_new();
1192 DP_ER("bchanlhmi_new error", 0);
1193 goto error_bchanlhmi;
1195 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
1196 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, 0, title0, NULL);
1197 if (subjectwindow == NULL) {
1198 DP_ER("bchanlhmi_newsubjectwindow error", 0);
1199 goto error_subjectwindow;
1201 gid = subjectwindow_getGID(subjectwindow);
1202 subjecthash = bchanl_subjecthash_new(gid, 100);
1203 if (subjecthash == NULL) {
1204 DP_ER("bchanl_subjecthash_new error", 0);
1205 goto error_subjecthash;
1207 subjectoptionwindow = bchanlhmi_newsubjectoptionwindow(hmi, &p0, subjectwindow, NULL, bgpat, BCHANL_DBX_TB_SBJTOPT_FLT, BCHANL_DBX_WS_SBJTOPT_ODR, BCHANL_DBX_WS_SBJTOPT_ODRBY);
1208 if (subjectoptionwindow == NULL) {
1209 DP_ER("bchanlhmi_newsubjectoptionwindow", 0);
1210 goto error_subjectoptionwindow;
1212 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
1213 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, 0, title1, NULL);
1214 if (bbsmenuwindow == NULL) {
1215 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
1216 goto error_bbsmenuwindow;
1218 gid = bbsmenuwindow_getGID(bbsmenuwindow);
1219 registerexternalwindow = bchanlhmi_newregisterexternalwindow(hmi, &p0, 0, NULL, bgpat);
1220 if (registerexternalwindow == NULL) {
1221 DP_ER("bchanlhmi_newregisterexternalwindow error", 0);
1222 goto error_registerexternalwindow;
1224 externalbbswindow = bchanlhmi_newexternalbbswindow(hmi, &r2, 0, NULL, NULL);
1225 if (externalbbswindow == NULL) {
1226 DP_ER("bchanlhmi_newexternalbbswindow", 0);
1227 goto error_externalbbswindow;
1229 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash, storage, connector);
1231 DP_ER("bchanl_bbsmenu_initialize error", err);
1234 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
1236 DP_ER("bchanl_mainmenu_initialize %d", err);
1237 goto error_mainmenu;
1240 bchanl_hmistate_initialize(&bchanl->hmistate);
1242 if (exectype == EXECREQ) {
1243 wid = bbsmenuwindow_getWID(bbsmenuwindow);
1247 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
1248 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
1249 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1251 bchanl->connector = connector;
1252 bchanl->retriever = retriever;
1253 bchanl->subjecthash = subjecthash;
1255 bchanl->currentsubject = NULL;
1256 bchanl->subjectdisplay.resnum = True;
1257 bchanl->subjectdisplay.since = False;
1258 bchanl->subjectdisplay.vigor = False;
1261 bchanl->exectype = exectype;
1264 bchanl->subjectwindow = subjectwindow;
1265 bchanl->bbsmenuwindow = bbsmenuwindow;
1266 bchanl->subjectoptionwindow = subjectoptionwindow;
1267 bchanl->registerexternalwindow = registerexternalwindow;
1268 bchanl->externalbbswindow = externalbbswindow;
1273 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
1275 bchanlhmi_deleteexternalbbswindow(hmi, externalbbswindow);
1276 error_externalbbswindow:
1277 bchanlhmi_deleteregisterexternalwindow(hmi, registerexternalwindow);
1278 error_registerexternalwindow:
1279 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
1280 error_bbsmenuwindow:
1281 bchanlhmi_deletesubjectoptionwindow(hmi, subjectoptionwindow);
1282 error_subjectoptionwindow:
1283 bchanl_subjecthash_delete(subjecthash);
1285 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
1286 error_subjectwindow:
1287 bchanlhmi_delete(hmi);
1289 sbjtretriever_delete(retriever);
1291 http_connector_delete(connector);
1292 error_http_connector:
1293 return -1; /* TODO */
1296 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
1298 gset_ptr(PS_BUSY, NULL, -1, -1);
1301 extbbslist_writefile(bchanl->bbsmenu.extbbslist);
1302 if (bchanl->exectype == EXECREQ) {
1303 oend_prc(bchanl->vid, NULL, 0);
1305 bchanl_mainmenu_finalize(&bchanl->mainmenu);
1306 bchanlhmi_deleteexternalbbswindow(bchanl->hmi, bchanl->externalbbswindow);
1307 bchanlhmi_deleteregisterexternalwindow(bchanl->hmi, bchanl->registerexternalwindow);
1308 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
1309 bchanlhmi_deletesubjectoptionwindow(bchanl->hmi, bchanl->subjectoptionwindow);
1310 bchanl_subjecthash_delete(bchanl->subjecthash);
1311 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
1312 bchanlhmi_delete(bchanl->hmi);
1313 sbjtretriever_delete(bchanl->retriever);
1314 http_connector_delete(bchanl->connector);
1319 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
1321 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};
1326 bbsmncache_t *cache = bchanl->cache;
1327 bbsmndraw_t *draw = bchanl->draw;
1329 err = get_lnk(fname, &lnk, F_NORM);
1331 DP_ER("error get_lnk", err);
1334 fd = opn_fil(&lnk, F_READ, NULL);
1338 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
1348 err = rea_rec(fd, 0, bin, len, 0, NULL);
1356 bbsmncache_appenddata(cache, bin, len);
1359 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
1361 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
1362 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1363 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
1366 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1368 W l,t,r,b,l1,t1,r1,b1,scr;
1369 sbjtlayout_t *layout;
1372 if (bchanl->currentsubject == NULL) {
1375 draw = bchanl_subject_getdraw(bchanl->currentsubject);
1379 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1385 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1386 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1389 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1390 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1391 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1398 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1399 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1403 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1404 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1405 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1412 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1413 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1417 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1423 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1424 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1427 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1433 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1434 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1437 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1438 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1439 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1440 if (b + (b - t) > b1) {
1446 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
1447 bchanl_subjectwindow_scroll(bchanl, 0, scr);
1451 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1452 layout = bchanl_subject_getlayout(bchanl->currentsubject);
1453 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1454 if (r + (r - l) > r1) {
1460 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1461 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1465 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
1471 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
1472 bchanl_subjectwindow_scroll(bchanl, scr, 0);
1474 case TK_E: /* temporary */
1475 if (stat & ES_CMD) {
1476 bchanl_killme(bchanl);
1482 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
1484 W l,t,r,b,l1,t1,r1,b1,scr;
1485 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
1486 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
1490 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1496 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1497 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1500 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1501 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1508 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1509 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1516 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1522 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1523 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1526 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1527 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1528 if (b + (b - t) > b1) {
1534 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1535 bchanl_bbsmenuwindow_scroll(bchanl, 0, scr);
1542 bchanl_networkrequest_bbsmenu(bchanl);
1544 case TK_E: /* temporary */
1545 if (stat & ES_CMD) {
1546 bchanl_killme(bchanl);
1553 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1557 act = subjectwindow_isactive(bchanl->subjectwindow);
1559 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1562 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1564 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1569 enum BCHANL_TEXTBOX_MENU_TYPE_ {
1570 BCHANL_TEXTBOX_MENU_TYPE_NONE,
1571 BCHANL_TEXTBOX_MENU_TYPE_FILTER,
1572 BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE,
1573 BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL,
1575 typedef enum BCHANL_TEXTBOX_MENU_TYPE_ BCHANL_TEXTBOX_MENU_TYPE;
1577 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl, BCHANL_TEXTBOX_MENU_TYPE type)
1579 Bool isopen, isopen_extbbs, selected = False, fromtray, totray, trayempty;
1582 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1583 isopen_extbbs = externalbbswindow_isopen(bchanl->externalbbswindow);
1584 if (isopen_extbbs != False) {
1585 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1591 case BCHANL_TEXTBOX_MENU_TYPE_NONE:
1593 fromtray = totray = False;
1595 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1596 trayempty = tray_isempty();
1597 if (trayempty == False) {
1602 num = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, NULL, 0, False);
1609 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1610 trayempty = tray_isempty();
1611 if (trayempty == False) {
1616 num = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, NULL, 0, False);
1623 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1624 trayempty = tray_isempty();
1625 if (trayempty == False) {
1630 num = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, NULL, 0, False);
1639 bchanl_mainmenu_setup(&bchanl->mainmenu, isopen, isopen_extbbs, selected, fromtray, totray, bchanl->subjectdisplay.resnum, bchanl->subjectdisplay.since, bchanl->subjectdisplay.vigor);
1642 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel, BCHANL_TEXTBOX_MENU_TYPE type)
1646 #define BCHANL_SELECTMENU_STRBUF_LENGTH 256
1647 TC str[BCHANL_SELECTMENU_STRBUF_LENGTH];
1651 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1652 bchanl_killme(bchanl);
1654 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1655 subjectwindow_requestredisp(bchanl->subjectwindow);
1656 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1658 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1659 bchanl_networkrequest_bbsmenu(bchanl);
1661 case BCHANL_MAINMENU_SELECT_SUBJECTOPTION: /* [¥¹¥ì°ìÍ÷ÀßÄê] */
1662 isopen = subjectoptionwindow_isopen(bchanl->subjectoptionwindow);
1663 if (isopen == False) {
1664 subjectoptionwindow_open(bchanl->subjectoptionwindow);
1666 subjectoptionwindow_close(bchanl->subjectoptionwindow);
1669 case BCHANL_MAINMENU_SELECT_EXTBBS_MANAGER: /* [³°ÉôÈĤÎÄɲÃ] */
1670 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1671 if (isopen == False) {
1673 bchanl->bbsmenu.editctx = extbbslist_startedit(bchanl->bbsmenu.extbbslist);
1674 if (bchanl->bbsmenu.editctx == NULL) {
1677 externalbbswindow_open(bchanl->externalbbswindow);
1678 externalbbswindow_getworkrect(bchanl->externalbbswindow, &work);
1679 extbbslist_editcontext_setviewrect(bchanl->bbsmenu.editctx, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1680 externalbbswindow_setworkrect(bchanl->externalbbswindow, 0, 0, work.c.right - work.c.left, work.c.bottom - work.c.top);
1683 case BCHANL_MAINMENU_SELECT_EXTBBS_REGISTER:
1684 isopen = registerexternalwindow_isopen(bchanl->registerexternalwindow);
1685 if (isopen == False) {
1686 registerexternalwindow_open(bchanl->registerexternalwindow);
1689 case BCHANL_MAINMENU_SELECT_EXTBBS_UP:
1690 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1691 if (isopen != False) {
1692 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1696 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index-1, index);
1697 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1700 case BCHANL_MAINMENU_SELECT_EXTBBS_DOWN:
1701 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1702 if (isopen != False) {
1703 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1707 extbbslist_editcontext_swapitem(bchanl->bbsmenu.editctx, index, index+1);
1708 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1711 case BCHANL_MAINMENU_SELECT_EXTBBS_DELETE:
1712 isopen = externalbbswindow_isopen(bchanl->externalbbswindow);
1713 if (isopen != False) {
1714 index = extbbslist_editcontext_getselect(bchanl->bbsmenu.editctx);
1718 extbbslist_editcontext_deleteitem(bchanl->bbsmenu.editctx, index);
1719 externalbbswindow_requestredisp(bchanl->externalbbswindow);
1722 case BCHANL_MAINMENU_SELECT_EDIT_COPY_TO_TRAY:
1724 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1725 len = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1727 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1728 len = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1730 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1731 len = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, False);
1737 tray_pushstring(str, len);
1740 case BCHANL_MAINMENU_SELECT_EDIT_COPY_FROM_TRAY:
1741 len = tray_popstring(str, BCHANL_SELECTMENU_STRBUF_LENGTH);
1743 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1744 subjectoptionwindow_insertfiltertext(bchanl->subjectoptionwindow, str, len);
1746 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1747 registerexternalwindow_insertboradnametext(bchanl->registerexternalwindow, str, len);
1749 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1750 registerexternalwindow_inserturltext(bchanl->registerexternalwindow, str, len);
1756 case BCHANL_MAINMENU_SELECT_EDIT_MOVE_TO_TRAY:
1758 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1759 len = subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1761 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1762 len = registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1764 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1765 len = registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1771 tray_pushstring(str, len);
1774 case BCHANL_MAINMENU_SELECT_EDIT_MOVE_FROM_TRAY:
1775 len = tray_popstring(str, BCHANL_SELECTMENU_STRBUF_LENGTH);
1777 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1778 subjectoptionwindow_insertfiltertext(bchanl->subjectoptionwindow, str, len);
1780 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1781 registerexternalwindow_insertboradnametext(bchanl->registerexternalwindow, str, len);
1783 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1784 registerexternalwindow_inserturltext(bchanl->registerexternalwindow, str, len);
1791 case BCHANL_MAINMENU_SELECT_EDIT_DELETE:
1793 case BCHANL_TEXTBOX_MENU_TYPE_FILTER:
1794 subjectoptionwindow_cutfiltertext(bchanl->subjectoptionwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1796 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE:
1797 registerexternalwindow_cutboradnametext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1799 case BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL:
1800 registerexternalwindow_cuturltext(bchanl->registerexternalwindow, str, BCHANL_SELECTMENU_STRBUF_LENGTH, True);
1806 case BCHANL_MAINMENU_SELECT_DISPLAY_RESNUMBER:
1807 bchanl_swapresnumberdisplay(bchanl);
1808 if (bchanl->currentsubject != NULL) {
1809 bchanl_subject_setresnumberdisplay(bchanl->currentsubject, bchanl->subjectdisplay.resnum);
1810 bchanl_changedisplayattribute(bchanl);
1813 case BCHANL_MAINMENU_SELECT_DISPLAY_SINCE:
1814 bchanl_swapsincedisplay(bchanl);
1815 if (bchanl->currentsubject != NULL) {
1816 bchanl_subject_setsincedisplay(bchanl->currentsubject, bchanl->subjectdisplay.since);
1817 bchanl_changedisplayattribute(bchanl);
1820 case BCHANL_MAINMENU_SELECT_DISPLAY_VIGOR:
1821 bchanl_swapvigordisplay(bchanl);
1822 if (bchanl->currentsubject != NULL) {
1823 bchanl_subject_setvigordisplay(bchanl->currentsubject, bchanl->subjectdisplay.vigor);
1824 bchanl_changedisplayattribute(bchanl);
1831 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos, BCHANL_TEXTBOX_MENU_TYPE type)
1834 bchanl_setupmenu(bchanl, type);
1835 gset_ptr(PS_SELECT, NULL, -1, -1);
1836 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1838 bchanl_selectmenu(bchanl, sel, type);
1842 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode, BCHANL_TEXTBOX_MENU_TYPE type)
1845 bchanl_setupmenu(bchanl, type);
1846 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1848 bchanl_selectmenu(bchanl, sel, type);
1853 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1856 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1857 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1858 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1861 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1862 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1865 case BCHANL_MESSAGE_HTTP_EVENT:
1866 bchanl_handle_httpevent(bchanl);
1871 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1873 bchanlhmievent_t *evt;
1877 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1882 switch (evt->type) {
1883 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1885 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1886 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1887 bchanl_setupmenu(bchanl, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1888 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1890 bchanl_selectmenu(bchanl, sel, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1894 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1896 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
1897 bchanl_popupmenu(bchanl, evt->data.common_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_NONE);
1899 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
1900 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
1902 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_DRAW:
1903 bchanl_subjectwindow_draw(bchanl);
1905 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_RESIZE:
1906 bchanl_subjectwindow_resize(bchanl, evt->data.subjectwindow_resize.work_sz);
1908 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_CLOSE:
1909 bchanl_subjectwindow_close(bchanl);
1911 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_BUTDN:
1912 bchanl_subjectwindow_butdn(bchanl, evt->data.subjectwindow_butdn.type, evt->data.subjectwindow_butdn.pos);
1914 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_PASTE:
1915 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
1917 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_MOUSEMOVE:
1918 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1920 case BCHANLHMIEVENT_TYPE_SUBJECTWINDOW_SCROLL:
1921 bchanl_subjectwindow_scroll(bchanl, evt->data.subjectwindow_scroll.dh, evt->data.subjectwindow_scroll.dv);
1923 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_DRAW:
1924 bchanl_bbsmenuwindow_draw(bchanl);
1926 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_RESIZE:
1927 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenuwindow_resize.work_sz);
1929 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_CLOSE:
1930 bchanl_bbsmenuwindow_close(bchanl);
1932 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_BUTDN:
1933 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenuwindow_butdn.type, evt->data.bbsmenuwindow_butdn.pos);
1935 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_MOUSEMOVE:
1936 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1938 case BCHANLHMIEVENT_TYPE_BBSMENUWINDOW_SCROLL:
1939 bchanl_bbsmenuwindow_scroll(bchanl, evt->data.bbsmenuwindow_scroll.dh, evt->data.bbsmenuwindow_scroll.dv);
1941 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_DETERMINE:
1942 bchanl_changesubjectfilterword(bchanl, evt->data.subjectoptionwindow_filter_determine.value, evt->data.subjectoptionwindow_filter_determine.len);
1944 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_COPY:
1946 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MOVE:
1948 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_MENU:
1949 bchanl_popupmenu(bchanl, evt->data.subjectoptionwindow_filter_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_FILTER);
1951 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_FILTER_KEYMENU:
1952 bchanl_keyselect(bchanl, evt->data.subjectoptionwindow_filter_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_FILTER);
1954 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDER_CHANGE:
1955 bchanl_changesubjectorder(bchanl, evt->data.subjectoptionwindow_order_change.value);
1957 case BCHANLHMIEVENT_TYPE_SUBJECTOPTIONWINDOW_PARTS_ORDERBY_CHANGE:
1958 bchanl_changesubjectorderby(bchanl, evt->data.subjectoptionwindow_order_change.value);
1960 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_DETERMINE:
1962 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_COPY:
1964 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MOVE:
1966 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_MENU:
1967 bchanl_popupmenu(bchanl, evt->data.registerexternalwindow_boradname_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE);
1969 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_BORADNAME_KEYMENU:
1970 bchanl_keyselect(bchanl, evt->data.registerexternalwindow_boradname_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_TITLE);
1972 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_DETERMINE:
1974 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_COPY:
1976 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MOVE:
1978 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_MENU:
1979 bchanl_popupmenu(bchanl, evt->data.registerexternalwindow_url_menu.pos, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL);
1981 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_URL_KEYMENU:
1982 bchanl_keyselect(bchanl, evt->data.registerexternalwindow_url_keymenu.keycode, BCHANL_TEXTBOX_MENU_TYPE_EXTBBS_URL);
1984 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_DETERMINE_PUSH:
1985 close = bchanl_registerexternalbbs(bchanl);
1986 if (close != False) {
1987 registerexternalwindow_close(bchanl->registerexternalwindow);
1990 case BCHANLHMIEVENT_TYPE_REGISTEREXTERNALWINDOW_PARTS_CANCEL_PUSH:
1991 registerexternalwindow_close(bchanl->registerexternalwindow);
1993 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_DRAW:
1994 bchanl_externalbbswindow_draw(bchanl);
1996 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_RESIZE:
1998 bchanl_externalbbswindow_resize(bchanl, evt->data.externalbbswindow_resize.work_sz);
1999 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_CLOSE:
2000 bchanl_externalbbswindow_close(bchanl);
2002 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_BUTDN:
2003 bchanl_externalbbswindow_butdn(bchanl, evt->data.externalbbswindow_butdn.type, evt->data.externalbbswindow_butdn.pos);
2005 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_PASTE:
2006 bchanl_externalbbswindow_paste(bchanl);
2008 case BCHANLHMIEVENT_TYPE_EXTERNALBBSWINDOW_SCROLL:
2009 bchanl_externalbbswindow_scroll(bchanl, evt->data.externalbbswindow_scroll.dh, evt->data.externalbbswindow_scroll.dv);
2011 case BCHANLHMIEVENT_TYPE_NONE:
2015 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};
2016 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};
2017 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};
2019 LOCAL W main_CLI_args(VID *vid, LINK *storage)
2025 err = get_lnk(filename_dbg_databox, &dbx, F_NORM);
2027 DP_ER("get_lnk:test databox error", err);
2030 err = dopn_dat(&dbx);
2032 DP_ER("dopn_dat error", err);
2035 err = get_lnk(filename_dbg_storage, storage, F_NORM);
2037 DP_ER("get_lnk;commonstorage error", err);
2044 LOCAL W main_EXECREC_args(M_EXECREQ *msg, VID *vid, LINK *storage)
2049 err = dopn_dat(&msg->self);
2051 DP_ER("dopn_dat", err);
2056 err = get_lnk(filename_storage, &lnk, F_BASED);
2058 DP_ER("get_lnk;commonstorage error", err);
2068 typedef struct _arg {
2073 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
2080 len = src->msg_size / sizeof(TC);
2081 str = (TC*)(src->msg_body.ANYMSG.msg_str);
2084 if(str[i] == TK_KSP){
2090 if(str[i] == TK_KSP){
2097 argv = (TC**)malloc(sizeof(TC*)*ac);
2101 if(str[i] == TNULL){
2107 if(str[i] == TNULL){
2120 EXPORT W MAIN(MESSAGE *msg)
2128 err = dopn_dat(NULL);
2130 DP_ER("dopn_dat error:", err);
2134 switch (msg->msg_type) {
2136 arg = MESSAGEtoargv(msg);
2137 err = main_CLI_args(&vid, &storage);
2143 oend_req(((M_DISPREQ*)msg)->vid, -1);
2147 oend_req(((M_PASTEREQ*)msg)->vid, -1);
2151 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
2154 err = main_EXECREC_args((M_EXECREQ*)msg, &vid, &storage);
2164 err = bchanl_initialize(&bchanl, vid, msg->msg_type, &storage);
2166 DP_ER("bchanl_initialize error", err);
2169 err = bchanl_prepare_network(&bchanl);
2171 DP_ER("bchanl_prepare_network error", err);
2172 bchanl_killme(&bchanl);
2176 if (msg->msg_type == 0) {
2177 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
2178 } else if (msg->msg_type == EXECREQ) {
2179 bchanl_networkrequest_bbsmenu(&bchanl);
2182 subjectwindow_requestredisp(bchanl.subjectwindow);
2183 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
2186 bchanl_eventdispatch(&bchanl);