X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Freport.c;h=227fb6c017d465bf0806ea45cc7bfbeac9842021;hb=8d8f7e83ef66d7faf469f6ea9442a7268d0a0ac3;hp=a5870ebdd4d6c41288edb261aca86cc1a7929e22;hpb=ab71578bf097c49e67717990e55f825cc8ff2ff5;p=hengband%2Fhengband.git diff --git a/src/report.c b/src/report.c index a5870ebdd..227fb6c01 100644 --- a/src/report.c +++ b/src/report.c @@ -1,6 +1,11 @@ -/* File: report.c */ +/*! + * @file report.c + * @brief スコアサーバ転送機能の実装 + * @date 2014/07/14 + * @author Hengband Team + */ -#define _GNU_SOURCE +#define _GNU_SOURCE /*!< 未使用*/ #include "angband.h" #ifdef WORLD_SCORE @@ -26,46 +31,41 @@ #include #endif +/* + * internet resource value + */ +#define HTTP_PROXY "" /*!< デフォルトのプロキシURL / Default proxy url */ +#define HTTP_PROXY_PORT 0 /*!< デフォルトのプロキシポート / Default proxy port */ +#define HTTP_TIMEOUT 20 /*!< デフォルトのタイムアウト時間(秒) / Timeout length (second) */ +#define SCORE_SERVER "hengband.osdn.jp" /*!< デフォルトのスコアサーバURL / Default score server url */ +#define SCORE_PORT 80 /*!< デフォルトのスコアサーバポート / Default score server port */ + #ifdef JP -#define SCORE_PATH "http://www.kmc.gr.jp/~habu/local/hengscore/score.cgi" +#define SCORE_PATH "http://hengband.osdn.jp/score/register_score.php" /*!< スコア開示URL */ #else -#define SCORE_PATH "http://www.kmc.gr.jp/~habu/local/hengscore-en/score.cgi" +#define SCORE_PATH "http://moon.kmc.gr.jp/hengband/hengscore-en/score.cgi" /*!< スコア開示URL */ #endif /* for debug */ -/*#define SCORE_PATH "http://www.kmc.gr.jp/~habu/local/scoretest/score.cgi" */ +#if 0 +#define SCORE_PATH "http://moon.kmc.gr.jp/hengband/scoretest/score.cgi" /*!< スコア開示URL */ +#endif /* * simple buffer library */ - typedef struct { size_t max_size; size_t size; char *data; } BUF; -#define BUFSIZE (65536) - -#ifndef HAVE_VASPRINTF -#define vasprintf Vasprintf - -static int Vasprintf(char **buf, const char *fmt, va_list ap) -{ - int ret; - - *buf = malloc(1024); - -#if defined(HAVE_VSNPRINTF) - ret = vsnprintf(*buf, 1024, fmt, ap); -#else - ret = vsprintf(*buf, fmt, ap); -#endif - return ret; -} - -#endif /* ifndef HAVE_VASPRINTF */ +#define BUFSIZE (65536) /*!< スコアサーバ転送バッファサイズ */ +/*! + * @brief 転送用バッファの確保 + * @return 確保したバッファの参照ポインタ + */ static BUF* buf_new(void) { BUF *p; @@ -83,12 +83,23 @@ static BUF* buf_new(void) return p; } +/*! + * @brief 転送用バッファの解放 + * @param b 解放するバッファの参照ポインタ + */ static void buf_delete(BUF *b) { free(b->data); free(b); } +/*! + * @brief 転送用バッファにデータを追加する + * @param buf 追加先バッファの参照ポインタ + * @param data 追加元データ + * @param size 追加サイズ + * @return 追加後のバッファ容量 + */ static int buf_append(BUF *buf, const char *data, size_t size) { while (buf->size + size > buf->max_size) @@ -109,31 +120,50 @@ static int buf_append(BUF *buf, const char *data, size_t size) return buf->size; } +/*! + * @brief 転送用バッファにフォーマット指定した文字列データを追加する + * @param buf 追加先バッファの参照ポインタ + * @param fmt 文字列フォーマット + * @return 追加後のバッファ容量 + */ static int buf_sprintf(BUF *buf, const char *fmt, ...) { int ret; - char *tmpbuf; + char tmpbuf[8192]; va_list ap; va_start(ap, fmt); - vasprintf(&tmpbuf, fmt, ap); +#if defined(HAVE_VSNPRINTF) + ret = vsnprintf(tmpbuf, sizeof(tmpbuf), fmt, ap); +#else + ret = vsprintf(tmpbuf, fmt, ap); +#endif va_end(ap); - if(!tmpbuf) return -1; + if (ret < 0) return -1; -#ifdef MAC_MPW +#if ('\r' == 0x0a && '\n' == 0x0d) { - /* '\n' is 0x0D and '\r' is 0x0A in MPW. Swap back these. */ + /* + * Originally '\r'= CR (= 0x0d) and '\n'= LF (= 0x0a) + * But for MPW (Macintosh Programers Workbench), these + * are reversed so that '\r'=LF and '\n'=CR unless the + * -noMapCR option is not defined. + * + * We need to swap back these here since the score + * dump text should be written using LF as the end of + * line. + */ char *ptr; for (ptr = tmpbuf; *ptr; ptr++) - if ('\n' == *ptr) *ptr = '\r'; + { + if (0x0d == *ptr) *ptr = 0x0a; + } } #endif ret = buf_append(buf, tmpbuf, strlen(tmpbuf)); - free(tmpbuf); - return ret; } @@ -168,7 +198,7 @@ static int buf_search(BUF *buf, const char *str) { char *ret; - ret = strstr(buf->data, str); + ret = my_strstr(buf->data, str); if (!ret) return -1; @@ -191,30 +221,53 @@ static BUF * buf_subbuf(BUF *buf, int pos1, size_t sz) } #endif -static void http_post(int sd, char *url, BUF *buf) +/*! + * @brief HTTPによるダンプ内容伝送 + * @param sd ソケットID + * @param url 伝送先URL + * @param buf 伝送内容バッファ + * @return なし + */ +static bool http_post(int sd, cptr url, BUF *buf) { BUF *output; + char response_buf[1024] = ""; + const char *HTTP_RESPONSE_CODE_OK = "HTTP/1.1 200 OK"; output = buf_new(); - buf_sprintf(output, "POST %s HTTP/1.0\n", url); - buf_sprintf(output, "User-Agent: Hengband %d.%d.%d\n", + buf_sprintf(output, "POST %s HTTP/1.0\r\n", url); + buf_sprintf(output, "User-Agent: Hengband %d.%d.%d\r\n", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); - buf_sprintf(output, "Content-Length: %d\n", buf->size); - buf_sprintf(output, "Content-Encoding: binary\n"); - buf_sprintf(output, "Content-Type: application/octet-stream\n"); - buf_sprintf(output, "\n"); + buf_sprintf(output, "Content-Length: %d\r\n", buf->size); + buf_sprintf(output, "Content-Encoding: binary\r\n"); +#ifdef JP +#ifdef SJIS + buf_sprintf(output, "Content-Type: text/plain; charset=SHIFT_JIS\r\n"); +#endif +#ifdef EUC + buf_sprintf(output, "Content-Type: text/plain; charset=EUC-JP\r\n"); +#endif +#else + buf_sprintf(output, "Content-Type: text/plain; charset=ASCII\r\n"); +#endif + buf_sprintf(output, "\r\n"); buf_append(output, buf->data, buf->size); soc_write(sd, output->data, output->size); -} + soc_read(sd, response_buf, sizeof(response_buf)); -/* ¥­¥ã¥é¥¯¥¿¥À¥ó¥×¤òºî¤Ã¤Æ BUF¤ËÊݸ */ + return strncmp(response_buf, HTTP_RESPONSE_CODE_OK, strlen(HTTP_RESPONSE_CODE_OK)) == 0; +} + +/*! + * @brief キャラクタダンプを作って BUFに保存 + * @param dumpbuf 伝送内容バッファ + * @return エラーコード + */ static errr make_dump(BUF* dumpbuf) { - errr make_character_dump(FILE *fff); - char buf[1024]; FILE *fff; char file_name[1024]; @@ -224,7 +277,7 @@ static errr make_dump(BUF* dumpbuf) if (!fff) { #ifdef JP - msg_format("°ì»þ¥Õ¥¡¥¤¥ë %s ¤òºîÀ®¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£", file_name); + msg_format("一時ファイル %s を作成できませんでした。", file_name); #else msg_format("Failed to create temporary file %s.", file_name); #endif @@ -232,7 +285,7 @@ static errr make_dump(BUF* dumpbuf) return 1; } - /* °ìö°ì»þ¥Õ¥¡¥¤¥ë¤òºî¤ë¡£Ä̾ï¤Î¥À¥ó¥×½ÐÎϤȶ¦Ä̲½¤¹¤ë¤¿¤á¡£ */ + /* 一旦一時ファイルを作る。通常のダンプ出力と共通化するため。 */ (void)make_character_dump(fff); /* Close the file */ @@ -256,8 +309,9 @@ static errr make_dump(BUF* dumpbuf) return (0); } -/* - * Make screen dump to buffer +/*! + * @brief スクリーンダンプを作成する/ Make screen dump to buffer + * @return 作成したスクリーンダンプの参照ポインタ */ cptr make_screen_dump(void) { @@ -268,39 +322,57 @@ cptr make_screen_dump(void) byte a = 0, old_a = 0; char c = ' '; - static char *html_head[] = { + static cptr html_head[] = { "\n\n", "
",
 		0,
 	};
-	static char *html_foot[] = {
+	static cptr html_foot[] = {
 		"
\n", "\n\n", 0, }; - if (use_graphics) - return NULL; + bool old_use_graphics = use_graphics; + + int wid, hgt; + + Term_get_size(&wid, &hgt); /* Alloc buffer */ screen_buf = buf_new(); if (screen_buf == NULL) return (NULL); + if (old_use_graphics) + { + /* Clear -more- prompt first */ + msg_print(NULL); + + use_graphics = FALSE; + reset_visuals(); + + /* Redraw everything */ + p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); + + /* Hack -- update */ + handle_stuff(); + } + for (i = 0; html_head[i]; i++) buf_sprintf(screen_buf, html_head[i]); /* Dump the screen */ - for (y = 0; y < 24; y++) + for (y = 0; y < hgt; y++) { /* Start the row */ if (y != 0) buf_sprintf(screen_buf, "\n"); /* Dump each row */ - for (x = 0; x < 79; x++) + for (x = 0; x < wid - 1; x++) { int rv, gv, bv; - char *cc = NULL; + cptr cc = NULL; /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); @@ -309,6 +381,8 @@ cptr make_screen_dump(void) case '&': cc = "&"; break; case '<': cc = "<"; break; case '>': cc = ">"; break; + case '"': cc = """; break; + case '\'': cc = "'"; break; #ifdef WINDOWS case 0x1f: c = '.'; break; case 0x7f: c = (a == 0x09) ? '%' : '#'; break; @@ -336,24 +410,40 @@ cptr make_screen_dump(void) buf_sprintf(screen_buf, html_foot[i]); /* Screen dump size is too big ? */ - if (screen_buf->size + 1> SCREEN_BUF_SIZE) + if (screen_buf->size + 1> SCREEN_BUF_MAX_SIZE) { - buf_delete(screen_buf); - return (NULL); + ret = NULL; } + else + { + /* Terminate string */ + buf_append(screen_buf, "", 1); - /* Terminate string */ - buf_append(screen_buf, "", 1); - - ret = string_make(screen_buf->data); + ret = string_make(screen_buf->data); + } /* Free buffer */ buf_delete(screen_buf); + if (old_use_graphics) + { + use_graphics = TRUE; + reset_visuals(); + + /* Redraw everything */ + p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); + + /* Hack -- update */ + handle_stuff(); + } + return ret; } - +/*! + * @brief スコア転送処理のメインルーチン + * @return エラーコード + */ errr report_score(void) { #ifdef MACINTOSH @@ -374,14 +464,14 @@ errr report_score(void) score = buf_new(); #ifdef JP - sprintf(seikakutmp, "%s%s", ap_ptr->title, (ap_ptr->no ? "¤Î" : "")); + sprintf(seikakutmp, "%s%s", ap_ptr->title, (ap_ptr->no ? "の" : "")); #else sprintf(seikakutmp, "%s ", ap_ptr->title); #endif - buf_sprintf(score, "name: %s\n", player_name); + buf_sprintf(score, "name: %s\n", p_ptr->name); #ifdef JP - buf_sprintf(score, "version: ÊѶòÈÚÅÜ %d.%d.%d\n", + buf_sprintf(score, "version: 変愚蛮怒 %d.%d.%d\n", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); #else buf_sprintf(score, "version: Hengband %d.%d.%d\n", @@ -400,7 +490,7 @@ errr report_score(void) buf_sprintf(score, "seikaku: %s\n", seikakutmp); buf_sprintf(score, "realm1: %s\n", realm_names[p_ptr->realm1]); buf_sprintf(score, "realm2: %s\n", realm_names[p_ptr->realm2]); - buf_sprintf(score, "killer: %s\n", died_from); + buf_sprintf(score, "killer: %s\n", p_ptr->died_from); buf_sprintf(score, "-----charcter dump-----\n"); make_dump(score); @@ -438,41 +528,75 @@ errr report_score(void) { char buff[160]; #ifdef JP - prt("ÀܳÃæ...", 0, 0); + prt("接続中...", 0, 0); #else prt("connecting...", 0, 0); #endif Term_fresh(); - sd = connect_scoreserver(); - if (!(sd < 0)) break; + /* プロキシを設定する */ + set_proxy(HTTP_PROXY, HTTP_PROXY_PORT); + + /* Connect to the score server */ + sd = connect_server(HTTP_TIMEOUT, SCORE_SERVER, SCORE_PORT); + + + if (sd < 0) { #ifdef JP - sprintf(buff, "¥¹¥³¥¢¡¦¥µ¡¼¥Ð¤Ø¤ÎÀܳ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£(%s)", soc_err()); + sprintf(buff, "スコア・サーバへの接続に失敗しました。(%s)", soc_err()); #else - sprintf(buff, "Failed to connect to the score server.(%s)", soc_err()); + sprintf(buff, "Failed to connect to the score server.(%s)", soc_err()); #endif - prt(buff, 0, 0); - (void)inkey(); - + prt(buff, 0, 0); + (void)inkey(); + #ifdef JP - if (!get_check("¤â¤¦°ìÅÙÀܳ¤ò»î¤ß¤Þ¤¹¤«? ")) + if (!get_check_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) #else - if (!get_check("Try again? ")) + if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) #endif - { - err = 1; - goto report_end; + { + err = 1; + goto report_end; + } + + continue; } - } + +#ifdef JP + prt("スコア送信中...", 0, 0); +#else + prt("Sending the score...", 0, 0); +#endif + Term_fresh(); + + if (!http_post(sd, SCORE_PATH, score)) { + disconnect_server(sd); #ifdef JP - prt("¥¹¥³¥¢Á÷¿®Ãæ...", 0, 0); + sprintf(buff, "スコア・サーバへの送信に失敗しました。"); #else - prt("Sending the score...", 0, 0); + sprintf(buff, "Failed to send to the score server."); #endif - Term_fresh(); - http_post(sd, SCORE_PATH, score); + prt(buff, 0, 0); + (void)inkey(); + +#ifdef JP + if (!get_check_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) +#else + if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) +#endif + { + err = 1; + goto report_end; + } + + continue; + } + + disconnect_server(sd); + break; + } - disconnect_server(sd); report_end: #ifdef WINDOWS WSACleanup();