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
34 #include <btron/btron.h>
35 #include <btron/hmi.h>
39 #include "sjisstring.h"
42 LOCAL W postresdata_appendstring(TC **dest, W *dest_len, TC *str, W len)
44 *dest = realloc(*dest, sizeof(TC)*(*dest_len + len + 1));
49 memcpy((*dest)+*dest_len, str, sizeof(TC)*len);
51 (*dest)[*dest_len] = TNULL;
56 #define POSTRESDATA_VALID_FROM 1
57 #define POSTRESDATA_VALID_mail 2
58 LOCAL tctokenchecker_valuetuple_t postreadata_nametable[] = {
59 {(TC[]){TK_F, TK_R, TK_O, TK_M, TNULL}, POSTRESDATA_VALID_FROM},
60 {(TC[]){TK_m, TK_a, TK_i, TK_l, TNULL}, POSTRESDATA_VALID_mail},
63 LOCAL W postresdata_readtad(postresdata_t *post, TC *str, W len)
66 TIMFPARSER_RESULT_T cont;
68 W rcvlen, val, err = 0;
70 timfparser_initialize(&timf, postreadata_nametable, 2, str, len);
73 cont = timfparser_next(&timf, &val, &bin, &rcvlen);
74 if (cont == TIMFPARSER_RESULT_HEADERVALUE) {
75 if (val == POSTRESDATA_VALID_FROM) {
76 err = postresdata_appendstring(&(post->from), &(post->from_len), (TC*)bin, rcvlen/sizeof(TC));
80 } else if (val == POSTRESDATA_VALID_mail) {
81 err = postresdata_appendstring(&(post->mail), &(post->mail_len), (TC*)bin, rcvlen/sizeof(TC));
86 } else if (cont == TIMFPARSER_RESULT_BODY) {
87 err = postresdata_appendstring(&(post->message), &(post->message_len), (TC*)bin, rcvlen/sizeof(TC));
91 } else if (cont == TIMFPARSER_RESULT_END) {
98 timfparser_finalize(&timf);
103 EXPORT W postresdata_readfile(postresdata_t *post, VLINK *vlnk)
108 fd = opn_fil((LINK*)vlnk, F_READ, NULL);
112 err = fnd_rec(fd, F_TOPEND, RM_TADDATA, 0, NULL);
117 err = rea_rec(fd, 0, NULL, 0, &size, NULL);
122 buf = malloc(size*sizeof(UB));
125 return -1; /* TODO */
127 err = rea_rec(fd, 0, buf, size, NULL, NULL);
135 err = postresdata_readtad(post, (TC *)buf, size/sizeof(TC));
142 LOCAL W postresdata_appendasciistring(UB **dest, W *dest_len, UB *str, W len)
144 return sjstring_appendasciistring(dest, dest_len, str, len);
147 LOCAL W postesdata_appendconvertedstring(TF_CTX *ctx, UB **dest, W *dlen, TC *src, W slen)
156 err = tf_tcstostr(*ctx, src, slen, 0, TF_ATTR_START, NULL, &buf_len);
160 buf = malloc(buf_len);
162 return -1; /* TODO */
164 err = tf_tcstostr(*ctx, src, slen, 0, TF_ATTR_START, buf, &buf_len);
169 err = sjstring_appendurlencodestring(dest, dlen, buf, buf_len);
175 LOCAL W postesdata_appendUWstring(UB **dest, W *dlen, UW n)
177 return sjstring_appendUWstring(dest, dlen, n);
180 EXPORT W postresdata_genrequestbody(postresdata_t *post, UB *board, W board_len, UB *thread, W thread_len, STIME time, UB **body, W *body_len)
184 W err, ctx_id, buf_ret_len = 0;
185 UB name_bbs[] = "bbs=";
186 UB name_key[] = "&key=";
187 UB name_time[] = "&time=";
188 UB name_FROM[] = "&FROM=";
189 UB name_mail[] = "&mail=";
190 UB name_MESSAGE[] = "&MESSAGE=";
191 UB name_submit[] = "&submit=%8F%91%82%AB%8D%9E%82%DE";
193 err = tf_open_ctx(&ctx);
197 ctx_id = tf_to_id(TF_ID_PROFSET_CONVERTTO, "Shift_JIS");
202 err = tf_set_profile(ctx, ctx_id);
208 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_bbs, strlen(name_bbs));
213 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, board, board_len);
218 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_key, strlen(name_key));
223 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, thread, thread_len);
228 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_time, strlen(name_time));
233 err = postesdata_appendUWstring(&buf_ret, &buf_ret_len, time + 473385600);
238 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_FROM, strlen(name_FROM));
243 err = postesdata_appendconvertedstring(&ctx, &buf_ret, &buf_ret_len, post->from, post->from_len);
248 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_mail, strlen(name_mail));
253 err = postesdata_appendconvertedstring(&ctx, &buf_ret, &buf_ret_len, post->mail, post->mail_len);
258 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_MESSAGE, strlen(name_MESSAGE));
263 err = postesdata_appendconvertedstring(&ctx, &buf_ret, &buf_ret_len, post->message, post->message_len);
268 err = postresdata_appendasciistring(&buf_ret, &buf_ret_len, name_submit, strlen(name_submit));
277 *body_len = buf_ret_len;
282 EXPORT postresdata_t* postresdata_new()
286 post = (postresdata_t*)malloc(sizeof(postresdata_t));
294 post->message = NULL;
295 post->message_len = 0;
300 EXPORT VOID postresdata_delete(postresdata_t *post)
302 if (post->message != NULL) {
305 if (post->mail != NULL) {
308 if (post->from != NULL) {