12 #include "utils/nt_std_t.h"
13 #include "utils/file.h"
14 #include "utils/base64.h"
15 #include "net/nt_http.h"
16 #include "net/nt_cookie.h"
17 #include "_2ch/model_2ch.h"
18 #include "_2ch/_2ch.h"
20 char *URL_2CH_BOARDMENU = "http://menu.2ch.net/bbsmenu.html";
21 nt_2ch_model_tp app_2ch_modelp;
24 #define S_SIZE (1024*2)
26 static BOOL conv_sjis2wc(iconv_t icd,
27 const char *src, wchar_t *data, size_t data_len);
28 static BOOL conv_wc2sjis(iconv_t icd,
29 const wchar_t *src, char *data, size_t data_len);
30 static BOOL conv_local2sjis(iconv_t icd,
31 const char *src, char *data, size_t data_len);
32 static BOOL set_post_data(char *data, size_t data_len,
33 const wchar_t *bbs, const wchar_t *id,
34 const char *name, const char *mail,
37 BOOL nt_2ch_model_init(){
38 app_2ch_modelp = nt_2ch_model_alloc();
39 return (NULL != app_2ch_modelp);
42 BOOL nt_init_board_menu()
45 char *url = URL_2CH_BOARDMENU;
48 char s_src[S_SIZE], s_dst[S_SIZE*sizeof(wchar_t)];
52 memset(s_src, '\0', S_SIZE);
53 memset(s_dst, '\0', S_SIZE*sizeof(wchar_t));
55 if(!nt_make_sha1_path(LOG_PATH, url, &outp)){
60 if(!nt_http_get(url, outp, NULL, NULL, NULL)){
65 fp_src = fopen(outp, "r");
70 icd = iconv_open("wchar_t", "cp932");
71 if(((iconv_t)-1) == icd){
79 fgets(s_src, S_SIZE, fp_src);
83 n_src = strlen(s_src);
86 size_t sz = iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
88 fprintf(stderr, "errno: %d %s\n", errno, s_src);
93 *((wchar_t*)p_dst) = L'\0';
94 parse_board_menu(app_2ch_modelp, (const wchar_t*)s_dst);
107 BOOL nt_read_thread(nt_2ch_model_tp modelp)
110 wchar_t referer[1024];
113 wchar_t *file_name, *cptr;
114 wchar_t *server_name, *board_name;
116 nt_thread_tp threadp;
120 char s_src[S_SIZE*sizeof(wchar_t)];
121 char s_dst[S_SIZE*sizeof(wchar_t)];
125 memset(s_src, '\0', sizeof(s_src));
126 memset(s_dst, '\0', sizeof(s_dst));
129 if(!modelp->selected_categoryp)
131 if(!modelp->selected_boardp)
133 if(!modelp->selected_threadp)
136 boardp = modelp->selected_boardp;
137 threadp = modelp->selected_threadp;
138 file_name = threadp->file_name;
140 wcscpy(url, boardp->address);
144 if(url[len-1] != L'/'){
149 wcscat(url, L"dat/");
150 wcscat(url, file_name);
152 if(!nt_parse_server_name_and_board_name(boardp->address,
153 buf, sizeof(buf), &server_name, &board_name)){
157 wcscpy(referer, L"http://");
158 wcscat(referer, server_name);
159 wcscat(referer, L"/test/read.cgi/");
160 wcscat(referer, board_name);
161 wcscat(referer, L"/");
162 cptr = nt_rid_sufix(file_name);
165 wcscat(referer, cptr);
167 wcscat(referer, L"/");
168 len = wcstombs(s_src, url, sizeof(s_src)-1);
171 len = wcstombs(s_dst, referer, sizeof(s_dst)-1);
174 if(!nt_make_sha1_path(LOG_PATH, s_src, &outp)){
178 if(!nt_http_get(s_src, outp, s_dst, NULL, NULL)){
182 fp_src = fopen(outp, "r");
187 icd = iconv_open("wchar_t", "cp932");
188 if(((iconv_t)-1) == icd){
193 threadp->num_res = 0;
198 fgets(s_src, S_SIZE, fp_src);
202 n_src = strlen(s_src);
203 n_dst = sizeof(s_dst)-1;
205 size_t sz = iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
207 //fprintf(stderr, "errno: %d %s\n", errno, s_src);
211 *((wchar_t*)p_dst) = L'\0';
212 parse_thread(threadp, (const wchar_t*)s_dst);
221 BOOL nt_read_board(nt_2ch_model_tp modelp)
229 char s_src[S_SIZE], s_dst[S_SIZE*sizeof(wchar_t)];
234 memset(data, 0, sizeof(data));
235 memset(s_src, '\0', S_SIZE);
236 memset(s_dst, '\0', S_SIZE*sizeof(wchar_t));
238 if(!modelp->selected_categoryp)
240 if(!modelp->selected_boardp)
243 boardp = modelp->selected_boardp;
244 nt_board_children_free(boardp);
245 address = boardp->address;
248 len = wcstombs(data, address, sizeof(data)-1);
252 if(data[len-1] != '/')
254 strcat(data, "subject.txt");
257 if(!nt_make_sha1_path(LOG_PATH, data, &outp)){
261 if(!nt_http_get(data, outp, URL_2CH_BOARDMENU, NULL, NULL)){
266 fp_src = fopen(outp, "r");
271 icd = iconv_open("wchar_t", "cp932");
272 if(((iconv_t)-1) == icd){
281 fgets(s_src, S_SIZE, fp_src);
285 n_src = strlen(s_src);
288 size_t sz = iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
290 fprintf(stderr, "errno: %d %s\n", errno, s_src);
294 *((wchar_t*)p_dst) = L'\0';
295 parse_board(boardp, (const wchar_t*)s_dst);
305 BOOL nt_write_msg(nt_2ch_model_tp modelp, nt_write_data_tp writep,
306 nt_cookie_tp cookiep, nt_maru_2ch_tp marup)
309 wchar_t referer[1024];
310 char post_data[1024*4];
312 char out_buf[1024*4];
315 wchar_t *server_name, *board_name;
317 nt_thread_tp threadp;
319 char s_src[S_SIZE*sizeof(wchar_t)];
320 char s_dst[S_SIZE*sizeof(wchar_t)];
324 memset(s_src, '\0', sizeof(s_src));
325 memset(s_dst, '\0', sizeof(s_dst));
326 memset(post_data, '\0', sizeof(post_data));
330 if(!modelp->selected_categoryp)
332 if(!modelp->selected_boardp)
334 if(!modelp->selected_threadp)
337 boardp = modelp->selected_boardp;
338 threadp = modelp->selected_threadp;
339 file_name = threadp->file_name;
341 if(!nt_parse_server_name_and_board_name(boardp->address,
342 buf, sizeof(buf), &server_name, &board_name)){
346 wcscpy(url, L"http://");
347 wcscat(url, server_name);
348 wcscat(url, L"/test/bbs.cgi");
350 wcscpy(referer, L"http://");
351 wcscat(referer, server_name);
352 wcscat(referer, L"/test/read.cgi/");
353 wcscat(referer, board_name);
354 wcscat(referer, L"/");
355 dat_name = nt_rid_sufix(file_name);
358 wcscat(referer, dat_name);
359 wcscat(referer, L"/");
361 len = wcstombs(s_src, url, sizeof(s_src)-1);
364 len = wcstombs(s_dst, referer, sizeof(s_dst)-1);
367 if(!set_post_data(post_data, sizeof(post_data),
368 board_name, dat_name, writep->name,
369 writep->mail, writep->msg)){
372 strcat(post_data, "&yuki=akari");
374 if(marup && marup->sid){
375 strcat(post_data, "&sid=");
376 strcat(post_data, marup->sid);
378 if(!nt_http_post(s_src, post_data, out_buf, sizeof(out_buf),
379 s_dst, NULL, NULL, cookiep)){
382 icd = iconv_open("wchar_t", "cp932");
383 if(((iconv_t)-1) == icd){
387 if(writep->result_html)
388 free(writep->result_html);
389 writep->result_html = malloc(1024*sizeof(wchar_t)*4);
390 if(!writep->result_html)
393 if(!conv_sjis2wc(icd, out_buf, writep->result_html,
394 1024*sizeof(wchar_t)*4)){
405 static BOOL set_post_data(char *data, size_t data_len,
406 const wchar_t *bbs, const wchar_t *id,
407 const char *name, const char *mail,
415 assert(bbs && id && name && mail && msg);
417 memset(buf, 0, sizeof(buf));
418 memset(buf2, 0, sizeof(buf2));
420 icd = iconv_open("cp932", "wchar_t");
421 if(((iconv_t)-1) == icd){
428 strcpy(cptr, "bbs=");
429 cptr += strlen(data);
430 if(!conv_wc2sjis(icd, bbs, buf, sizeof(buf)))
434 strcpy(cptr, "&key=");
435 cptr += strlen(cptr);
436 if(!conv_wc2sjis(icd, id, buf, sizeof(buf)))
440 strcpy(cptr, "&time=");
441 cptr += strlen(cptr);
442 sprintf(buf, "%ld&FROM=", t);
448 icd = iconv_open("cp932", "UTF-8");
449 if(icd == (iconv_t)-1){
454 if(name && 0 < strlen(name)){
455 if(!conv_local2sjis(icd, name, buf, sizeof(buf)))
457 if(!url_encode(buf, buf2, sizeof(buf2)))
460 cptr += strlen(buf2);
462 strcpy(cptr, "&mail=");
463 cptr += strlen(cptr);
464 if(mail && 0 < strlen(mail)){
465 if(!conv_local2sjis(icd, mail, buf, sizeof(buf)))
467 if(!url_encode(buf, buf2, sizeof(buf2)))
470 cptr += strlen(buf2);
472 strcpy(cptr, "&MESSAGE=");
473 cptr += strlen(cptr);
474 if(msg && 0 < strlen(msg)){
475 if(!conv_local2sjis(icd, msg, buf, sizeof(buf)))
477 if(!url_encode(buf, buf2, sizeof(buf2)))
480 cptr += strlen(buf2);
482 strcpy(cptr, "&submit=8F%91%82%AB%8D%9E%82%DE");
489 static BOOL conv_sjis2wc(iconv_t icd,
490 const char *src, wchar_t *data, size_t data_len)
493 size_t n_src, n_dst, sz;
496 n_src = strlen(src) * sizeof(char);
499 sz = iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
505 *((wchar_t*)p_dst) = L'\0';
509 static BOOL conv_wc2sjis(iconv_t icd,
510 const wchar_t *src, char *data, size_t data_len)
513 size_t n_src, n_dst, sz;
516 n_src = wcslen(src) * sizeof(wchar_t);
519 sz = iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
530 static BOOL conv_local2sjis(iconv_t icd,
531 const char *src, char *data, size_t data_len)
534 size_t n_src, n_dst, sz;
537 n_src = strlen(p_src);
540 sz = iconv(icd, &p_src, &n_src, &p_dst, &n_dst);
541 if(((size_t)-1) == sz){