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
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>
48 #include "layoutarray.h"
49 #include "layoutstyle.h"
53 #include "retriever.h"
56 #include "sjisstring.h"
57 #include "bchan_vobj.h"
58 #include "bchan_panels.h"
59 #include "bchan_menus.h"
61 #ifdef BCHAN_CONFIG_DEBUG
62 # define DP(arg) printf arg
63 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
66 # define DP_ER(msg, err) /**/
69 #define BCHAN_DBX_MENU_TEST 20
70 #define BCHAN_DBX_TEXT_MLIST0 21
71 #define BCHAN_DBX_TEXT_MLIST1 22
72 #define BCHAN_DBX_TEXT_MLIST2 23
73 #define BCHAN_DBX_MSGTEXT_RETRIEVING 24
74 #define BCHAN_DBX_MSGTEXT_NOTMODIFIED 25
75 #define BCHAN_DBX_MSGTEXT_POSTSUCCEED 26
76 #define BCHAN_DBX_MSGTEXT_POSTDENIED 27
77 #define BCHAN_DBX_MSGTEXT_POSTERROR 28
78 #define BCHAN_DBX_MS_CONFIRM_POST 29
79 #define BCHAN_DBX_MS_CONFIRM_CANCEL 30
80 #define BCHAN_DBX_TEXT_CONFIRM_TITLE 31
81 #define BCHAN_DBX_MSGTEXT_NONAUTHORITATIVE 32
82 #define BCHAN_DBX_MSGTEXT_NETWORKERROR 33
83 #define BCHAN_DBX_FFUSEN_BBB 34
84 #define BCHAN_DBX_FFUSEN_TEXEDIT 35
85 #define BCHAN_DBX_FFUSEN_VIEWER 36
86 #define BCHAN_DBX_MSGTEXT_NOTFOUND 37
87 #define BCHAN_DBX_MSGTEXT_CANTRETRIEVE 44
88 #define BCHAN_DBX_GMENU_RESNUMBER 45
89 #define BCHAN_DBX_GMENU_RESID 47
90 #define BCHAN_DBX_SS_NGWORD_LIST 49
91 #define BCHAN_DBX_MS_NGWORD_DELETE 50
92 #define BCHAN_DBX_TB_NGWORD_APPEND 51
93 #define BCHAN_DBX_MS_NGWORD_APPEND 52
95 typedef struct bchan_hmistate_t_ bchan_hmistate_t;
96 struct bchan_hmistate_t_ {
101 TC *msg_nonauthoritative;
105 TC *msg_networkerror;
107 TC *msg_cantretrieve;
110 LOCAL VOID bchan_hmistate_updateptrstyle(bchan_hmistate_t *hmistate, PTRSTL ptr)
112 if (hmistate->ptr == ptr) {
116 gset_ptr(hmistate->ptr, NULL, -1, -1);
119 LOCAL VOID bchan_hmistate_display_postdenied(bchan_hmistate_t *hmistate, TC *str, W len)
124 size = tc_strlen(hmistate->msg_postdenied);
125 msg_len = size + len + 2;
126 msg = malloc((msg_len + 1)*sizeof(TC));
128 pdsp_msg(hmistate->msg_postdenied);
131 tc_strcpy(msg, hmistate->msg_postdenied);
133 memcpy((UB*)(msg + size + 1), str, len * sizeof(TC));
134 msg[msg_len - 1] = TK_RPAR;
135 msg[msg_len] = TNULL;
142 typedef struct bchan_t_ bchan_t;
151 Bool request_confirm_open; /* TODO: should be other implememt? */
153 bchan_hmistate_t hmistate;
154 bchan_mainmenu_t mainmenu;
155 bchan_resnumbermenu_t resnumbermenu;
156 bchan_residmenu_t residmenu;
158 datretriever_t *retriever;
161 datlayoutarray_t *layoutarray;
162 datlayoutstyle_t style;
165 dattraydata_t *traydata;
169 cfrmwindow_t *confirm;
170 ngwordwindow_t *ngword;
172 postresdata_t *resdata;
175 #define BCHAN_MESSAGE_RETRIEVER_UPDATE 1
176 #define BCHAN_MESSAGE_RETRIEVER_RELAYOUT 2
177 #define BCHAN_MESSAGE_RETRIEVER_NOTMODIFIED 3
178 #define BCHAN_MESSAGE_RETRIEVER_NONAUTHORITATIVE 4
179 #define BCHAN_MESSAGE_RETRIEVER_NOTFOUND 5
180 #define BCHAN_MESSAGE_RETRIEVER_ERROR -1
182 void killme(bchan_t *bchan)
184 gset_ptr(PS_BUSY, NULL, -1, -1);
186 bchan_residmenu_finalize(&bchan->residmenu);
187 bchan_resnumbermenu_finalize(&bchan->resnumbermenu);
188 if (bchan->exectype == EXECREQ) {
189 oend_prc(bchan->vid, NULL, 0);
191 dathmi_delete(bchan->hmi);
195 LOCAL VOID bchan_draw(bchan_t *bchan)
199 if (datwindow_startredisp(bchan->window, &r) == 0) {
202 datwindow_eraseworkarea(bchan->window, &r);
203 datrender_draw(bchan->render, &r);
204 } while (datwindow_endredisp(bchan->window) > 0);
207 LOCAL VOID bchan_scroll(VP arg, W dh, W dv)
209 bchan_t *bchan = (bchan_t*)arg;
210 datrender_scrollviewrect(bchan->render, dh, dv);
211 datwindow_scrollworkarea(bchan->window, -dh, -dv);
215 LOCAL VOID bchan_resize(bchan_t *bchan, SIZE newsize)
219 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
224 datrender_setviewrect(bchan->render, l, t, r, b);
225 datwindow_setworkrect(bchan->window, l, t, r, b);
230 LOCAL VOID bchan_close(bchan_t *bchan, Bool save)
232 /* TODO: guard request event W_DELETE and W_FINISH. */
233 datcache_writefile(bchan->cache);
237 LOCAL VOID bchan_pushstringtotray(TC *str, W len)
242 TADSEG *base = (TADSEG*)bin;
243 TEXTSEG *textseg = (TEXTSEG*)(bin + 4);
247 textseg->view = (RECT){{0, 0, 0, 0}};
248 textseg->draw = (RECT){{0, 0, 0, 0}};
249 textseg->h_unit = -120;
250 textseg->v_unit = -120;
251 textseg->lang = 0x21;
254 trayrec[0].id = 0xE1;
257 trayrec[1].id = TR_TEXT;
258 trayrec[1].len = len * sizeof(TC);
259 trayrec[1].dt = (B*)str;
261 err = tpsh_dat(trayrec, 2, NULL);
263 DP_ER("tpsh_dat", err);
267 LOCAL VOID bchan_pushthreadtitle(bchan_t *bchan)
272 str = datlayout_gettitle(bchan->layout);
273 len = datlayout_gettitlelen(bchan->layout);
274 bchan_pushstringtotray(str, len);
277 LOCAL VOID bchan_pushthreadurl(bchan_t *bchan)
279 W host_len, board_len, thread_len, len, i, ret;
280 UB *host, *board, *thread;
283 datcache_gethost(bchan->cache, &host, &host_len);
284 datcache_getborad(bchan->cache, &board, &board_len);
285 datcache_getthread(bchan->cache, &thread, &thread_len);
287 len = 7 + host_len + 15 + board_len + 1 + thread_len + 1;
288 str = malloc(sizeof(TC)*len);
297 for (i = 0; i < host_len; i++) {
298 ret = sjtotc(str + 7 + i, host + i);
300 DP(("invalid charactor\n"));
305 str[7 + host_len] = TK_SLSH;
306 str[7 + host_len + 1] = TK_t;
307 str[7 + host_len + 2] = TK_e;
308 str[7 + host_len + 3] = TK_s;
309 str[7 + host_len + 4] = TK_t;
310 str[7 + host_len + 5] = TK_SLSH;
311 str[7 + host_len + 6] = TK_r;
312 str[7 + host_len + 7] = TK_e;
313 str[7 + host_len + 8] = TK_a;
314 str[7 + host_len + 9] = TK_d;
315 str[7 + host_len + 10] = TK_PROD;
316 str[7 + host_len + 11] = TK_c;
317 str[7 + host_len + 12] = TK_g;
318 str[7 + host_len + 13] = TK_i;
319 str[7 + host_len + 14] = TK_SLSH;
320 for (i = 0; i < board_len; i++) {
321 ret = sjtotc(str + 7 + host_len + 15 + i, board + i);
323 DP(("invalid charactor\n"));
328 str[7 + host_len + 15 + board_len] = TK_SLSH;
329 for (i = 0; i < thread_len; i++) {
330 ret = sjtotc(str + 7 + host_len + 15 + board_len + 1 + i, thread + i);
332 DP(("invalid charactor\n"));
337 str[7 + host_len + 15 + board_len + 1 + thread_len] = TK_SLSH;
339 bchan_pushstringtotray(str, len);
344 LOCAL Bool bchan_is_bbs_url(UB *data, W data_len)
347 W str_len, cmp, i, n_slsh = 0;
349 if ((tadurl_cmpscheme(data, data_len, "http", 4) != 0)
350 &&(tadurl_cmpscheme(data, data_len, "ttp", 3) != 0)) {
354 cmp = tadurl_cmppath(data, data_len, "test/read.cgi/", 14);
360 str_len = data_len/2;
369 if (str[i] == TK_SLSH) {
378 if (str[i] == TK_SLSH) {
381 if (tc_isdigit(str[i]) == 0) {
389 LOCAL W bchan_createvobj_allocate_url(UB *data, W data_len, TC **url, W *url_len)
394 if (tadurl_cmpscheme(data, data_len, "http", 4) == 0) {
398 return -1; /* TODO */
400 memcpy(str, data, data_len);
401 } else if (tadurl_cmpscheme(data, data_len, "ttp", 3) == 0) {
402 len = data_len + sizeof(TC)*1;
405 return -1; /* TODO */
407 memcpy(str + 1, data, data_len);
409 } else if (tadurl_cmpscheme(data, data_len, "sssp", 4) == 0) {
413 return -1; /* TODO */
415 memcpy(str + 4, data + 8, data_len - 8);
421 return -1; /* TODO */
425 *url_len = len/sizeof(TC);
430 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)
434 for (i=0; i < url_len; i++) {
444 for (; i < url_len; i++) {
454 for (; i < url_len; i++) {
464 for (; i < url_len; i++) {
476 for (; i < url_len; i++) {
488 #define BCHAN_CREATEVOBJ_CANCELED 0
489 #define BCHAN_CREATEVOBJ_CREATED 1
491 LOCAL W bchan_createvobj(UB *data, W data_len, VOBJSEG *vseg, LINK *lnk)
493 W err, fsn_bbb_len, fsn_texedit_len, fsn_viewer_len, url_len, ascii_url_len;
495 void *fsn_bbb, *fsn_texedit, *fsn_viewer;
497 UB *host, *board, *thread;
498 W host_len, board_len, thread_len;
501 TC title[] = {TK_T, TK_h, TK_r, TK_e, TK_a, TK_d, TNULL}; /* tmp */
503 err = dget_dtp(64, BCHAN_DBX_FFUSEN_BBB, (void**)&fsn_bbb);
505 DP_ER("dget_dtp: BCHAN_DBX_FFUSEN_BBB", err);
508 fsn_bbb_len = dget_siz((B*)fsn_bbb);
509 err = dget_dtp(64, BCHAN_DBX_FFUSEN_TEXEDIT, (void**)&fsn_texedit);
511 DP_ER("dget_dtp: BCHAN_DBX_FFUSEN_TEXEDIT", err);
514 fsn_texedit_len = dget_siz((B*)fsn_texedit);
515 err = dget_dtp(64, BCHAN_DBX_FFUSEN_VIEWER, (void**)&fsn_viewer);
517 DP_ER("dget_dtp: BCHAN_DBX_FFUSEN_VIEWER", err);
520 fsn_viewer_len = dget_siz((B*)fsn_viewer);
523 if(((*(UH*)data) & 0xFF80) == 0xFF80) {
524 lseg = (LTADSEG*)(data);
525 if (lseg->len == 0xffff) {
526 data += lseg->llen + 8;
527 data_len -= lseg->llen + 8;
529 data += lseg->len + 4;
530 data_len -= lseg->len + 4;
537 is_bbs = bchan_is_bbs_url(data, data_len);
538 if (is_bbs == True) {
541 err = sjstring_appendconvartingTCstring(&ascii_url, &ascii_url_len, (TC*)data, data_len/2);
546 bchan_separete_bbs_url(ascii_url, ascii_url_len, &host, &host_len, &board, &board_len, &thread, &thread_len);
547 err = bchan_createviewervobj(title, fsn_viewer, fsn_viewer_len, host, host_len, board, board_len, thread, thread_len, vseg, lnk);
554 err = bchan_createvobj_allocate_url(data, data_len, &url, &url_len);
556 DP_ER("bchan_createvobj_allocate_url", err);
560 err = bchan_createbbbvobj(fsn_bbb, fsn_bbb_len, fsn_texedit, fsn_texedit_len, (UB*)url, url_len*2, vseg, lnk);
562 DP_ER("bchan_createbbbvobj", err);
569 return BCHAN_CREATEVOBJ_CREATED;
572 LOCAL VOID bchan_scrollbyahcnor(bchan_t *bchan, UB *data, W data_len)
578 W cl, ct, cr, cb, tl, tt, tr, tb;
581 if(((*(UH*)data) & 0xFF80) == 0xFF80) {
582 lseg = (LTADSEG*)(data);
583 if (lseg->len == 0xffff) {
584 data += lseg->llen + 8;
585 data_len -= lseg->llen + 8;
587 data += lseg->len + 4;
588 data_len -= lseg->len + 4;
598 num = tc_atoi(str + 2);
599 DP(("num = %d\n", num));
601 fnd = datlayout_getthreadviewrectbyindex(bchan->layout, num - 1, &tl, &tt, &tr, &tb);
605 datrender_getviewrect(bchan->render, &cl, &ct, &cr, &cb);
606 datwindow_scrollbyvalue(bchan->window, 0 - cl, tt - ct);
609 LOCAL VOID bchan_layout_res_updateattrbyindex(datlayout_res_t *layout_res, UW attr, COLOR color)
611 if ((attr & DATCACHE_RESINDEXDATA_FLAG_NG) != 0) {
612 datlayout_res_enableindexNG(layout_res);
614 datlayout_res_disableindexNG(layout_res);
616 if ((attr & DATCACHE_RESINDEXDATA_FLAG_COLOR) != 0) {
617 datlayout_res_enableindexcolor(layout_res);
619 datlayout_res_disableindexcolor(layout_res);
621 datlayout_res_setindexcolor(layout_res, color);
624 LOCAL VOID bchan_layout_res_updateattrbyid(datlayout_res_t *layout_res, UW attr, COLOR color)
626 if ((attr & DATCACHE_RESIDDATA_FLAG_NG) != 0) {
627 datlayout_res_enableidNG(layout_res);
629 datlayout_res_disableidNG(layout_res);
631 if ((attr & DATCACHE_RESIDDATA_FLAG_COLOR) != 0) {
632 datlayout_res_enableidcolor(layout_res);
634 datlayout_res_disableidcolor(layout_res);
636 datlayout_res_setidcolor(layout_res, color);
639 LOCAL VOID bchan_butdn_updatedisplayinfobyindex(bchan_t *bchan, W resindex, UW attr, COLOR color)
641 datlayout_res_t *layout_res;
644 found = datlayoutarray_getresbyindex(bchan->layoutarray, resindex, &layout_res);
645 if (found == False) {
649 bchan_layout_res_updateattrbyindex(layout_res, attr, color);
651 datwindow_requestredisp(bchan->window);
654 LOCAL VOID bchan_butdn_updatedisplayinfobyid(bchan_t *bchan, TC *id, W id_len, UW attr, COLOR color)
656 datlayout_res_t *layout_res;
660 len = datlayoutarray_length(bchan->layoutarray);
661 for (i = 0; i < len; i++) {
662 found = datlayoutarray_getresbyindex(bchan->layoutarray, i, &layout_res);
663 if (found == False) {
667 issame = datlayout_res_issameid(layout_res, id, id_len);
668 if (issame != True) {
672 bchan_layout_res_updateattrbyid(layout_res, attr, color);
675 datwindow_requestredisp(bchan->window);
678 LOCAL VOID bchan_butdn_pressnumber(bchan_t *bchan, PNT evpos, W resindex)
686 datlayout_res_t *layout_res;
688 DP(("press DATRENDER_FINDACTION_TYPE_NUMBER: %d\n", resindex + 1));
690 ok = datlayoutarray_getresbyindex(bchan->layoutarray, resindex, &layout_res);
695 ok = datlayout_res_isenableidNG(layout_res);
700 err = datcache_searchresindexdata(bchan->cache, resindex, &attr, &color);
701 if (err == DATCACHE_SEARCHRESINDEXDATA_FOUND) {
702 if ((attr & DATCACHE_RESINDEXDATA_FLAG_NG) != 0) {
703 err = bchan_resnumbermenu_setngselected(&bchan->resnumbermenu, True);
705 err = bchan_resnumbermenu_setngselected(&bchan->resnumbermenu, False);
709 err = bchan_resnumbermenu_setngselected(&bchan->resnumbermenu, False);
714 gcnv_abs(bchan->gid, &pos);
715 err = bchan_resnumbermenu_select(&bchan->resnumbermenu, pos);
716 if (err == BCHAN_RESNUMBERMENU_SELECT_PUSHTRAY) {
717 size = dattraydata_resindextotraytextdata(bchan->traydata, resindex, NULL, 0);
722 dattraydata_resindextotraytextdata(bchan->traydata, resindex, data, size);
723 bchan_pushstringtotray((TC*)data, size/2);
725 } if (err == BCHAN_RESNUMBERMENU_SELECT_NG) {
726 if ((attr & DATCACHE_RESINDEXDATA_FLAG_NG) != 0) {
727 datcache_removeresindexdata(bchan->cache, resindex);
730 err = datcache_addresindexdata(bchan->cache, resindex, DATCACHE_RESINDEXDATA_FLAG_NG, 0x10000000);
731 attr = DATCACHE_RESINDEXDATA_FLAG_NG;
733 bchan_butdn_updatedisplayinfobyindex(bchan, resindex, attr, color);
737 LOCAL VOID bchan_butdn_pressresheaderid(bchan_t *bchan, PNT evpos, W resindex)
746 datlayout_res_t *layout_res;
748 DP(("press DATRENDER_FINDACTION_TYPE_ID\n"));
750 ok = datlayoutarray_getresbyindex(bchan->layoutarray, resindex, &layout_res);
752 DP((" id is not exist\n"));
756 datlayout_res_getid(layout_res, &id, &id_len);
758 DP((" id is not exist\n"));
762 ok = datlayout_res_isenableindexNG(layout_res);
767 err = datcache_searchresiddata(bchan->cache, id, id_len, &attr, &color);
768 if (err == DATCACHE_SEARCHRESIDDATA_FOUND) {
769 if ((attr & DATCACHE_RESIDDATA_FLAG_NG) != 0) {
770 err = bchan_residmenu_setngselected(&bchan->residmenu, True);
772 err = bchan_residmenu_setngselected(&bchan->residmenu, False);
776 err = bchan_residmenu_setngselected(&bchan->residmenu, False);
781 gcnv_abs(bchan->gid, &pos);
782 err = bchan_residmenu_select(&bchan->residmenu, pos);
783 if (err == BCHAN_RESIDMENU_SELECT_PUSHTRAY) {
784 size = dattraydata_idtotraytextdata(bchan->traydata, id, id_len, NULL, 0);
789 dattraydata_idtotraytextdata(bchan->traydata, id, id_len, data, size);
790 bchan_pushstringtotray((TC*)data, size/2);
792 } if (err == BCHAN_RESIDMENU_SELECT_NG) {
793 if ((attr & DATCACHE_RESIDDATA_FLAG_NG) != 0) {
794 datcache_removeresiddata(bchan->cache, id, id_len);
797 err = datcache_addresiddata(bchan->cache, id, id_len, DATCACHE_RESIDDATA_FLAG_NG, 0x10000000);
798 attr = DATCACHE_RESIDDATA_FLAG_NG;
800 bchan_butdn_updatedisplayinfobyid(bchan, id, id_len, attr, color);
804 LOCAL VOID bchan_butdn(bchan_t *bchan, W dck, PNT evpos)
806 W fnd, event_type, type, len, dx, dy, err, size, resindex;
811 PNT p1, pos, pos_butup;
819 fnd = datrender_findaction(bchan->render, evpos, &r, &type, &start, &len, &resindex);
823 if (type != DATRENDER_FINDACTION_TYPE_ANCHOR) {
826 bchan_scrollbyahcnor(bchan, start, len);
835 fnd = datrender_findaction(bchan->render, evpos, &r, &type, &start, &len, &resindex);
839 if (type == DATRENDER_FINDACTION_TYPE_NUMBER) {
840 bchan_butdn_pressnumber(bchan, evpos, resindex);
843 if (type == DATRENDER_FINDACTION_TYPE_RESID) {
844 bchan_butdn_pressresheaderid(bchan, evpos, resindex);
847 if (type != DATRENDER_FINDACTION_TYPE_URL) {
851 gid = datwindow_startdrag(bchan->window);
853 DP_ER("wsta_drg error:", gid);
860 dx = r.c.left - evpos.x;
861 dy = r.c.top - evpos.y;
865 sel.rgn.r.c.left = r.c.left;
866 sel.rgn.r.c.top = r.c.top;
867 sel.rgn.r.c.right = r.c.right;
868 sel.rgn.r.c.bottom = r.c.bottom;
869 adsp_sel(gid, &sel, 1);
871 gset_ptr(PS_GRIP, NULL, -1, -1);
873 event_type = datwindow_getdrag(bchan->window, &pos, &wid_butup, &pos_butup);
874 if (event_type == EV_BUTUP) {
877 if (event_type != EV_NULL) {
880 if ((pos.x == p1.x)&&(pos.y == p1.y)) {
883 adsp_sel(gid, &sel, 0);
884 sel.rgn.r.c.left += pos.x - p1.x;
885 sel.rgn.r.c.top += pos.y - p1.y;
886 sel.rgn.r.c.right += pos.x - p1.x;
887 sel.rgn.r.c.bottom += pos.y - p1.y;
888 adsp_sel(gid, &sel, 1);
891 gset_ptr(PS_SELECT, NULL, -1, -1);
892 adsp_sel(gid, &sel, 0);
893 datwindow_enddrag(bchan->window);
895 /* BUTUP on self window or no window or system message panel */
896 if ((wid_butup == bchan->wid)||(wid_butup == 0)||(wid_butup == -1)) {
900 err = oget_vob(-wid_butup, &vrec.vlnk, NULL, 0, &size);
905 err = bchan_createvobj(start, len, &vrec.vseg, (LINK*)&vrec.vlnk);
907 DP_ER("bchan_createvobj error", err);
910 if (err == BCHAN_CREATEVOBJ_CANCELED) {
916 tr_rec.len = sizeof(TR_VOBJREC);
917 tr_rec.dt = (B*)&vrec;
918 err = tset_dat(&tr_rec, 1);
920 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
922 DP_ER("error del_fil:", err);
927 paste_ev.r.type = EV_REQUEST;
928 paste_ev.r.r.p.rightbot.x = pos_butup.x + dx;
929 paste_ev.r.r.p.rightbot.y = pos_butup.y + dy;
930 paste_ev.r.cmd = W_PASTE;
931 paste_ev.r.wid = wid_butup;
932 err = wsnd_evt(&paste_ev);
935 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
937 DP_ER("error del_fil:", err);
941 err = wwai_rsp(NULL, W_PASTE, 60000);
944 err = del_fil(NULL, (LINK*)&vrec.vlnk, 0);
946 DP_ER("error del_fil:", err);
950 wswi_wnd(wid_butup, NULL);
952 /* temporary fix. to fix canceling layout. */
953 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
956 LOCAL VOID bchan_paste(bchan_t *bchan)
960 postresdata_t *post = NULL;
962 err = poptray_gettraydata(&post);
964 datwindow_responsepasterequest(bchan->window, /* NACK */ 1, NULL);
970 datwindow_responsepasterequest(bchan->window, /* ACK */ 0, &p);
973 if (bchan->resdata != NULL) {
974 postresdata_delete(bchan->resdata);
976 bchan->resdata = post;
977 cfrmwindow_setpostresdata(bchan->confirm, post);
978 bchan->request_confirm_open = True;
982 LOCAL VOID bchan_recieveclose(bchan_t *bchan, Bool send)
987 DP(("bchan_recieveclose = %d\n", send));
989 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_BUSY);
990 err = ressubmit_respost(bchan->submit, bchan->resdata, &dmsg, &dmsg_len);
991 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
993 case RESSUBMIT_RESPOST_SUCCEED:
994 pdsp_msg(bchan->hmistate.msg_postsucceed);
996 case RESSUBMIT_RESPOST_DENIED:
997 bchan_hmistate_display_postdenied(&bchan->hmistate, dmsg, dmsg_len);
999 case RESSUBMIT_RESPOST_ERROR_CLIENT:
1000 case RESSUBMIT_RESPOST_ERROR_STATUS:
1001 case RESSUBMIT_RESPOST_ERROR_CONTENT:
1003 pdsp_msg(bchan->hmistate.msg_posterror);
1012 LOCAL VOID bchan_hmistate_initialize(bchan_hmistate_t *hmistate)
1016 hmistate->ptr = PS_SELECT;
1018 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_RETRIEVING, (void**)&hmistate->msg_retrieving);
1020 DP_ER("dget_dtp: message retrieving error", err);
1021 hmistate->msg_retrieving = NULL;
1023 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NOTMODIFIED, (void**)&hmistate->msg_notmodified);
1025 DP_ER("dget_dtp: message not modified error", err);
1026 hmistate->msg_notmodified = NULL;
1028 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NONAUTHORITATIVE, (void**)&hmistate->msg_nonauthoritative);
1030 DP_ER("dget_dtp: message non-authoritative error", err);
1031 hmistate->msg_nonauthoritative = NULL;
1033 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_POSTSUCCEED, (void**)&hmistate->msg_postsucceed);
1035 DP_ER("dget_dtp: message post succeed error", err);
1036 hmistate->msg_postsucceed = NULL;
1038 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_POSTDENIED, (void**)&hmistate->msg_postdenied);
1040 DP_ER("dget_dtp: message post denied error", err);
1041 hmistate->msg_postdenied = NULL;
1043 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_POSTERROR, (void**)&hmistate->msg_posterror);
1045 DP_ER("dget_dtp: message post error error", err);
1046 hmistate->msg_posterror = NULL;
1048 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NETWORKERROR, (void**)&hmistate->msg_networkerror);
1050 DP_ER("dget_dtp: message network error error", err);
1051 hmistate->msg_networkerror = NULL;
1053 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_NOTFOUND, (void**)&hmistate->msg_notfound);
1055 DP_ER("dget_dtp: message notfound error", err);
1056 hmistate->msg_notfound = NULL;
1058 err = dget_dtp(TEXT_DATA, BCHAN_DBX_MSGTEXT_CANTRETRIEVE, (void**)&hmistate->msg_cantretrieve);
1060 DP_ER("dget_dtp: message cantretrieve error", err);
1061 hmistate->msg_cantretrieve = NULL;
1065 LOCAL W bchan_initialize(bchan_t *bchan, VID vid, WID wid/*tmp*/, W exectype, dathmi_t *hmi, datwindow_t *datwindow, cfrmwindow_t *cfrmwindow, ngwordwindow_t *ngwordwindow)
1069 datparser_t *parser;
1070 datlayoutarray_t *layoutarray;
1071 datlayout_t *layout;
1072 datrender_t *render;
1073 dattraydata_t *traydata;
1074 datretriever_t *retriever;
1075 ressubmit_t *submit;
1079 gid = datwindow_getGID(datwindow);
1081 cache = datcache_new(vid);
1082 if (cache == NULL) {
1083 DP_ER("datcache_new error", 0);
1086 parser = datparser_new(cache);
1087 if (parser == NULL) {
1088 DP_ER("datparser_new error", 0);
1091 layoutarray = datlayoutarray_new();
1092 if (layoutarray == NULL) {
1093 DP_ER("datlayoutarray_new error", 0);
1094 goto error_layoutarray;
1096 datlayoutstyle_setdefault(&bchan->style);
1097 layout = datlayout_new(gid, &bchan->style, layoutarray);
1098 if (layout == NULL) {
1099 DP_ER("datlayout_new error", 0);
1102 render = datrender_new(gid, &bchan->style, layoutarray);
1103 if (render == NULL) {
1104 DP_ER("datrender_new error", 0);
1107 traydata = dattraydata_new(layoutarray);
1108 if (traydata == NULL) {
1109 DP_ER("dattraydata_new error", 0);
1110 goto error_traydata;
1112 retriever = datretriever_new(cache);
1113 if (retriever == NULL) {
1114 DP_ER("datretriever_new error", 0);
1115 goto error_retriever;
1117 submit = ressubmit_new(cache);
1118 if (submit == NULL) {
1119 DP_ER("ressubmit_new error", 0);
1122 err = bchan_mainmenu_initialize(&bchan->mainmenu, BCHAN_DBX_MENU_TEST);
1124 DP_ER("bchan_mainmenu_initialize error", err);
1125 goto error_mainmenu_initialize;
1127 err = bchan_resnumbermenu_initialize(&bchan->resnumbermenu, BCHAN_DBX_GMENU_RESNUMBER);
1129 DP_ER("bchan_resnumbermenu_initialize", err);
1130 goto error_resnumbermenu_initialize;
1132 err = bchan_residmenu_initialize(&bchan->residmenu, BCHAN_DBX_GMENU_RESID);
1134 DP_ER("bchan_residmenu_initialize", err);
1135 goto error_residmenu_initialize;
1138 bchan_hmistate_initialize(&bchan->hmistate);
1140 datwindow_getworkrect(datwindow, &w_work);
1141 datrender_setviewrect(render, 0, 0, w_work.c.right, w_work.c.bottom);
1142 datwindow_setworkrect(datwindow, 0, 0, w_work.c.right, w_work.c.bottom);
1144 if (exectype == EXECREQ) {
1153 bchan->exectype = exectype;
1154 bchan->request_confirm_open = False;
1155 bchan->cache = cache;
1156 bchan->parser = parser;
1157 bchan->layoutarray = layoutarray;
1158 bchan->layout = layout;
1159 bchan->render = render;
1160 bchan->traydata = traydata;
1162 bchan->window = datwindow;
1163 bchan->retriever = retriever;
1164 bchan->submit = submit;
1165 bchan->confirm = cfrmwindow;
1166 bchan->resdata = NULL;
1167 bchan->ngword = ngwordwindow;
1171 error_residmenu_initialize:
1172 bchan_resnumbermenu_finalize(&bchan->resnumbermenu);
1173 error_resnumbermenu_initialize:
1174 bchan_mainmenu_finalize(&bchan->mainmenu);
1175 error_mainmenu_initialize:
1176 ressubmit_delete(submit);
1178 datretriever_delete(retriever);
1180 dattraydata_delete(traydata);
1182 datrender_delete(render);
1184 datlayout_delete(layout);
1186 datlayoutarray_delete(layoutarray);
1188 datparser_delete(parser);
1190 datcache_delete(cache);
1192 return -1; /* TODO */
1195 #define BCHAN_LAYOUT_MAXBLOCKING 20
1197 LOCAL W bchan_layout_appendres(bchan_t *bchan, datparser_res_t *res)
1199 W err, ret, index, id_len;
1204 datlayout_res_t *layout_res;
1206 err = datlayout_appendres(bchan->layout, res);
1211 found = datlayoutarray_getreslast(bchan->layoutarray, &layout_res);
1212 if (found == False) {
1215 index = datlayoutarray_length(bchan->layoutarray) - 1;
1217 datlayout_res_getid(layout_res, &id, &id_len);
1218 ret = datcache_searchresiddata(bchan->cache, id, id_len, &attr, &color);
1219 if (ret == DATCACHE_SEARCHRESIDDATA_FOUND) {
1220 bchan_layout_res_updateattrbyid(layout_res, attr, color);
1222 ret = datcache_searchresindexdata(bchan->cache, index, &attr, &color);
1223 if (ret == DATCACHE_SEARCHRESINDEXDATA_FOUND) {
1224 bchan_layout_res_updateattrbyindex(layout_res, attr, color);
1230 LOCAL VOID bchan_relayout(bchan_t *bchan)
1232 datparser_res_t *res = NULL;
1234 W i, err, l, t, r, b;
1237 datlayout_clear(bchan->layout);
1238 datparser_clear(bchan->parser);
1241 if (i >= BCHAN_LAYOUT_MAXBLOCKING) {
1242 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
1246 err = datparser_getnextres(bchan->parser, &res);
1253 bchan_layout_appendres(bchan, res);
1256 datwindow_getworkrect(bchan->window, &w_work);
1258 datlayout_getdrawrect(bchan->layout, &l, &t, &r, &b);
1259 datwindow_setdrawrect(bchan->window, l, t, r, b);
1261 title = datlayout_gettitle(bchan->layout);
1262 datwindow_settitle(bchan->window, title);
1264 datwindow_requestredisp(bchan->window);
1267 LOCAL VOID bchan_update(bchan_t *bchan)
1269 datparser_res_t *res = NULL;
1271 W i, err, l, t, r, b;
1274 if (i >= BCHAN_LAYOUT_MAXBLOCKING) {
1275 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
1279 err = datparser_getnextres(bchan->parser, &res);
1286 bchan_layout_appendres(bchan, res);
1289 datwindow_getworkrect(bchan->window, &w_work);
1291 datlayout_getdrawrect(bchan->layout, &l, &t, &r, &b);
1292 datwindow_setdrawrect(bchan->window, l, t, r, b);
1294 datwindow_requestredisp(bchan->window);
1297 LOCAL VOID bchan_retriever_task(W arg)
1300 datretriever_t *retr;
1303 bchan = (bchan_t*)arg;
1304 retr = bchan->retriever;
1307 DP(("before rcv_mbf %d\n", bchan->mbfid));
1308 err = rcv_mbf(bchan->mbfid, (VP)&msg, T_FOREVER);
1309 DP_ER("rcv_mbf", err);
1314 err = datretriever_request(retr);
1317 case DATRETRIEVER_REQUEST_ALLRELOAD:
1318 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_RELAYOUT);
1320 case DATRETRIEVER_REQUEST_PARTIAL_CONTENT:
1321 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_UPDATE);
1323 case DATRETRIEVER_REQUEST_NOT_MODIFIED:
1324 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_NOTMODIFIED);
1326 case DATRETRIEVER_REQUEST_NON_AUTHORITATIVE:
1327 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_NONAUTHORITATIVE);
1329 case DATRETRIEVER_REQUEST_NOT_FOUND:
1330 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_NOTFOUND);
1332 case DATRETRIEVER_REQUEST_UNEXPECTED:
1334 DP_ER("datretreiver_request error:",err);
1335 DATRETRIEVER_DP(retr);
1336 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_ERROR);
1344 LOCAL W bchan_prepare_network(bchan_t *bchan)
1346 if (bchan->retriever == NULL) {
1349 if (datretriever_isenablenetwork(bchan->retriever) == False) {
1353 bchan->mbfid = cre_mbf(sizeof(W), sizeof(W), DELEXIT);
1354 if (bchan->mbfid < 0) {
1355 DP_ER("cre_mbf error:", bchan->mbfid);
1358 bchan->taskid = cre_tsk(bchan_retriever_task, -1, (W)bchan);
1359 if (bchan->taskid < 0) {
1360 del_mbf(bchan->mbfid);
1362 DP_ER("cre_tsk error:", bchan->taskid);
1369 LOCAL W bchan_networkrequest(bchan_t *bchan)
1372 static UW lastrequest = 0;
1375 if (datretriever_isenablenetwork(bchan->retriever) == False) {
1376 pdsp_msg(bchan->hmistate.msg_cantretrieve);
1379 if (bchan->mbfid < 0) {
1383 err = get_etm(&etime);
1385 DP_ER("get_etm error:", err);
1388 if (lastrequest + 10000 > etime) {
1391 lastrequest = etime;
1393 err = snd_mbf(bchan->mbfid, &msg, sizeof(W), T_FOREVER);
1395 DP_ER("snd_mbf error:", err);
1399 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_BUSY);
1400 pdsp_msg(bchan->hmistate.msg_retrieving);
1405 LOCAL VOID keydwn(bchan_t *bchan, UH keycode, TC ch, UW stat)
1407 W l,t,r,b,l1,t1,r1,b1,scr;
1411 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1417 datwindow_scrollbyvalue(bchan->window, 0, scr);
1420 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1421 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1428 datwindow_scrollbyvalue(bchan->window, 0, scr);
1432 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1433 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1440 datwindow_scrollbyvalue(bchan->window, scr, 0);
1444 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1450 datwindow_scrollbyvalue(bchan->window, scr, 0);
1453 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1459 datwindow_scrollbyvalue(bchan->window, 0, scr);
1462 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1463 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1464 if (b + (b - t) > b1) {
1470 datwindow_scrollbyvalue(bchan->window, 0, scr);
1474 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1475 datlayout_getdrawrect(bchan->layout, &l1, &t1, &r1, &b1);
1476 if (r + (r - l) > r1) {
1482 datwindow_scrollbyvalue(bchan->window, scr, 0);
1486 datrender_getviewrect(bchan->render, &l, &t, &r, &b);
1492 datwindow_scrollbyvalue(bchan->window, scr, 0);
1495 bchan_networkrequest(bchan);
1497 case TK_E: /* temporary */
1498 if (stat & ES_CMD) {
1505 LOCAL VOID bchan_setupmenu(bchan_t *bchan)
1508 Bool titleenable, networkenable;
1510 str = datlayout_gettitle(bchan->layout);
1512 titleenable = False;
1517 networkenable = datretriever_isenablenetwork(bchan->retriever);
1519 bchan_mainmenu_setup(&bchan->mainmenu, titleenable, networkenable);
1522 LOCAL VOID bchan_selectmenu(bchan_t *bchan, W sel)
1524 UB *host, *board, *thread;
1525 W host_len, board_len, thread_len;
1528 case BCHAN_MAINMENU_SELECT_CLOSE: /* [½ªÎ»] */
1531 case BCHAN_MAINMENU_SELECT_REDISPLAY: /* [ºÆɽ¼¨] */
1532 datwindow_requestredisp(bchan->window);
1534 case BCHAN_MAINMENU_SELECT_THREADINFO: /* [¥¹¥ì¥Ã¥É¾ðÊó¤òɽ¼¨] */
1535 datcache_gethost(bchan->cache, &host, &host_len);
1536 datcache_getborad(bchan->cache, &board, &board_len);
1537 datcache_getthread(bchan->cache, &thread, &thread_len);
1538 bchan_panels_threadinfo(host, host_len, board, board_len, thread, thread_len);
1540 case BCHAN_MAINMENU_SELECT_TITLETOTRAY: /* [¥¹¥ì¥¿¥¤¤ò¥È¥ì¡¼¤ËÊ£¼Ì] */
1541 bchan_pushthreadtitle(bchan);
1543 case BCHAN_MAINMENU_SELECT_URLTOTRAY: /* [¥¹¥ì¥Ã¥É£Õ£Ò£Ì¤ò¥È¥ì¡¼¤ËÊ£¼Ì] */
1544 bchan_pushthreadurl(bchan);
1546 case BCHAN_MAINMENU_SELECT_NGWORD: /* [£Î£Ç¥ï¡¼¥ÉÀßÄê] */
1547 ngwordwindow_open(bchan->ngword);
1549 case BCHAN_MAINMENU_SELECT_THREADFETCH: /* [¥¹¥ì¥Ã¥É¼èÆÀ] */
1550 bchan_networkrequest(bchan);
1556 LOCAL VOID bchan_popupmenu(bchan_t *bchan, PNT pos)
1560 bchan_setupmenu(bchan);
1561 gset_ptr(PS_SELECT, NULL, -1, -1);
1562 sel = bchan_mainmenu_popup(&bchan->mainmenu, pos);
1564 bchan_selectmenu(bchan, sel);
1568 LOCAL VOID bchan_handletimeout(bchan_t *bchan, W code)
1571 case BCHAN_MESSAGE_RETRIEVER_UPDATE:
1572 bchan_update(bchan);
1573 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1576 case BCHAN_MESSAGE_RETRIEVER_RELAYOUT:
1577 bchan_relayout(bchan);
1578 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1581 case BCHAN_MESSAGE_RETRIEVER_NOTMODIFIED:
1582 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1583 pdsp_msg(bchan->hmistate.msg_notmodified);
1585 case BCHAN_MESSAGE_RETRIEVER_NONAUTHORITATIVE:
1586 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1587 pdsp_msg(bchan->hmistate.msg_nonauthoritative);
1589 case BCHAN_MESSAGE_RETRIEVER_NOTFOUND:
1590 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1591 pdsp_msg(bchan->hmistate.msg_notfound);
1593 case BCHAN_MESSAGE_RETRIEVER_ERROR:
1594 bchan_hmistate_updateptrstyle(&bchan->hmistate, PS_SELECT);
1595 pdsp_msg(bchan->hmistate.msg_networkerror);
1600 LOCAL VOID bchan_eventdispatch(bchan_t *bchan, dathmi_t *hmi)
1605 err = dathmi_getevent(hmi, &evt);
1607 /* TODO: error handling or ext_prc ? */
1611 switch (evt->type) {
1612 case DATHMIEVENT_TYPE_COMMON_MOUSEMOVE:
1614 case DATHMIEVENT_TYPE_COMMON_KEYDOWN:
1615 if (evt->data.common_keydown.stat & ES_CMD) { /*Ì¿Îᥡ¼*/
1616 bchan_setupmenu(bchan);
1617 sel = bchan_mainmenu_keyselect(&bchan->mainmenu, evt->data.common_keydown.keycode);
1619 bchan_selectmenu(bchan, sel);
1623 keydwn(bchan, evt->data.common_keydown.keytop, evt->data.common_keydown.keycode, evt->data.common_keydown.stat);
1625 case DATHMIEVENT_TYPE_COMMON_MENU:
1626 bchan_popupmenu(bchan, evt->data.common_menu.pos);
1628 case DATHMIEVENT_TYPE_COMMON_TIMEOUT:
1629 bchan_handletimeout(bchan, evt->data.common_timeout.code);
1631 case DATHMIEVENT_TYPE_THREAD_DRAW:
1634 case DATHMIEVENT_TYPE_THREAD_RESIZE:
1635 bchan_resize(bchan, evt->data.main_resize.work_sz);
1637 case DATHMIEVENT_TYPE_THREAD_CLOSE:
1638 bchan_close(bchan, evt->data.main_close.save);
1640 case DATHMIEVENT_TYPE_THREAD_BUTDN:
1641 bchan_butdn(bchan, evt->data.main_butdn.type, evt->data.main_butdn.pos);
1643 case DATHMIEVENT_TYPE_THREAD_PASTE:
1646 case DATHMIEVENT_TYPE_THREAD_SWITCH:
1647 if (bchan->request_confirm_open == True) {
1648 cfrmwindow_open(bchan->confirm);
1649 bchan->request_confirm_open = False;
1651 if (evt->data.main_switch.needdraw == True) {
1655 case DATHMIEVENT_TYPE_THREAD_MOUSEMOVE:
1656 gset_ptr(bchan->hmistate.ptr, NULL, -1, -1);
1658 case DATHMIEVENT_TYPE_CONFIRM_CLOSE:
1659 bchan_recieveclose(bchan, evt->data.confirm_close.send);
1661 case DATHMIEVENT_TYPE_NGWORD_CLOSE:
1662 case DATHMIEVENT_TYPE_NONE:
1668 typedef struct _arg {
1673 LOCAL CLI_arg MESSAGEtoargv(const MESSAGE *src)
1680 len = src->msg_size / sizeof(TC);
1681 str = (TC*)(src->msg_body.ANYMSG.msg_str);
1684 if(str[i] == TK_KSP){
1690 if(str[i] == TK_KSP){
1697 argv = (TC**)malloc(sizeof(TC*)*ac);
1701 if(str[i] == TNULL){
1707 if(str[i] == TNULL){
1720 EXPORT W MAIN(MESSAGE *msg)
1722 static RECT r0 = {{100, 100, 650+7, 400+30}};
1723 static RECT r1 = {{200, 80, 500+7, 230+30}};
1724 static PNT p2 = {200, 80};
1726 static PAT pat0 = {{
1739 datwindow_t *window;
1740 cfrmwindow_t *cfrmwindow;
1741 ngwordwindow_t *ngwordwindow;
1745 0x10000000, 0x10000000, 0x10FFFFFF, 0x10FFFFFF,
1749 err = dopn_dat(NULL);
1754 switch (msg->msg_type) {
1756 arg = MESSAGEtoargv(msg);
1760 err = get_lnk(arg.argv[1], &lnk, F_NORM);
1762 DP_ER("get_lnk error", err);
1765 vid = oreg_vob((VLINK*)&lnk, (VP)&vseg, -1, V_NODISP);
1767 DP_ER("error oreq_vob", vid);
1770 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);
1772 DP_ER("get_lnk error", err);
1775 err = dopn_dat(&dbx);
1777 DP_ER("dopn_dat error", err);
1780 fil_sts(&lnk, tit0, NULL, NULL);
1783 oend_req(((M_DISPREQ*)msg)->vid, -1);
1787 oend_req(((M_PASTEREQ*)msg)->vid, -1);
1791 if ((((M_EXECREQ*)msg)->mode & 2) != 0) {
1794 err = dopn_dat(&((M_EXECREQ*)msg)->self);
1798 fil_sts(&((M_EXECREQ*)msg)->lnk, tit0, NULL, NULL);
1799 vid = ((M_EXECREQ*)msg)->vid;
1810 window = dathmi_newmainwindow(hmi, &r0, tit0, &pat0, bchan_scroll, &bchan/* Ugh! */);
1811 if (window == NULL) {
1812 DP_ER("dathmi_newmainwindow error:", 0);
1816 cfrmwindow = dathmi_newconfirmwindow(hmi, &r1, BCHAN_DBX_TEXT_CONFIRM_TITLE, BCHAN_DBX_MS_CONFIRM_POST, BCHAN_DBX_MS_CONFIRM_CANCEL);
1817 if (cfrmwindow == NULL) {
1818 DP_ER("dathmi_newconfirmwindow error:", 0);
1819 dathmi_deletemainwindow(hmi, window);
1823 ngwordwindow = dathmi_newngwordwindow(hmi, &p2, BCHAN_DBX_SS_NGWORD_LIST, BCHAN_DBX_MS_NGWORD_DELETE, BCHAN_DBX_TB_NGWORD_APPEND, BCHAN_DBX_MS_NGWORD_APPEND);
1824 if (ngwordwindow == NULL) {
1825 DP_ER("dathmi_newngwordwindow error:", 0);
1826 dathmi_deleteconfirmwindow(hmi, cfrmwindow);
1827 dathmi_deletemainwindow(hmi, window);
1832 err = bchan_initialize(&bchan, vid, datwindow_getWID(window), msg->msg_type, hmi, window, cfrmwindow, ngwordwindow);
1834 DP_ER("bchan_initialize error", err);
1838 err = bchan_prepare_network(&bchan);
1840 DP_ER("bchan_prepare_network error:", err);
1844 size = datcache_datasize(bchan.cache);
1845 if ((msg->msg_type == EXECREQ)&&(size == 0)) {
1846 bchan_networkrequest(&bchan);
1848 req_tmg(0, BCHAN_MESSAGE_RETRIEVER_RELAYOUT);
1851 datwindow_requestredisp(window);
1855 bchan_eventdispatch(&bchan, hmi);