4 * Copyright (c) 2009-2010 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
36 #include <btron/btron.h>
38 #include <btron/hmi.h>
39 #include <btron/vobj.h>
40 #include <btron/libapp.h>
41 #include <btron/bsocket.h>
50 #include "retriever.h"
53 #include "sjisstring.h"
54 #include "bchan_vobj.h"
55 #include "bchan_panels.h"
56 #include "bchan_menus.h"
58 #ifdef BCHAN_CONFIG_DEBUG
59 # define DP(arg) printf arg
60 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
63 # define DP_ER(msg, err) /**/
66 #define BCHAN_DBX_MENU_TEST 20
67 #define BCHAN_DBX_TEXT_MLIST0 21
68 #define BCHAN_DBX_TEXT_MLIST1 22
69 #define BCHAN_DBX_TEXT_MLIST2 23
70 #define BCHAN_DBX_MSGTEXT_RETRIEVING 24
71 #define BCHAN_DBX_MSGTEXT_NOTMODIFIED 25
72 #define BCHAN_DBX_MSGTEXT_POSTSUCCEED 26
73 #define BCHAN_DBX_MSGTEXT_POSTDENIED 27
74 #define BCHAN_DBX_MSGTEXT_POSTERROR 28
75 #define BCHAN_DBX_MS_CONFIRM_POST 29
76 #define BCHAN_DBX_MS_CONFIRM_CANCEL 30
77 #define BCHAN_DBX_TEXT_CONFIRM_TITLE 31
78 #define BCHAN_DBX_MSGTEXT_NONAUTHORITATIVE 32
79 #define BCHAN_DBX_MSGTEXT_NETWORKERROR 33
80 #define BCHAN_DBX_FFUSEN_BBB 34
81 #define BCHAN_DBX_FFUSEN_TEXEDIT 35
82 #define BCHAN_DBX_FFUSEN_VIEWER 36
83 #define BCHAN_DBX_MSGTEXT_NOTFOUND 37
84 #define BCHAN_DBX_MSGTEXT_CANTRETRIEVE 44
85 #define BCHAN_DBX_GMENU_RESNUMBER 45
86 #define BCHAN_DBX_GMENU_RESID 47
88 #define BCHAN_MENU_WINDOW 4
90 typedef struct bchan_hmistate_t_ bchan_hmistate_t;
91 struct bchan_hmistate_t_ {
96 TC *msg_nonauthoritative;
100 TC *msg_networkerror;
102 TC *msg_cantretrieve;
105 LOCAL VOID bchan_hmistate_updateptrstyle(bchan_hmistate_t *hmistate, PTRSTL ptr)
107 if (hmistate->ptr == ptr) {
111 gset_ptr(hmistate->ptr, NULL, -1, -1);
114 LOCAL VOID bchan_hmistate_display_postdenied(bchan_hmistate_t *hmistate, TC *str, W len)
119 size = tc_strlen(hmistate->msg_postdenied);
120 msg_len = size + len + 2;
121 msg = malloc((msg_len + 1)*sizeof(TC));
123 pdsp_msg(hmistate->msg_postdenied);
126 tc_strcpy(msg, hmistate->msg_postdenied);
128 memcpy((UB*)(msg + size + 1), str, len * sizeof(TC));
129 msg[msg_len - 1] = TK_RPAR;
130 msg[msg_len] = TNULL;
137 typedef struct bchan_t_ bchan_t;
146 Bool request_confirm_open; /* TODO: should be other implememt? */
151 bchan_hmistate_t hmistate;
152 bchan_resnumbermenu_t resnumbermenu;
153 bchan_residmenu_t residmenu;
155 datretriever_t *retriever;
162 cfrmwindow_t *confirm;
164 postresdata_t *resdata;
167 #define BCHAN_MESSAGE_RETRIEVER_UPDATE 1
168 #define BCHAN_MESSAGE_RETRIEVER_RELAYOUT 2
169 #define BCHAN_MESSAGE_RETRIEVER_NOTMODIFIED 3
170 #define BCHAN_MESSAGE_RETRIEVER_NONAUTHORITATIVE 4
171 #define BCHAN_MESSAGE_RETRIEVER_NOTFOUND 5
172 #define BCHAN_MESSAGE_RETRIEVER_ERROR -1
176 void killme(bchan_t *bchan)
178 gset_ptr(PS_BUSY, NULL, -1, -1);
180 bchan_residmenu_finalize(&bchan->residmenu);
181 bchan_resnumbermenu_finalize(&bchan->resnumbermenu);
182 if (bchan->exectype == EXECREQ) {
183 oend_prc(bchan->vid, NULL, 0);
185 if (bchan->wid > 0) {
186 wcls_wnd(bchan->wid, CLR);
191 LOCAL VOID bchan_scroll(VP arg, W dh, W dv)
193 bchan_t *bchan = (bchan_t*)arg;
194 datdraw_scrollviewrect(bchan->draw, dh, dv);
195 wscr_wnd(bchan->wid, NULL, -dh, -dv, W_MOVE|W_RDSET);
198 LOCAL VOID bchan_draw(VP arg, RECT *r)
200 bchan_t *bchan = (bchan_t*)arg;
201 datdraw_draw(bchan->draw, r);
204 LOCAL VOID bchan_resize(VP arg)
206 bchan_t *bchan = (bchan_t*)arg;
209 Bool workchange = False;
211 wget_wrk(bchan->wid, &work);
212 if (work.c.left != 0) {
216 if (work.c.top != 0) {
220 wset_wrk(bchan->wid, &work);
221 gset_vis(bchan->gid, work);
223 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
225 r = l + work.c.right - work.c.left;
226 b = t + work.c.bottom - work.c.top;
228 datdraw_setviewrect(bchan->draw, l, t, r, b);
229 datwindow_setworkrect(bchan->window, l, t, r, b);
231 if (workchange == True) {
232 wera_wnd(bchan->wid, NULL);
233 wreq_dsp(bchan->wid);
237 LOCAL VOID bchan_close(VP arg)
239 bchan_t *bchan = (bchan_t*)arg;
240 /* TODO: guard request event W_DELETE and W_FINISH. */
241 datcache_writefile(bchan->cache);
245 LOCAL VOID bchan_pushstringtotray(TC *str, W len)
250 TADSEG *base = (TADSEG*)bin;
251 TEXTSEG *textseg = (TEXTSEG*)(bin + 4);
255 textseg->view = (RECT){{0, 0, 0, 0}};
256 textseg->draw = (RECT){{0, 0, 0, 0}};
257 textseg->h_unit = -120;
258 textseg->v_unit = -120;
259 textseg->lang = 0x21;
262 trayrec[0].id = 0xE1;
265 trayrec[1].id = TR_TEXT;
266 trayrec[1].len = len * sizeof(TC);
267 trayrec[1].dt = (B*)str;
269 err = tpsh_dat(trayrec, 2, NULL);
271 DP_ER("tpsh_dat", err);
275 LOCAL VOID bchan_pushthreadtitle(bchan_t *bchan)
280 str = datlayout_gettitle(bchan->layout);
281 len = datlayout_gettitlelen(bchan->layout);
282 bchan_pushstringtotray(str, len);
285 LOCAL VOID bchan_pushthreadurl(bchan_t *bchan)
287 W host_len, board_len, thread_len, len, i, ret;
288 UB *host, *board, *thread;
291 datcache_gethost(bchan->cache, &host, &host_len);
292 datcache_getborad(bchan->cache, &board, &board_len);
293 datcache_getthread(bchan->cache, &thread, &thread_len);
295 len = 7 + host_len + 15 + board_len + 1 + thread_len + 1;
296 str = malloc(sizeof(TC)*len);
305 for (i = 0; i < host_len; i++) {
306 ret = sjtotc(str + 7 + i, host + i);
308 DP(("invalid charactor\n"));
313 str[7 + host_len] = TK_SLSH;
314 str[7 + host_len + 1] = TK_t;
315 str[7 + host_len + 2] = TK_e;
316 str[7 + host_len + 3] = TK_s;
317 str[7 + host_len + 4] = TK_t;
318 str[7 + host_len + 5] = TK_SLSH;
319 str[7 + host_len + 6] = TK_r;
320 str[7 + host_len + 7] = TK_e;
321 str[7 + host_len + 8] = TK_a;
322 str[7 + host_len + 9] = TK_d;
323 str[7 + host_len + 10] = TK_PROD;
324 str[7 + host_len + 11] = TK_c;
325 str[7 + host_len + 12] = TK_g;
326 str[7 + host_len + 13] = TK_i;
327 str[7 + host_len + 14] = TK_SLSH;
328 for (i = 0; i < board_len; i++) {
329 ret = sjtotc(str + 7 + host_len + 15 + i, board + i);
331 DP(("invalid charactor\n"));
336 str[7 + host_len + 15 + board_len] = TK_SLSH;
337 for (i = 0; i < thread_len; i++) {
338 ret = sjtotc(str + 7 + host_len + 15 + board_len + 1 + i, thread + i);
340 DP(("invalid charactor\n"));
345 str[7 + host_len + 15 + board_len + 1 + thread_len] = TK_SLSH;
347 bchan_pushstringtotray(str, len);
352 LOCAL Bool bchan_is_bbs_url(UB *data, W data_len)
355 W str_len, cmp, i, n_slsh = 0;
357 if ((tadurl_cmpscheme(data, data_len, "http", 4) != 0)
358 &&(tadurl_cmpscheme(data, data_len, "ttp", 3) != 0)) {
362 cmp = tadurl_cmppath(data, data_len, "test/read.cgi/", 14);
368 str_len = data_len/2;
377 if (str[i] == TK_SLSH) {
386 if (str[i] == TK_SLSH) {
389 if (tc_isdigit(str[i]) == 0) {
397 LOCAL W bchan_createvobj_allocate_url(UB *data, W data_len, TC **url, W *url_len)
402 if (tadurl_cmpscheme(data, data_len, "http", 4) == 0) {
406 return -1; /* TODO */
408 memcpy(str, data, data_len);
409 } else if (tadurl_cmpscheme(data, data_len, "ttp", 3) == 0) {
410 len = data_len + sizeof(TC)*1;
413 return -1; /* TODO */
415 memcpy(str + 1, data, data_len);
417 } else if (tadurl_cmpscheme(data, data_len, "sssp", 4) == 0) {
421 return -1; /* TODO */
423 memcpy(str + 4, data + 8, data_len - 8);
429 return -1; /* TODO */
433 *url_len = len/sizeof(TC);
438 LOCAL VOID bchan_separete_bbs_url(UB *url, W url_len, UB **host, W *host_len, UB **board, W *board_len, UB **thread, W *thread_len)
442 for (i=0; i < url_len; i++) {
452 for (; i < url_len; i++) {
462 for (; i < url_len; i++) {
472 for (; i < url_len; i++) {
484 for (; i < url_len; i++) {
496 #define BCHAN_CREATEVOBJ_CANCELED 0
497 #define BCHAN_CREATEVOBJ_CREATED 1
499 LOCAL W bchan_createvobj(bchan_t *bchan, UB *data, W data_len, VOBJSEG *vseg, LINK *lnk)
501 W err, fsn_bbb_len, fsn_texedit_len, fsn_viewer_len, url_len, ascii_url_len;
503 void *fsn_bbb, *fsn_texedit, *fsn_viewer;
505 UB *host, *board, *thread;
506 W host_len, board_len, thread_len;
509 TC title[] = {TK_T, TK_h, TK_r, TK_e, TK_a, TK_d, TNULL}; /* tmp */
511 err = dget_dtp(64, BCHAN_DBX_FFUSEN_BBB, (void**)&fsn_bbb);
513 DP_ER("dget_dtp: BCHAN_DBX_FFUSEN_BBB", err);
516 fsn_bbb_len = dget_siz((B*)fsn_bbb);
517 err = dget_dtp(64, BCHAN_DBX_FFUSEN_TEXEDIT, (void**)&fsn_texedit);
519 DP_ER("dget_dtp: BCHAN_DBX_FFUSEN_TEXEDIT", err);
522 fsn_texedit_len = dget_siz((B*)fsn_texedit);
523 err = dget_dtp(64, BCHAN_DBX_FFUSEN_VIEWER, (void**)&fsn_viewer);
525 DP_ER("dget_dtp: BCHAN_DBX_FFUSEN_VIEWER", err);
528 fsn_viewer_len = dget_siz((B*)fsn_viewer);
531 if(((*(UH*)data) & 0xFF80) == 0xFF80) {
532 lseg = (LTADSEG*)(data);
533 if (lseg->len == 0xffff) {
534 data += lseg->llen + 8;
535 data_len -= lseg->llen + 8;
537 data += lseg->len + 4;
538 data_len -= lseg->len + 4;
545 is_bbs = bchan_is_bbs_url(data, data_len);
546 if (is_bbs == True) {
549 err = sjstring_appendconvartingTCstring(&ascii_url, &ascii_url_len, (TC*)data, data_len/2);
554 bchan_separete_bbs_url(ascii_url, ascii_url_len, &host, &host_len, &board, &board_len, &thread, &thread_len);
555 err = bchan_createviewervobj(title, fsn_viewer, fsn_viewer_len, host, host_len, board, board_len, thread, thread_len, vseg, lnk);
562 err = bchan_createvobj_allocate_url(data, data_len, &url, &url_len);
564 DP_ER("bchan_createvobj_allocate_url", err);
568 err = bchan_createbbbvobj(fsn_bbb, fsn_bbb_len, fsn_texedit, fsn_texedit_len, (UB*)url, url_len*2, vseg, lnk);
570 DP_ER("bchan_createbbbvobj", err);
577 return BCHAN_CREATEVOBJ_CREATED;
580 LOCAL VOID bchan_scrollbyahcnor(bchan_t *bchan, UB *data, W data_len)
586 W cl, ct, cr, cb, tl, tt, tr, tb;
589 if(((*(UH*)data) & 0xFF80) == 0xFF80) {
590 lseg = (LTADSEG*)(data);
591 if (lseg->len == 0xffff) {
592 data += lseg->llen + 8;
593 data_len -= lseg->llen + 8;
595 data += lseg->len + 4;
596 data_len -= lseg->len + 4;
606 num = tc_atoi(str + 2);
607 DP(("num = %d\n", num));
609 fnd = datlayout_getthreadviewrectbyindex(bchan->layout, num - 1, &tl, &tt, &tr, &tb);
613 datdraw_getviewrect(bchan->draw, &cl, &ct, &cr, &cb);
614 datwindow_scrollbyvalue(bchan->window, 0 - cl, tt - ct);
617 LOCAL VOID bchan_butdn_pressnumber(bchan_t *bchan, WEVENT *wev, W resindex)
623 DP(("press DATDRAW_FINDACTION_TYPE_NUMBER: %d\n", resindex + 1));
624 pos.x = wev->s.pos.x;
625 pos.y = wev->s.pos.y;
626 gcnv_abs(bchan->gid, &pos);
627 err = bchan_resnumbermenu_select(&bchan->resnumbermenu, pos);
628 if (err == BCHAN_RESNUMBERMENU_SELECT_PUSHTRAY) {
629 size = datlayout_resindextotraytextdata(bchan->layout, resindex, NULL, 0);
634 datlayout_resindextotraytextdata(bchan->layout, resindex, data, size);
635 bchan_pushstringtotray((TC*)data, size/2);
640 LOCAL VOID bchan_butdn_pressresheaderid(bchan_t *bchan, WEVENT *wev, W resindex)
647 DP(("press DATDRAW_FINDACTION_TYPE_ID\n"));
649 datlayout_getidfromindex(bchan->layout, resindex, &id, &id_len);
651 DP((" id is not exist\n"));
655 pos.x = wev->s.pos.x;
656 pos.y = wev->s.pos.y;
657 gcnv_abs(bchan->gid, &pos);
658 err = bchan_residmenu_select(&bchan->residmenu, pos);
659 if (err == BCHAN_RESIDMENU_SELECT_PUSHTRAY) {
660 size = datlayout_idtotraytextdata(bchan->layout, id, id_len, NULL, 0);
665 datlayout_idtotraytextdata(bchan->layout, id, id_len, data, size);
666 bchan_pushstringtotray((TC*)data, size/2);
671 LOCAL VOID bchan_butdn(VP arg, WEVENT *wev)
673 bchan_t *bchan = (bchan_t*)arg;
674 W fnd, event_type, type, len, dx, dy, err, size, resindex;
685 /* TODO: change to same as bchanl's commonwindow */
686 switch (wchk_dck(wev->s.time)) {
688 fnd = datdraw_findaction(bchan->draw, wev->s.pos, &r, &type, &start, &len, &resindex);
692 if (type != DATDRAW_FINDACTION_TYPE_ANCHOR) {
695 bchan_scrollbyahcnor(bchan, start, len);
704 fnd = datdraw_findaction(bchan->draw, wev->s.pos, &r, &type, &start, &len, &resindex);
708 if (type == DATDRAW_FINDACTION_TYPE_NUMBER) {
709 bchan_butdn_pressnumber(bchan, wev, resindex);
712 if (type == DATDRAW_FINDACTION_TYPE_RESID) {
713 bchan_butdn_pressresheaderid(bchan, wev, resindex);
716 if (type != DATDRAW_FINDACTION_TYPE_URL) {
720 gid = wsta_drg(bchan->wid, 0);
722 DP_ER("wsta_drg error:", gid);
729 dx = r.c.left - wev->s.pos.x;
730 dy = r.c.top - wev->s.pos.y;
734 sel.rgn.r.c.left = r.c.left;
735 sel.rgn.r.c.top = r.c.top;
736 sel.rgn.r.c.right = r.c.right;
737 sel.rgn.r.c.bottom = r.c.bottom;
738 adsp_sel(gid, &sel, 1);
740 gset_ptr(PS_GRIP, NULL, -1, -1);
742 event_type = wget_drg(&pos, wev);
743 if (event_type == EV_BUTUP) {
744 wid_butup = wev->s.wid;
747 if (event_type != EV_NULL) {
750 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
753 adsp_sel(gid, &sel, 0);
754 sel.rgn.r.c.left += pos.x - p1.x;
755 sel.rgn.r.c.top += pos.y - p1.y;
756 sel.rgn.r.c.right += pos.x - p1.x;
757 sel.rgn.r.c.bottom += pos.y - p1.y;
758 adsp_sel(gid, &sel, 1);
761 gset_ptr(PS_SELECT, NULL, -1, -1);
762 adsp_sel(gid, &sel, 0);
765 /* BUTUP on self window or no window or system message panel */
766 if ((wid_butup == bchan->wid)||(wid_butup == 0)||(wid_butup == -1)) {
770 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
775 err = bchan_createvobj(bchan, start, len, &vrec.vseg, (LINK*)&vrec.vlnk);
777 DP_ER("bchan_createvobj error", err);
780 if (err == BCHAN_CREATEVOBJ_CANCELED) {
786 tr_rec.len = sizeof(TR_VOBJREC);
787 tr_rec.dt = (B*)&vrec;
788 err = tset_dat(&tr_rec, 1);
790 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
792 DP_ER("error del_fil:", err);
797 paste_ev.r.type = EV_REQUEST;
798 paste_ev.r.r.p.rightbot.x = wev->s.pos.x + dx;
799 paste_ev.r.r.p.rightbot.y = wev->s.pos.y + dy;
800 paste_ev.r.cmd = W_PASTE;
801 paste_ev.r.wid = wid_butup;
802 err = wsnd_evt(&paste_ev);
805 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
807 DP_ER("error del_fil:", err);
811 err = wwai_rsp(NULL, W_PASTE, 60000);
814 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
816 DP_ER("error del_fil:", err);
820 wswi_wnd(wid_butup, NULL);
822 /* temporary fix. to fix canceling layout. */
823 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
826 LOCAL W bchan_paste(VP arg, WEVENT *wev)
828 bchan_t *bchan = (bchan_t*)arg;
830 postresdata_t *post = NULL;
832 err = poptray_gettraydata(&post);
837 wev->r.r.p.rightbot.x = 0x8000;
838 wev->r.r.p.rightbot.y = 0x8000;
841 if (bchan->resdata != NULL) {
842 postresdata_delete(bchan->resdata);
844 bchan->resdata = post;
845 cfrmwindow_setpostresdata(bchan->confirm, post);
846 bchan->request_confirm_open = True;
852 LOCAL VOID bchan_recieveclose(VP arg, W send)
854 bchan_t *bchan = (bchan_t*)arg;
858 DP(("bchan_recieveclose = %d\n", send));
860 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_BUSY);
861 err = ressubmit_respost(bchan->submit, bchan->resdata, &dmsg, &dmsg_len);
862 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
864 case RESSUBMIT_RESPOST_SUCCEED:
865 pdsp_msg(bchan->hmistate.msg_postsucceed);
867 case RESSUBMIT_RESPOST_DENIED:
868 bchan_hmistate_display_postdenied(&bchan->hmistate, dmsg, dmsg_len);
870 case RESSUBMIT_RESPOST_ERROR_CLIENT:
871 case RESSUBMIT_RESPOST_ERROR_STATUS:
872 case RESSUBMIT_RESPOST_ERROR_CONTENT:
874 pdsp_msg(bchan->hmistate.msg_posterror);
883 LOCAL VOID bchan_hmistate_initialize(bchan_hmistate_t *hmistate)
887 hmistate->ptr = PS_SELECT;
889 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_RETRIEVING, (void**)&hmistate->msg_retrieving);
891 DP_ER("dget_dtp: message retrieving error", err);
892 hmistate->msg_retrieving = NULL;
894 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NOTMODIFIED, (void**)&hmistate->msg_notmodified);
896 DP_ER("dget_dtp: message not modified error", err);
897 hmistate->msg_notmodified = NULL;
899 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NONAUTHORITATIVE, (void**)&hmistate->msg_nonauthoritative);
901 DP_ER("dget_dtp: message non-authoritative error", err);
902 hmistate->msg_nonauthoritative = NULL;
904 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_POSTSUCCEED, (void**)&hmistate->msg_postsucceed);
906 DP_ER("dget_dtp: message post succeed error", err);
907 hmistate->msg_postsucceed = NULL;
909 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_POSTDENIED, (void**)&hmistate->msg_postdenied);
911 DP_ER("dget_dtp: message post denied error", err);
912 hmistate->msg_postdenied = NULL;
914 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_POSTERROR, (void**)&hmistate->msg_posterror);
916 DP_ER("dget_dtp: message post error error", err);
917 hmistate->msg_posterror = NULL;
919 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NETWORKERROR, (void**)&hmistate->msg_networkerror);
921 DP_ER("dget_dtp: message network error error", err);
922 hmistate->msg_networkerror = NULL;
924 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NOTFOUND, (void**)&hmistate->msg_notfound);
926 DP_ER("dget_dtp: message notfound error", err);
927 hmistate->msg_notfound = NULL;
929 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_CANTRETRIEVE, (void**)&hmistate->msg_cantretrieve);
931 DP_ER("dget_dtp: message cantretrieve error", err);
932 hmistate->msg_cantretrieve = NULL;
936 LOCAL W bchan_initialize(bchan_t *bchan, VID vid, WID wid, W exectype)
944 datretriever_t *retriever;
946 cfrmwindow_t *confirm;
947 MENUITEM *mnitem_dbx, *mnitem;
949 static RECT r0 = {{200, 80, 500+7, 230+30}};
955 cache = datcache_new(vid);
957 DP_ER("datcache_new error", 0);
960 parser = datparser_new(cache);
961 if (parser == NULL) {
962 DP_ER("datparser_new error", 0);
965 layout = datlayout_new(gid);
966 if (layout == NULL) {
967 DP_ER("datlayout_new error", 0);
970 draw = datdraw_new(layout);
972 DP_ER("datdraw_new error", 0);
975 window = datwindow_new(wid, bchan_scroll, bchan_draw, bchan_resize, bchan_close, bchan_butdn, bchan_paste, bchan);
976 if (window == NULL) {
977 DP_ER("datwindow_new error", 0);
980 retriever = datretriever_new(cache);
981 if (retriever == NULL) {
982 DP_ER("datretriever_new error", 0);
983 goto error_retriever;
985 submit = ressubmit_new(cache);
986 if (submit == NULL) {
987 DP_ER("ressubmit_new error", 0);
990 confirm = cfrmwindow_new(&r0, wid, bchan_recieveclose, bchan, BCHAN_DBX_TEXT_CONFIRM_TITLE, BCHAN_DBX_MS_CONFIRM_POST, BCHAN_DBX_MS_CONFIRM_CANCEL);
991 if (confirm == NULL) {
992 DP_ER("dfrmwindow_new error", 0);
995 err = dget_dtp(8, BCHAN_DBX_MENU_TEST, (void**)&mnitem_dbx);
997 DP_ER("dget_dtp error:", err);
1000 len = dget_siz((B*)mnitem_dbx);
1001 mnitem = malloc(len);
1002 if (mnitem == NULL) {
1003 DP_ER("mallod error", err);
1006 memcpy(mnitem, mnitem_dbx, len);
1007 mnid = mcre_men(BCHAN_MENU_WINDOW+2, mnitem, NULL);
1009 DP_ER("mcre_men error", mnid);
1010 goto error_mcre_men;
1012 err = bchan_resnumbermenu_initialize(&bchan->resnumbermenu, BCHAN_DBX_GMENU_RESNUMBER);
1014 DP_ER("bchan_resnumbermenu_initialize", err);
1015 goto error_resnumbermenu_initialize;
1017 err = bchan_residmenu_initialize(&bchan->residmenu, BCHAN_DBX_GMENU_RESID);
1019 DP_ER("bchan_residmenu_initialize", err);
1020 goto error_residmenu_initialize;
1023 bchan_hmistate_initialize(&bchan->hmistate);
1025 wget_wrk(wid, &w_work);
1026 datdraw_setviewrect(draw, 0, 0, w_work.c.right, w_work.c.bottom);
1027 datwindow_setworkrect(window, 0, 0, w_work.c.right, w_work.c.bottom);
1029 if (exectype == EXECREQ) {
1038 bchan->exectype = exectype;
1039 bchan->request_confirm_open = False;
1040 bchan->cache = cache;
1041 bchan->parser = parser;
1042 bchan->layout = layout;
1044 bchan->window = window;
1045 bchan->retriever = retriever;
1046 bchan->submit = submit;
1047 bchan->confirm = confirm;
1048 bchan->resdata = NULL;
1049 bchan->mnitem = mnitem;
1054 error_residmenu_initialize:
1055 bchan_resnumbermenu_finalize(&bchan->resnumbermenu);
1056 error_resnumbermenu_initialize:
1062 cfrmwindow_delete(confirm);
1064 ressubmit_delete(submit);
1066 datretriever_delete(retriever);
1068 datwindow_delete(window);
1070 datdraw_delete(draw);
1072 datlayout_delete(layout);
1074 datparser_delete(parser);
1076 datcache_delete(cache);
1078 return -1; /* TODO */
1081 #define BCHAN_LAYOUT_MAXBLOCKING 20
1083 LOCAL VOID bchan_relayout(bchan_t *bchan)
1085 datparser_res_t *res = NULL;
1087 W i, err, l, t, r, b;
1090 datlayout_clear(bchan->layout);
1091 datparser_clear(bchan->parser);
1094 if (i >= BCHAN_LAYOUT_MAXBLOCKING) {
1095 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
1099 err = datparser_getnextres(bchan->parser, &res);
1106 datlayout_appendres(bchan->layout, res);
1109 wget_wrk(bchan->wid, &w_work);
1111 datlayout_getdrawrect(bchan->layout, &l, &t, &r, &b);
1112 datwindow_setdrawrect(bchan->window, l, t, r, b);
1114 title = datlayout_gettitle(bchan->layout);
1115 wset_tit(bchan->wid, -1, title, 0);
1117 wreq_dsp(bchan->wid);
1120 LOCAL VOID bchan_update(bchan_t *bchan)
1122 datparser_res_t *res = NULL;
1124 W i, err, l, t, r, b;
1127 if (i >= BCHAN_LAYOUT_MAXBLOCKING) {
1128 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
1132 err = datparser_getnextres(bchan->parser, &res);
1139 datlayout_appendres(bchan->layout, res);
1142 wget_wrk(bchan->wid, &w_work);
1144 datlayout_getdrawrect(bchan->layout, &l, &t, &r, &b);
1145 datwindow_setdrawrect(bchan->window, l, t, r, b);
1147 wreq_dsp(bchan->wid);
1150 LOCAL VOID bchan_retriever_task(W arg)
1153 datretriever_t *retr;
1156 bchan = (bchan_t*)arg;
1157 retr = bchan->retriever;
1160 DP(("before rcv_mbf %d\n", bchan->mbfid));
1161 err = rcv_mbf(bchan->mbfid, (VP)&msg, T_FOREVER);
1162 DP_ER("rcv_mbf", err);
1167 err = datretriever_request(retr);
1170 case DATRETRIEVER_REQUEST_ALLRELOAD:
1171 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_RELAYOUT);
1173 case DATRETRIEVER_REQUEST_PARTIAL_CONTENT:
1174 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
1176 case DATRETRIEVER_REQUEST_NOT_MODIFIED:
1177 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_NOTMODIFIED);
1179 case DATRETRIEVER_REQUEST_NON_AUTHORITATIVE:
1180 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_NONAUTHORITATIVE);
1182 case DATRETRIEVER_REQUEST_NOT_FOUND:
1183 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_NOTFOUND);
1185 case DATRETRIEVER_REQUEST_UNEXPECTED:
1187 DP_ER("datretreiver_request error:",err);
1188 DATRETRIEVER_DP(retr);
1189 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_ERROR);
1197 LOCAL W bchan_prepare_network(bchan_t *bchan)
1199 if (bchan->retriever == NULL) {
1202 if (datretriever_isenablenetwork(bchan->retriever) == False) {
1206 bchan->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
1207 if (bchan->mbfid < 0) {
1208 DP_ER("cre_mbf error:", bchan->mbfid);
1211 bchan->taskid = cre_tsk(bchan_retriever_task, -1, (W)bchan);
1212 if (bchan->taskid < 0) {
1213 del_mbf(bchan->mbfid);
1215 DP_ER("cre_tsk error:", bchan->taskid);
1222 LOCAL W bchan_networkrequest(bchan_t *bchan)
1225 static UW lastrequest = 0;
1228 if (datretriever_isenablenetwork(bchan->retriever) == False) {
1229 pdsp_msg(bchan->hmistate.msg_cantretrieve);
1232 if (bchan->mbfid < 0) {
1236 err = get_etm(&etime);
1238 DP_ER("get_etm error:", err);
1241 if (lastrequest + 10000 > etime) {
1244 lastrequest = etime;
1246 err = snd_mbf(bchan->mbfid, &msg, sizeof(W), T_FOREVER);
1248 DP_ER("snd_mbf error:", err);
1252 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_BUSY);
1253 pdsp_msg(bchan->hmistate.msg_retrieving);
1258 LOCAL VOID keydwn(bchan_t *bchan, UH keycode, TC ch)
1260 W l,t,r,b,l1,t1,r1,b1,scr;
1264 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1270 datwindow_scrollbyvalue(bchan->window, 0, scr);
1273 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1274 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1281 datwindow_scrollbyvalue(bchan->window, 0, scr);
1285 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1286 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1293 datwindow_scrollbyvalue(bchan->window, scr, 0);
1297 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1303 datwindow_scrollbyvalue(bchan->window, scr, 0);
1306 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1312 datwindow_scrollbyvalue(bchan->window, 0, scr);
1315 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1316 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1317 if (b + (b - t) > b1) {
1323 datwindow_scrollbyvalue(bchan->window, 0, scr);
1327 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1328 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1329 if (r + (r - l) > r1) {
1335 datwindow_scrollbyvalue(bchan->window, scr, 0);
1339 datdraw_getviewrect(bchan->draw, &l, &t, &r, &b);
1345 datwindow_scrollbyvalue(bchan->window, scr, 0);
1348 bchan_networkrequest(bchan);
1353 LOCAL VOID bchan_setupmenu(bchan_t *bchan)
1357 /* [Áàºî] -> [¥¹¥ì¥¿¥¤¤ò¥È¥ì¡¼¤ËÊ£¼Ì] */
1358 str = datlayout_gettitle(bchan->layout);
1360 mchg_atr(bchan->mnid, (2 << 8)|1, M_INACT);
1362 mchg_atr(bchan->mnid, (2 << 8)|1, M_ACT);
1365 /* [ɽ¼¨] -> [¥¹¥ì¥Ã¥É¾ðÊó¤òɽ¼¨] */
1366 /* [ÊÔ½¸] -> [¥¹¥ì¥Ã¥É£Õ£Ò£Ì¤ò¥È¥ì¡¼¤ËÊ£¼Ì] */
1367 /* [Áàºî] -> [¥¹¥ì¥Ã¥É¼èÆÀ] */
1368 if (datretriever_isenablenetwork(bchan->retriever) == False) {
1369 mchg_atr(bchan->mnid, (1 << 8)|2, M_INACT);
1370 mchg_atr(bchan->mnid, (2 << 8)|2, M_INACT);
1371 mchg_atr(bchan->mnid, (3 << 8)|1, M_INACT);
1373 mchg_atr(bchan->mnid, (1 << 8)|2, M_ACT);
1374 mchg_atr(bchan->mnid, (2 << 8)|2, M_ACT);
1375 mchg_atr(bchan->mnid, (3 << 8)|1, M_ACT);
1378 wget_dmn(&(bchan->mnitem[BCHAN_MENU_WINDOW].ptr));
1379 mset_itm(bchan->mnid, BCHAN_MENU_WINDOW, bchan->mnitem+BCHAN_MENU_WINDOW);
1380 oget_men(0, NULL, &(bchan->mnitem[BCHAN_MENU_WINDOW+1].ptr), NULL, NULL);
1381 mset_itm(bchan->mnid, BCHAN_MENU_WINDOW+1, bchan->mnitem+BCHAN_MENU_WINDOW+1);
1384 LOCAL VOID bchan_selectmenu(bchan_t *bchan, W i)
1386 UB *host, *board, *thread;
1387 W host_len, board_len, thread_len;
1390 case 0: /* [½ªÎ»] */
1393 case 1: /* [ɽ¼¨] */
1395 case 1: /* [ºÆɽ¼¨] */
1396 wreq_dsp(bchan->wid);
1398 case 2: /* [¥¹¥ì¥Ã¥É¾ðÊó¤òɽ¼¨] */
1399 datcache_gethost(bchan->cache, &host, &host_len);
1400 datcache_getborad(bchan->cache, &board, &board_len);
1401 datcache_getthread(bchan->cache, &thread, &thread_len);
1402 bchan_panels_threadinfo(host, host_len, board, board_len, thread, thread_len);
1406 case 2: /* [Áàºî] */
1408 case 1: /* [¥¹¥ì¥¿¥¤¤ò¥È¥ì¡¼¤ËÊ£¼Ì] */
1409 bchan_pushthreadtitle(bchan);
1411 case 2: /* [¥¹¥ì¥Ã¥É£Õ£Ò£Ì¤ò¥È¥ì¡¼¤ËÊ£¼Ì] */
1412 bchan_pushthreadurl(bchan);
1416 case 3: /* [Áàºî] */
1418 case 1: /* [¥¹¥ì¥Ã¥É¼èÆÀ] */
1419 bchan_networkrequest(bchan);
1423 case BCHAN_MENU_WINDOW: /* [¥¦¥£¥ó¥É¥¦] */
1426 case BCHAN_MENU_WINDOW+1: /* [¾®Êª] */
1433 LOCAL VOID bchan_popupmenu(bchan_t *bchan, PNT pos)
1437 bchan_setupmenu(bchan);
1438 gset_ptr(PS_SELECT, NULL, -1, -1);
1439 i = msel_men(bchan->mnid, pos);
1441 bchan_selectmenu(bchan, i);
1445 LOCAL VOID receive_message(bchan_t *bchan)
1450 err = rcv_msg(MM_ALL, &msg, sizeof(MESSAGE), WAIT|NOCLR);
1452 if (msg.msg_type == MS_TMOUT) { /* should be use other type? */
1453 code = msg.msg_body.TMOUT.code;
1455 case BCHAN_MESSAGE_RETRIEVER_UPDATE:
1456 bchan_update(bchan);
1457 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1460 case BCHAN_MESSAGE_RETRIEVER_RELAYOUT:
1461 bchan_relayout(bchan);
1462 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1465 case BCHAN_MESSAGE_RETRIEVER_NOTMODIFIED:
1466 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1467 pdsp_msg(bchan->hmistate.msg_notmodified);
1469 case BCHAN_MESSAGE_RETRIEVER_NONAUTHORITATIVE:
1470 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1471 pdsp_msg(bchan->hmistate.msg_nonauthoritative);
1473 case BCHAN_MESSAGE_RETRIEVER_NOTFOUND:
1474 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1475 pdsp_msg(bchan->hmistate.msg_notfound);
1477 case BCHAN_MESSAGE_RETRIEVER_ERROR:
1478 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1479 pdsp_msg(bchan->hmistate.msg_networkerror);
1484 clr_msg(MM_ALL, MM_ALL);
1487 typedef struct _arg {
1492 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1499 len = src->msg_size / sizeof(TC);
1500 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1503 if(str[i] == TK_KSP){
1509 if(str[i] == TK_KSP){
1516 argv = (TC**)malloc(sizeof(TC*)*ac);
1520 if(str[i] == TNULL){
1526 if(str[i] == TNULL){
1539 EXPORT W MAIN(MESSAGE *msg)
1541 static RECT r0 = {{100, 100, 650+7, 400+30}};
1543 static PAT pat0 = {{
1556 datwindow_t *window;
1560 0x10000000, 0x10000000, 0x10FFFFFF, 0x10FFFFFF,
1564 err = dopn_dat(NULL);
1569 switch (msg->msg_type) {
1571 arg = MESSAGEtoargv(msg);
1575 err = get_lnk(arg.argv[1], &lnk, F_NORM);
1577 DP_ER("get_lnk error", err);
1580 vid = oreg_vob((VLINK*)&lnk, (VP)&vseg, -1, V_NODISP);
1582 DP_ER("error oreq_vob", vid);
1585 err = get_lnk((TC[]){TK_b, TK_c, TK_h, TK_a, TK_n, TK_PROD, TK_d, TK_b, TK_x,TNULL}, &dbx, F_NORM);
1587 DP_ER("get_lnk error", err);
1590 err = dopn_dat(&dbx);
1592 DP_ER("dopn_dat error", err);
1595 fil_sts(&lnk, tit0, NULL, NULL);
1598 oend_req(((M_DISPREQ*)msg)->vid, -1);
1602 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1606 if ((((M_EXECREQ*)msg)->mode & 2) != 0) {
1609 err = dopn_dat(&((M_EXECREQ*)msg)->self);
1613 fil_sts(&((M_EXECREQ*)msg)->lnk, tit0, NULL, NULL);
1614 vid = ((M_EXECREQ*)msg)->vid;
1621 wid = wopn_wnd(WA_SIZE|WA_HHDL|WA_VHDL|WA_BBAR|WA_RBAR, 0, &r0, NULL, 1, tit0, &pat0, NULL);
1626 err = bchan_initialize(&bchan, vid, wid, msg->msg_type);
1628 DP_ER("bchan_initialize error", err);
1631 window = bchan.window;
1633 err = bchan_prepare_network(&bchan);
1635 DP_ER("bchan_prepare_network error:", err);
1639 size = datcache_datasize(bchan.cache);
1640 if ((msg->msg_type == EXECREQ)&&(size == 0)) {
1641 bchan_networkrequest(&bchan);
1643 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_RELAYOUT);
1646 wreq_dsp(bchan.wid);
1650 wget_evt(&wev0, WAIT);
1651 switch (wev0.s.type) {
1653 if ((wev0.s.wid != wid)
1654 &&(cfrmwindow_compairwid(bchan.confirm, wev0.s.wid) == False)) {
1655 gset_ptr(bchan.hmistate.ptr, NULL, -1, -1);
1656 break; /*¥¦¥£¥ó¥É¥¦³°*/
1658 if (wev0.s.cmd != W_WORK)
1659 break; /*ºî¶ÈÎΰ賰*/
1660 if (wev0.s.stat & ES_CMD)
1661 break; /*Ì¿Îᥡ¼¤¬²¡¤µ¤ì¤Æ¤¤¤ë*/
1662 gset_ptr(bchan.hmistate.ptr, NULL, -1, -1);
1665 if (wev0.g.wid == wid) {
1666 datwindow_weventrequest(window, &wev0);
1668 if (cfrmwindow_compairwid(bchan.confirm, wev0.s.wid)) {
1669 cfrmwindow_weventrequest(bchan.confirm, &wev0);
1673 if (wev0.s.wid == wid) {
1674 datwindow_weventreswitch(window, &wev0);
1675 if (bchan.request_confirm_open == True) {
1676 cfrmwindow_open(bchan.confirm);
1677 bchan.request_confirm_open = False;
1680 if (cfrmwindow_compairwid(bchan.confirm, wev0.s.wid)) {
1681 cfrmwindow_weventreswitch(bchan.confirm, &wev0);
1685 if (wev0.s.wid == wid) {
1686 datwindow_weventswitch(window, &wev0);
1687 if (bchan.request_confirm_open == True) {
1688 cfrmwindow_open(bchan.confirm);
1689 bchan.request_confirm_open = False;
1692 if (cfrmwindow_compairwid(bchan.confirm, wev0.s.wid)) {
1693 cfrmwindow_weventswitch(bchan.confirm, &wev0);
1697 if (wev0.g.wid == wid) {
1698 datwindow_weventbutdn(window, &wev0);
1700 if (cfrmwindow_compairwid(bchan.confirm, wev0.s.wid)) {
1701 cfrmwindow_weventbutdn(bchan.confirm, &wev0);
1705 if (wev0.s.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1706 bchan_setupmenu(&bchan);
1707 i = mfnd_key(bchan.mnid, wev0.e.data.key.code);
1709 bchan_selectmenu(&bchan, i);
1714 keydwn(&bchan, wev0.e.data.key.keytop, wev0.e.data.key.code);
1720 oprc_dev(&wev0.e, NULL, 0);
1723 receive_message(&bchan);
1726 bchan_popupmenu(&bchan, wev0.s.pos);