4 * Copyright (c) 2009-2011 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 "subjectlayout.h"
47 #include "bbsmenuretriever.h"
48 #include "bbsmenucache.h"
49 #include "bbsmenuparser.h"
50 #include "bbsmenufilter.h"
51 #include "bbsmenulayout.h"
53 #include "bchanl_subject.h"
54 #include "bchanl_hmi.h"
55 #include "bchanl_menus.h"
57 #ifdef BCHANL_CONFIG_DEBUG
58 # define DP(arg) printf arg
59 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
62 # define DP_ER(msg, err) /**/
65 #define BCHANL_DBX_MENU_TEST 20
66 #define BCHANL_DBX_TEXT_MLIST0 21
67 #define BCHANL_DBX_TEXT_MLIST1 22
68 #define BCHANL_DBX_TEXT_MLIST2 23
69 #define BCHANL_DBX_VIEWER_FUSEN 24
70 #define BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU 25
71 #define BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT 26
72 #define BCHANL_DBX_TEXT_MSG_RETRBBSMENU 27
73 #define BCHANL_DBX_TEXT_MSG_RETRSUBJECT 28
74 #define BCHANL_DBX_TEXT_MSG_ERRRETR 29
76 #define BCHANL_MENU_WINDOW 3
78 typedef struct bchanl_hmistate_t_ bchanl_hmistate_t;
79 struct bchanl_hmistate_t_ {
87 LOCAL VOID bchanl_hmistate_updateptrstyle(bchanl_hmistate_t *hmistate, PTRSTL ptr)
89 if (hmistate->ptr == ptr) {
93 gset_ptr(hmistate->ptr, NULL, -1, -1);
96 LOCAL VOID bchanl_hmistate_initialize(bchanl_hmistate_t *hmistate)
100 hmistate->ptr = PS_SELECT;
102 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRBBSMENU, (void**)&hmistate->msg_retr_bbsmenu);
104 DP_ER("dget_dtp: message retrieving error", err);
105 hmistate->msg_retr_bbsmenu = NULL;
107 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_RETRSUBJECT, (void**)&hmistate->msg_retr_subject);
109 DP_ER("dget_dtp: message not modified error", err);
110 hmistate->msg_retr_subject = NULL;
112 err = dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_MSG_ERRRETR, (void**)&hmistate->msg_error_retr);
114 DP_ER("dget_dtp: message retrieve error error", err);
115 hmistate->msg_error_retr = NULL;
119 typedef struct bchanl_bbsmenu_t_ bchanl_bbsmenu_t;
120 struct bchanl_bbsmenu_t_ {
123 bbsmnretriever_t *retriever;
125 bbsmnparser_t *parser;
126 bbsmnfilter_t *filter;
127 bbsmnlayout_t *layout;
130 bchanl_subjecthash_t *subjecthash;
137 bchanl_mainmenu_t mainmenu;
141 bchanl_hmistate_t hmistate;
143 sbjtretriever_t *retriever;
145 bchanl_subjecthash_t *subjecthash;
146 bchanl_bbsmenu_t bbsmenu;
147 bchanl_subject_t *currentsubject;
150 subjectwindow_t *subjectwindow;
151 bbsmenuwindow_t *bbsmenuwindow;
153 typedef struct bchanl_t_ bchanl_t;
155 LOCAL VOID bchanl_killme(bchanl_t *bchanl);
157 LOCAL VOID bchanl_subjectwindow_draw(bchanl_t *bchanl)
161 if (bchanl->currentsubject == NULL) {
163 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
166 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
167 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
169 draw = bchanl_subject_getdraw(bchanl->currentsubject);
171 if (subjectwindow_startredisp(bchanl->subjectwindow, &r) == 0) {
174 subjectwindow_eraseworkarea(bchanl->subjectwindow, &r);
175 sbjtdraw_draw(draw, &r);
176 } while (subjectwindow_endredisp(bchanl->subjectwindow) > 0);
180 LOCAL VOID bchanl_subjectwindow_scroll(VP arg, W dh, W dv)
182 bchanl_t *bchanl = (bchanl_t*)arg;
184 if (bchanl->currentsubject == NULL) {
187 draw = bchanl_subject_getdraw(bchanl->currentsubject);
188 sbjtdraw_scrollviewrect(draw, dh, dv);
189 subjectwindow_scrollworkarea(bchanl->subjectwindow, -dh, -dv);
190 bchanl_subjectwindow_draw(bchanl);
193 LOCAL VOID bchanl_subjectwindow_resize(bchanl_t *bchanl, SIZE newsize)
198 if (bchanl->currentsubject == NULL) {
201 draw = bchanl_subject_getdraw(bchanl->currentsubject);
203 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
208 sbjtdraw_setviewrect(draw, l, t, r, b);
209 subjectwindow_setworkrect(bchanl->subjectwindow, l, t, r, b);
211 bchanl_subjectwindow_draw(bchanl);
214 LOCAL VOID bchanl_subjectwindow_close(bchanl_t *bchanl)
216 bchanl_killme(bchanl);
219 LOCAL VOID bchanl_subjectwindow_press(bchanl_t *bchanl, PNT evpos)
221 sbjtparser_thread_t *thread;
224 W event_type, size, err, fsn_len, dx, dy;
227 PNT pos, p1, pos_butup;
234 if (bchanl->currentsubject == NULL) {
237 draw = bchanl_subject_getdraw(bchanl->currentsubject);
239 err = sbjtdraw_findthread(draw, evpos, &thread, &vframe);
244 gid = subjectwindow_startdrag(bchanl->subjectwindow);
246 DP_ER("wsta_drg error:", gid);
253 dx = vframe.c.left - evpos.x;
254 dy = vframe.c.top - evpos.y;
258 sel.rgn.r.c.left = vframe.c.left;
259 sel.rgn.r.c.top = vframe.c.top;
260 sel.rgn.r.c.right = vframe.c.right;
261 sel.rgn.r.c.bottom = vframe.c.bottom;
262 adsp_sel(gid, &sel, 1);
264 gset_ptr(PS_GRIP, NULL, -1, -1);
266 event_type = subjectwindow_getdrag(bchanl->subjectwindow, &pos, &wid_butup, &pos_butup);
267 if (event_type == EV_BUTUP) {
270 if (event_type != EV_NULL) {
273 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
276 adsp_sel(gid, &sel, 0);
277 sel.rgn.r.c.left += pos.x - p1.x;
278 sel.rgn.r.c.top += pos.y - p1.y;
279 sel.rgn.r.c.right += pos.x - p1.x;
280 sel.rgn.r.c.bottom += pos.y - p1.y;
281 adsp_sel(gid, &sel, 1);
284 gset_ptr(PS_SELECT, NULL, -1, -1);
285 adsp_sel(gid, &sel, 0);
286 subjectwindow_enddrag(bchanl->subjectwindow);
288 /* BUTUP on self window or no window or system message panel */
289 if ((wid_butup == subjectwindow_getWID(bchanl->subjectwindow))||(wid_butup == 0)||(wid_butup == -1)) {
293 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
298 err = dget_dtp(64, BCHANL_DBX_VIEWER_FUSEN, (void**)&fsn);
300 DP_ER("dget_dtp: ", err);
303 fsn_len = dget_siz((B*)fsn);
304 err = bchanl_subject_createviewervobj(bchanl->currentsubject, thread, fsn, fsn_len, &vrec.vseg, (LINK*)&vrec.vlnk);
306 DP_ER("bchanl_subject_createviewervobj error", err);
309 if (err == BCHANL_SUBJECT_CREATEVIEWERVOBJ_CANCELED) {
315 tr_rec.len = sizeof(TR_VOBJREC);
316 tr_rec.dt = (B*)&vrec;
317 err = tset_dat(&tr_rec, 1);
319 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
321 DP_ER("error del_fil:", err);
326 paste_ev.r.type = EV_REQUEST;
327 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
328 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
329 paste_ev.r.cmd = W_PASTE;
330 paste_ev.r.wid = wid_butup;
331 err = wsnd_evt(&paste_ev);
334 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
336 DP_ER("error del_fil:", err);
340 err = wwai_rsp(NULL, W_PASTE, 60000);
343 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
345 DP_ER("error del_fil:", err);
349 wswi_wnd(wid_butup, NULL);
352 LOCAL VOID bchanl_subjectwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
361 bchanl_subjectwindow_press(bchanl, evpos);
365 LOCAL VOID bchanl_setcurrentsubject(bchanl_t *bchanl, bchanl_subject_t *sbjt)
367 bchanl->currentsubject = sbjt;
368 subjectwindow_requestredisp(bchanl->subjectwindow);
371 LOCAL VOID bchanl_bbsmenuwindow_draw(bchanl_t *bchanl)
375 if (bbsmenuwindow_startredisp(bchanl->bbsmenuwindow, &r) == 0) {
378 bbsmenuwindow_eraseworkarea(bchanl->bbsmenuwindow, &r);
379 bbsmndraw_draw(bchanl->bbsmenu.draw, &r);
380 } while (bbsmenuwindow_endredisp(bchanl->bbsmenuwindow) > 0);
383 LOCAL VOID bchanl_bbsmenuwindow_scroll(VP arg, W dh, W dv)
385 bchanl_t *bchanl = (bchanl_t*)arg;
386 bbsmndraw_scrollviewrect(bchanl->bbsmenu.draw, dh, dv);
387 bbsmenuwindow_scrollworkarea(bchanl->bbsmenuwindow, -dh, -dv);
388 bchanl_bbsmenuwindow_draw(bchanl);
391 LOCAL VOID bchanl_bbsmenuwindow_resize(bchanl_t *bchanl, SIZE newsize)
395 bbsmndraw_getviewrect(bchanl->bbsmenu.draw, &l, &t, &r, &b);
400 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, l, t, r, b);
401 bbsmenuwindow_setworkrect(bchanl->bbsmenuwindow, l, t, r, b);
403 bchanl_bbsmenuwindow_draw(bchanl);
406 LOCAL VOID bchanl_bbsmenuwindow_close(bchanl_t *bchanl)
408 bchanl_killme(bchanl);
411 LOCAL VOID bchanl_sendsubjectrequest(bchanl_t *bchanl, bchanl_subject_t *subject)
414 sbjtlayout_t *layout;
418 W l, t, r, b, title_len, err;
420 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
421 pdsp_msg(bchanl->hmistate.msg_retr_subject);
423 cache = bchanl_subject_getcache(subject);
424 err = sbjtretriever_sendrequest(bchanl->retriever, cache);
426 pdsp_msg(bchanl->hmistate.msg_error_retr);
427 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
432 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
434 bchanl_subject_relayout(subject);
436 bchanl_setcurrentsubject(bchanl, subject);
438 subjectwindow_getworkrect(bchanl->subjectwindow, &w_work);
439 draw = bchanl_subject_getdraw(subject);
440 sbjtdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
441 subjectwindow_setworkrect(bchanl->subjectwindow, 0, 0, w_work.c.right, w_work.c.bottom);
443 layout = bchanl_subject_getlayout(subject);
444 sbjtlayout_getdrawrect(layout, &l, &t, &r, &b);
445 subjectwindow_setdrawrect(bchanl->subjectwindow, l, t, r, b);
447 bchanl_subject_gettitle(subject, &title, &title_len);
448 subjectwindow_settitle(bchanl->subjectwindow, title);
451 LOCAL VOID bchanl_bbsmenuwindow_click(bchanl_t *bchanl, PNT pos)
453 bbsmnparser_item_t *item;
454 bchanl_subject_t *subject;
457 W host_len, board_len;
461 fnd = bbsmndraw_findboard(bchanl->bbsmenu.draw, pos, &item);
466 if (item->category != NULL) {
469 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
470 subject = bchanl_subjecthash_search(bchanl->subjecthash, host, host_len, board, board_len);
471 if (subject == NULL) {
472 DP(("not found by subject hash"));
475 bchanl_subject_gettitle(subject, &title, &title_len);
477 bchanl_sendsubjectrequest(bchanl, subject);
480 LOCAL VOID bchanl_bbsmenuwindow_butdn(bchanl_t *bchanl, W dck, PNT evpos)
489 bchanl_bbsmenuwindow_click(bchanl, evpos);
493 LOCAL W bchanl_bbsmenu_initialize(bchanl_bbsmenu_t *bchanl, GID gid, bchanl_subjecthash_t *subjecthash)
495 bbsmnretriever_t *retriever;
497 bbsmnparser_t *parser;
498 bbsmnfilter_t *filter;
499 bbsmnlayout_t *layout;
502 cache = bbsmncache_new();
506 retriever = bbsmnretriever_new();
507 if (retriever == NULL) {
508 goto error_retriever;
510 parser = bbsmnparser_new(cache);
511 if (parser == NULL) {
514 filter = bbsmnfilter_new();
515 if (filter == NULL) {
518 layout = bbsmnlayout_new(gid);
519 if (layout == NULL) {
522 draw = bbsmndraw_new(layout);
528 bchanl->retriever = retriever;
529 bchanl->cache = cache;
530 bchanl->parser = parser;
531 bchanl->filter = filter;
532 bchanl->layout = layout;
534 bchanl->subjecthash = subjecthash;
539 bbsmnlayout_delete(layout);
541 bbsmnfilter_delete(filter);
543 bbsmnparser_delete(parser);
545 bbsmnretriever_delete(retriever);
547 bbsmncache_delete(cache);
549 return -1; /* TODO */
552 LOCAL W bchanl_bbsmenu_appenditemtohash(bchanl_bbsmenu_t *bchanl, bbsmnparser_item_t *item)
556 W host_len, board_len;
558 bbsmnparser_item_gethostboard(item, &host, &host_len, &board, &board_len);
559 err = bchanl_subjecthash_append(bchanl->subjecthash, host, host_len, board, board_len, item->title, item->title_len);
563 LOCAL VOID bchanl_bbsmenu_relayout(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *window)
565 W err, l, t, r, b, ret;
566 bbsmnparser_t *parser = bchanl->parser;
567 bbsmnparser_item_t *item;
568 bbsmnfilter_t *filter = bchanl->filter;
569 bbsmnlayout_t *layout = bchanl->layout;
571 bbsmnlayout_clear(layout);
572 bbsmnfilter_clear(filter);
573 bbsmnparser_clear(parser);
576 err = bbsmnparser_getnextitem(parser, &item);
580 bbsmnfilter_inputitem(filter, item);
582 ret = bbsmnfilter_outputitem(filter, &item);
584 if (item->category == NULL) {
585 err = bchanl_bbsmenu_appenditemtohash(bchanl, item);
590 err = bbsmnlayout_appenditem(layout, item);
595 if (ret != BBSMNFILTER_OUTPUTITEM_CONTINUE) {
599 if (ret == BBSMNFILTER_OUTPUTITEM_END) {
603 if (ret != BBSMNFILTER_OUTPUTITEM_WAITNEXT) {
615 bbsmnlayout_getdrawrect(bchanl->layout, &l, &t, &r, &b);
616 bbsmenuwindow_setdrawrect(window, l, t, r, b);
618 bbsmenuwindow_requestredisp(window);
621 #define BCHANL_MESSAGE_RETRIEVER_RELAYOUT 1
622 #define BCHANL_MESSAGE_RETRIEVER_ERROR -1
624 LOCAL VOID bchanl_retriever_task(W arg)
627 bbsmnretriever_t *retr;
631 bchanl = (bchanl_t*)arg;
632 retr = bchanl->bbsmenu.retriever;
633 cache = bchanl->bbsmenu.cache;
636 DP(("before rcv_mbf %d\n", bchanl->mbfid));
637 err = rcv_mbf(bchanl->mbfid, (VP)&msg, T_FOREVER);
638 DP_ER("rcv_mbf error:",err);
643 err = bbsmnretriever_sendrequest(retr, cache);
646 case BBSMNRETRIEVER_REQUEST_ALLRELOAD:
647 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
650 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_ERROR);
651 DP_ER("bbsmnretreiver_request error",err);
659 LOCAL W bchanl_prepare_network(bchanl_t *bchanl)
661 if (bchanl->retriever == NULL) {
665 bchanl->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
666 if (bchanl->mbfid < 0) {
667 DP_ER("error cre_mbf:", bchanl->mbfid);
670 bchanl->taskid = cre_tsk(bchanl_retriever_task, -1, (W)bchanl);
671 if (bchanl->taskid < 0) {
672 del_mbf(bchanl->mbfid);
674 DP_ER("error cre_tsk:", bchanl->taskid);
681 LOCAL W bchanl_networkrequest_bbsmenu(bchanl_t *bchanl)
684 static UW lastrequest = 0;
687 if (bchanl->mbfid < 0) {
691 err = get_etm(&etime);
693 DP_ER("get_etm error:", err);
696 if (lastrequest + 10000 > etime) {
701 err = snd_mbf(bchanl->mbfid, &msg, sizeof(W), T_FOREVER);
703 DP_ER("snd_mbf error:", err);
707 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_BUSY);
708 pdsp_msg(bchanl->hmistate.msg_retr_bbsmenu);
713 LOCAL W bchanl_initialize(bchanl_t *bchanl, VID vid, W exectype)
715 static RECT r0 = {{400, 100, 700+7, 200+30}};
716 static RECT r1 = {{100, 100, 300+7, 300+30}};
717 TC *title0 = NULL, *title1 = NULL;
722 sbjtretriever_t *retriever;
724 bchanl_subjecthash_t *subjecthash;
725 subjectwindow_t *subjectwindow;
726 bbsmenuwindow_t *bbsmenuwindow;
728 retriever = sbjtretriever_new();
729 if (retriever == NULL) {
730 DP_ER("sbjtretriever_new error", 0);
731 goto error_retriever;
733 hmi = bchanlhmi_new();
735 DP_ER("bchanlhmi_new error", 0);
736 goto error_bchanlhmi;
738 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_SUBJECT, (void**)&title0);
739 subjectwindow = bchanlhmi_newsubjectwindow(hmi, &r0, title0, NULL, bchanl_subjectwindow_scroll, bchanl);
740 if (subjectwindow == NULL) {
741 DP_ER("bchanlhmi_newsubjectwindow error", 0);
742 goto error_subjectwindow;
744 gid = subjectwindow_getGID(subjectwindow);
745 subjecthash = bchanl_subjecthash_new(gid, 100);
746 if (subjecthash == NULL) {
747 DP_ER("bchanl_subjecthash_new error", 0);
748 goto error_subjecthash;
750 dget_dtp(TEXT_DATA, BCHANL_DBX_TEXT_WINDOWTITLE_BBSMENU, (void**)&title1);
751 bbsmenuwindow = bchanlhmi_newbbsmenuwindow(hmi, &r1, title1, NULL, bchanl_bbsmenuwindow_scroll, bchanl);
752 if (bbsmenuwindow == NULL) {
753 DP_ER("bchanlhmi_newbbsmenuwindow error", 0);
754 goto error_bbsmenuwindow;
756 gid = bbsmenuwindow_getGID(bbsmenuwindow);
757 err = bchanl_bbsmenu_initialize(&(bchanl->bbsmenu), gid, subjecthash);
759 DP_ER("bchanl_bbsmenu_initialize error", err);
762 err = bchanl_mainmenu_initialize(&(bchanl->mainmenu), BCHANL_DBX_MENU_TEST);
764 DP_ER("bchanl_mainmenu_initialize %d", err);
768 bchanl_hmistate_initialize(&bchanl->hmistate);
770 if (exectype == EXECREQ) {
771 wid = bbsmenuwindow_getWID(bbsmenuwindow);
775 bbsmenuwindow_getworkrect(bbsmenuwindow, &w_work);
776 bbsmndraw_setviewrect(bchanl->bbsmenu.draw, 0, 0, w_work.c.right, w_work.c.bottom);
777 bbsmenuwindow_setworkrect(bbsmenuwindow, 0, 0, w_work.c.right, w_work.c.bottom);
779 bchanl->retriever = retriever;
780 bchanl->subjecthash = subjecthash;
782 bchanl->currentsubject = NULL;
785 bchanl->exectype = exectype;
788 bchanl->subjectwindow = subjectwindow;
789 bchanl->bbsmenuwindow = bbsmenuwindow;
794 //bchanl_bbsmenu_finalize(&(bchanl->bbsmenu));
796 bchanlhmi_deletebbsmenuwindow(hmi, bbsmenuwindow);
798 bchanl_subjecthash_delete(subjecthash);
800 bchanlhmi_deletesubjectwindow(hmi, subjectwindow);
802 bchanlhmi_delete(hmi);
804 sbjtretriever_delete(retriever);
806 return -1; /* TODO */
809 LOCAL VOID bchanl_killme(bchanl_t *bchanl)
811 gset_ptr(PS_BUSY, NULL, -1, -1);
814 if (bchanl->exectype == EXECREQ) {
815 oend_prc(bchanl->vid, NULL, 0);
817 bchanl_mainmenu_finalize(&bchanl->mainmenu);
818 bchanlhmi_deletebbsmenuwindow(bchanl->hmi, bchanl->bbsmenuwindow);
819 bchanl_subjecthash_delete(bchanl->subjecthash);
820 bchanlhmi_deletesubjectwindow(bchanl->hmi, bchanl->subjectwindow);
821 bchanlhmi_delete(bchanl->hmi);
822 sbjtretriever_delete(bchanl->retriever);
827 LOCAL VOID bchanl_readbbsmenutestdata(bchanl_bbsmenu_t *bchanl, bbsmenuwindow_t *bchanl_window)
829 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};
834 bbsmncache_t *cache = bchanl->cache;
835 bbsmndraw_t *draw = bchanl->draw;
837 err = get_lnk(fname, &lnk, F_NORM);
839 DP_ER("error get_lnk", err);
842 fd = opn_fil(&lnk, F_READ, NULL);
846 err = rea_rec(fd, 0, NULL, 0, &len, NULL);
856 err = rea_rec(fd, 0, bin, len, 0, NULL);
864 bbsmncache_appenddata(cache, bin, len);
867 req_tmg(0, BCHANL_MESSAGE_RETRIEVER_RELAYOUT);
869 bbsmenuwindow_getworkrect(bchanl_window, &w_work);
870 bbsmndraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
871 bbsmenuwindow_setworkrect(bchanl_window, 0, 0, w_work.c.right, w_work.c.bottom);
874 LOCAL VOID bchanl_subjectwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
876 W l,t,r,b,l1,t1,r1,b1,scr;
877 sbjtlayout_t *layout;
880 if (bchanl->currentsubject == NULL) {
883 draw = bchanl_subject_getdraw(bchanl->currentsubject);
887 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
893 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
896 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
897 layout = bchanl_subject_getlayout(bchanl->currentsubject);
898 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
905 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
909 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
910 layout = bchanl_subject_getlayout(bchanl->currentsubject);
911 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
918 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
922 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
928 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
931 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
937 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
940 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
941 layout = bchanl_subject_getlayout(bchanl->currentsubject);
942 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
943 if (b + (b - t) > b1) {
949 subjectwindow_scrollbyvalue(bchanl->subjectwindow, 0, scr);
953 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
954 layout = bchanl_subject_getlayout(bchanl->currentsubject);
955 sbjtlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
956 if (r + (r - l) > r1) {
962 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
966 sbjtdraw_getviewrect(draw, &l, &t, &r, &b);
972 subjectwindow_scrollbyvalue(bchanl->subjectwindow, scr, 0);
974 case TK_E: /* temporary */
976 bchanl_killme(bchanl);
982 LOCAL VOID bchanl_bbsmenuwindow_keydwn(bchanl_t *bchanl, UH keycode, TC ch, UW stat)
984 W l,t,r,b,l1,t1,r1,b1,scr;
985 bbsmndraw_t *draw = bchanl->bbsmenu.draw;
986 bbsmnlayout_t *layout = bchanl->bbsmenu.layout;
990 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
996 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
999 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1000 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1007 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1014 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1020 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1023 bbsmndraw_getviewrect(draw, &l, &t, &r, &b);
1024 bbsmnlayout_getdrawrect(layout, &l1, &t1, &r1, &b1);
1025 if (b + (b - t) > b1) {
1031 bbsmenuwindow_scrollbyvalue(bchanl->bbsmenuwindow, 0, scr);
1038 bchanl_networkrequest_bbsmenu(bchanl);
1040 case TK_E: /* temporary */
1041 if (stat & ES_CMD) {
1042 bchanl_killme(bchanl);
1049 LOCAL VOID bchanl_keydwn(bchanl_t *bchanl, UH keytop, TC ch, UW stat)
1053 act = subjectwindow_isactive(bchanl->subjectwindow);
1055 bchanl_subjectwindow_keydwn(bchanl, keytop, ch, stat);
1058 act = bbsmenuwindow_isactive(bchanl->bbsmenuwindow);
1060 bchanl_bbsmenuwindow_keydwn(bchanl, keytop, ch, stat);
1065 LOCAL VOID bchanl_setupmenu(bchanl_t *bchanl)
1067 bchanl_mainmenu_setup(&bchanl->mainmenu);
1070 LOCAL VOID bchanl_selectmenu(bchanl_t *bchanl, W sel)
1073 case BCHANL_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1074 bchanl_killme(bchanl);
1076 case BCHANL_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1077 subjectwindow_requestredisp(bchanl->subjectwindow);
1078 bbsmenuwindow_requestredisp(bchanl->bbsmenuwindow);
1080 case BCHANL_MAINMENU_SELECT_BBSMENUFETCH: /* [ÈÄ°ìÍ÷ºÆ¼èÆÀ] */
1081 bchanl_networkrequest_bbsmenu(bchanl);
1087 LOCAL VOID bchanl_popupmenu(bchanl_t *bchanl, PNT pos)
1090 bchanl_setupmenu(bchanl);
1091 gset_ptr(PS_SELECT, NULL, -1, -1);
1092 sel = bchanl_mainmenu_popup(&bchanl->mainmenu, pos);
1094 bchanl_selectmenu(bchanl, sel);
1098 LOCAL W bchanl_keyselect(bchanl_t *bchanl, TC keycode)
1101 bchanl_setupmenu(bchanl);
1102 sel = bchanl_mainmenu_keyselect(&bchanl->mainmenu, keycode);
1104 bchanl_selectmenu(bchanl, sel);
1109 LOCAL VOID bchanl_handletimeout(bchanl_t *bchanl, W code)
1112 case BCHANL_MESSAGE_RETRIEVER_RELAYOUT:
1113 bchanl_bbsmenu_relayout(&bchanl->bbsmenu, bchanl->bbsmenuwindow);
1114 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1117 case BCHANL_MESSAGE_RETRIEVER_ERROR:
1118 bchanl_hmistate_updateptrstyle(&bchanl->hmistate, PS_SELECT);
1124 LOCAL VOID bchanl_eventdispatch(bchanl_t *bchanl)
1126 bchanlhmievent_t *evt;
1129 err = bchanlhmi_getevent(bchanl->hmi, &evt);
1134 switch (evt->type) {
1135 case BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1137 case BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN:
1138 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1139 bchanl_setupmenu(bchanl);
1140 sel = bchanl_keyselect(bchanl, evt->data.common_keydown.keycode);
1142 bchanl_selectmenu(bchanl, sel);
1146 bchanl_keydwn(bchanl, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1148 case BCHANLHMIEVENT_TYPE_COMMON_MENU:
1149 bchanl_popupmenu(bchanl, evt->data.common_menu.pos);
1151 case BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT:
1152 bchanl_handletimeout(bchanl, evt->data.common_timeout.code);
1154 case BCHANLHMIEVENT_TYPE_SUBJECT_DRAW:
1155 bchanl_subjectwindow_draw(bchanl);
1157 case BCHANLHMIEVENT_TYPE_SUBJECT_RESIZE:
1158 bchanl_subjectwindow_resize(bchanl, evt->data.subject_resize.work_sz);
1160 case BCHANLHMIEVENT_TYPE_SUBJECT_CLOSE:
1161 bchanl_subjectwindow_close(bchanl);
1163 case BCHANLHMIEVENT_TYPE_SUBJECT_BUTDN:
1164 bchanl_subjectwindow_butdn(bchanl, evt->data.subject_butdn.type, evt->data.subject_butdn.pos);
1166 case BCHANLHMIEVENT_TYPE_SUBJECT_PASTE:
1167 subjectwindow_responsepasterequest(bchanl->subjectwindow, /* NACK */ 1, NULL);
1169 case BCHANLHMIEVENT_TYPE_SUBJECT_SWITCH:
1170 if (evt->data.subject_switch.needdraw == True) {
1171 bchanl_subjectwindow_draw(bchanl);
1174 case BCHANLHMIEVENT_TYPE_SUBJECT_MOUSEMOVE:
1175 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1177 case BCHANLHMIEVENT_TYPE_BBSMENU_DRAW:
1178 bchanl_bbsmenuwindow_draw(bchanl);
1180 case BCHANLHMIEVENT_TYPE_BBSMENU_RESIZE:
1181 bchanl_bbsmenuwindow_resize(bchanl, evt->data.bbsmenu_resize.work_sz);
1183 case BCHANLHMIEVENT_TYPE_BBSMENU_CLOSE:
1184 bchanl_bbsmenuwindow_close(bchanl);
1186 case BCHANLHMIEVENT_TYPE_BBSMENU_BUTDN:
1187 bchanl_bbsmenuwindow_butdn(bchanl, evt->data.bbsmenu_butdn.type, evt->data.bbsmenu_butdn.pos);
1189 case BCHANLHMIEVENT_TYPE_BBSMENU_PASTE:
1190 bbsmenuwindow_responsepasterequest(bchanl->bbsmenuwindow, /* NACK */ 1, NULL);
1192 case BCHANLHMIEVENT_TYPE_BBSMENU_SWITCH:
1193 if (evt->data.bbsmenu_switch.needdraw == True) {
1194 bchanl_bbsmenuwindow_draw(bchanl);
1197 case BCHANLHMIEVENT_TYPE_BBSMENU_MOUSEMOVE:
1198 gset_ptr(bchanl->hmistate.ptr, NULL, -1, -1);
1200 case BCHANLHMIEVENT_TYPE_NONE:
1204 typedef struct _arg {
1209 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1216 len = src->msg_size / sizeof(TC);
1217 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1220 if(str[i] == TK_KSP){
1226 if(str[i] == TK_KSP){
1233 argv = (TC**)malloc(sizeof(TC*)*ac);
1237 if(str[i] == TNULL){
1243 if(str[i] == TNULL){
1256 EXPORT W MAIN(MESSAGE *msg)
1264 err = dopn_dat(NULL);
1266 DP_ER("dopn_dat error:", err);
1270 switch (msg->msg_type) {
1272 arg = MESSAGEtoargv(msg);
1273 err = get_lnk((TC[]){TK_b, TK_c, TK_h, TK_a, TK_n, TK_l, TK_PROD, TK_d, TK_b, TK_x,TNULL}, &dbx, F_NORM);
1275 DP_ER("get_lnk:databox error", err);
1278 err = dopn_dat(&dbx);
1280 DP_ER("dopn_dat error", err);
1285 oend_req(((M_DISPREQ*)msg)->vid, -1);
1289 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1293 if ((((M_EXECREQ*)msg)->mode & 2) == 0) {
1296 err = dopn_dat(&((M_EXECREQ*)msg)->self);
1298 DP_ER("dopn_dat error", err);
1301 vid = ((M_EXECREQ*)msg)->vid;
1308 err = bchanl_initialize(&bchanl, vid, msg->msg_type);
1310 DP_ER("bchanl_initialize error", err);
1313 err = bchanl_prepare_network(&bchanl);
1315 DP_ER("bchanl_prepare_network error", err);
1316 bchanl_killme(&bchanl);
1320 if (msg->msg_type == 0) {
1321 bchanl_readbbsmenutestdata(&(bchanl.bbsmenu), bchanl.bbsmenuwindow);
1322 } else if (msg->msg_type == EXECREQ) {
1323 bchanl_networkrequest_bbsmenu(&bchanl);
1326 subjectwindow_requestredisp(bchanl.subjectwindow);
1327 bbsmenuwindow_requestredisp(bchanl.bbsmenuwindow);
1330 bchanl_eventdispatch(&bchanl);