X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Freport.c;h=733e9ba20139a77bea4e7ccb278b231873791365;hb=7de4d6dfb51f88bb16a02b538ab727fc1a6b9858;hp=08e38dd17342567f1a8792e1f64afbd60d3c49d2;hpb=c7b2453c02694e8bb0588d7688fe66b64972558a;p=hengband%2Fhengband.git diff --git a/src/report.c b/src/report.c index 08e38dd17..733e9ba20 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 @@ -29,35 +34,38 @@ /* * internet resource value */ -#define HTTP_PROXY "" /* Default proxy url */ -#define HTTP_PROXY_PORT 0 /* Default proxy port */ -#define HTTP_TIMEOUT 20 /* Timeout length (second) */ -#define SCORE_SERVER "www.kmc.gr.jp" /* Default score server url */ -#define SCORE_PORT 80 /* Default score server port */ +#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 */ #if 0 -#define SCORE_PATH "http://www.kmc.gr.jp/~habu/local/scoretest/score.cgi" +#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) +#define BUFSIZE (65536) /*!< スコアサーバ転送バッファサイズ */ +/*! + * @brief 転送用バッファの確保 + * @return 確保したバッファの参照ポインタ + */ static BUF* buf_new(void) { BUF *p; @@ -75,13 +83,24 @@ static BUF* buf_new(void) return p; } +/*! + * @brief 転送用バッファの解放 + * @param b 解放するバッファの参照ポインタ + */ static void buf_delete(BUF *b) { free(b->data); free(b); } -static int buf_append(BUF *buf, const char *data, size_t size) +/*! + * @brief 転送用バッファにデータを追加する + * @param buf 追加先バッファの参照ポインタ + * @param data 追加元データ + * @param size 追加サイズ + * @return 追加後のバッファ容量 + */ +static int buf_append(BUF *buf, concptr data, size_t size) { while (buf->size + size > buf->max_size) { @@ -101,7 +120,13 @@ static int buf_append(BUF *buf, const char *data, size_t size) return buf->size; } -static int buf_sprintf(BUF *buf, const char *fmt, ...) +/*! + * @brief 転送用バッファにフォーマット指定した文字列データを追加する + * @param buf 追加先バッファの参照ポインタ + * @param fmt 文字列フォーマット + * @return 追加後のバッファ容量 + */ +static int buf_sprintf(BUF *buf, concptr fmt, ...) { int ret; char tmpbuf[8192]; @@ -169,7 +194,7 @@ static int buf_write(BUF *buf, int fd) return buf->size; } -static int buf_search(BUF *buf, const char *str) +static int buf_search(BUF *buf, concptr str) { char *ret; @@ -196,31 +221,56 @@ static BUF * buf_subbuf(BUF *buf, int pos1, size_t sz) } #endif -static void http_post(int sd, cptr url, BUF *buf) +/*! + * @brief HTTPによるダンプ内容伝送 + * @param sd ソケットID + * @param url 伝送先URL + * @param buf 伝送内容バッファ + * @return なし + */ +static bool http_post(int sd, concptr url, BUF *buf) { BUF *output; + char response_buf[1024] = ""; + concptr 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)); + + return strncmp(response_buf, HTTP_RESPONSE_CODE_OK, strlen(HTTP_RESPONSE_CODE_OK)) == 0; +} -/* キャラクタダンプを作って BUFに保存 */ +/*! + * @brief キャラクタダンプを作って BUFに保存 + * @param dumpbuf 伝送内容バッファ + * @return エラーコード + */ static errr make_dump(BUF* dumpbuf) { char buf[1024]; FILE *fff; - char file_name[1024]; + GAME_TEXT file_name[1024]; /* Open a new file */ fff = my_fopen_temp(file_name, 1024); @@ -237,8 +287,6 @@ static errr make_dump(BUF* dumpbuf) /* 一旦一時ファイルを作る。通常のダンプ出力と共通化するため。 */ (void)make_character_dump(fff); - - /* Close the file */ my_fclose(fff); /* Open for read */ @@ -248,8 +296,6 @@ static errr make_dump(BUF* dumpbuf) { (void)buf_sprintf(dumpbuf, "%s", buf); } - - /* Close the file */ my_fclose(fff); /* Remove the file */ @@ -259,24 +305,25 @@ 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) +concptr make_screen_dump(void) { BUF *screen_buf; int y, x, i; - cptr ret; + concptr ret; - byte a = 0, old_a = 0; - char c = ' '; + TERM_COLOR a = 0, old_a = 0; + SYMBOL_CODE c = ' '; - static cptr html_head[] = { + static concptr html_head[] = { "\n\n", "
",
 		0,
 	};
-	static cptr html_foot[] = {
+	static concptr html_foot[] = {
 		"
\n", "\n\n", 0, @@ -300,10 +347,7 @@ cptr make_screen_dump(void) use_graphics = FALSE; reset_visuals(); - /* Redraw everything */ p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_MAP | PR_EQUIPPY); - - /* Hack -- update */ handle_stuff(); } @@ -321,7 +365,7 @@ cptr make_screen_dump(void) for (x = 0; x < wid - 1; x++) { int rv, gv, bv; - cptr cc = NULL; + concptr cc = NULL; /* Get the attr/char */ (void)(Term_what(x, y, &a, &c)); @@ -330,6 +374,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; @@ -357,7 +403,7 @@ 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) { ret = NULL; } @@ -377,17 +423,17 @@ cptr make_screen_dump(void) 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 @@ -413,7 +459,7 @@ errr report_score(void) 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", FAKE_VER_MAJOR-10, FAKE_VER_MINOR, FAKE_VER_PATCH); @@ -485,34 +531,62 @@ errr report_score(void) sd = connect_server(HTTP_TIMEOUT, SCORE_SERVER, SCORE_PORT); - if (!(sd < 0)) break; + 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_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) + if (!get_check_strict("もう一度接続を試みますか? ", CHECK_NO_HISTORY)) #else - if (!get_check_strict("Try again? ", CHECK_NO_HISTORY)) + 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); + prt("スコア送信中...", 0, 0); #else - prt("Sending the score...", 0, 0); + prt("Sending the score...", 0, 0); #endif - Term_fresh(); - http_post(sd, SCORE_PATH, score); + Term_fresh(); + + if (!http_post(sd, SCORE_PATH, score)) { + disconnect_server(sd); +#ifdef JP + sprintf(buff, "スコア・サーバへの送信に失敗しました。"); +#else + sprintf(buff, "Failed to send to the score server."); +#endif + 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();