0:#define UNIT 1024
1:
2:// url: ダウンロードするモノ
3:// path: ローカルに保存するディレクトリ名
4:// return: 成功=1 失敗=0
5:
6:int download(char *url, char *path) {
7:
8: FILE *fp;
9:
10: INET *inet;
11: HTTP *http;
12: LOCATION loc;
13:
14: char *buffer,Stat[256];
15: int elen;
16: int rlen;
17:
18: int result;
19: int dlresult;
20: int dummy;
21:
22: string filename;
23: string fullpath;
24:
25: buffer = strrchr(url, '/');
26: if(buffer) {
27: filename = buffer + 1;
28: } else {
29: filename = url;
30: }
31:
32: if(!strlen(path)) {
33: fullpath = filename;
34: } else if(path[strlen(path)-1] == '\\') {
35: fullpath = path + filename;
36: } else {
37: fullpath = path + "\\" + filename;
38: }
39:
40: memset(&loc, 0, sizeof(LOCATION));
41: loc.size = sizeof(LOCATION);
42: decodeurl(&loc, url);
43:
44: result = 1;
45: inet = inet_open(NULL,loc.host,loc.port,INET_SERVICE_HTTP,NULL,NULL,0);
46: if(inet) {
47: http = http_open(inet, "GET", loc.path, NULL, 0);
48: if(http) {
49: buffer = malloc(UNIT + 1);
50: elen = 0;
51: rlen = http_request(http, NULL, 0, buffer, UNIT + 1);
52: dummy = sizeof(dlresult);
53: http_stat(http, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, (void*)&dlresult, &dummy, NULL);
54: if(dlresult == 200) {
55: fp = fopen(fullpath, "w");
56: if(fp) {
57: elen = rlen;
58: sprintf(Stat, "%s ダウンロード開始", filename, elen);
59: setstatustext(Stat);
60: while(rlen == UNIT) {
61: if(rlen != fwrite(buffer, 1, rlen, fp)) {
62: sprintf(Stat, "%s ダウンロード失敗 (file write failed)", filename);
63: debug(Stat);
64: seterrortext(1, Stat);
65: setstatustext(Stat);
66: result = 0;
67: break;
68: }
69: rlen = http_read(http, buffer, UNIT + 1);
70: elen += rlen;
71: sprintf(Stat, "%s ダウンロード中... (%d bytes)", filename, elen);
72: setstatustext(Stat);
73: }
74: sprintf(Stat, "%s ダウンロード中... (%d bytes)", filename, elen);
75: setstatustext(Stat);
76: if(rlen && rlen != fwrite(buffer, 1, rlen, fp)) {
77: sprintf(Stat, "%s ダウンロード失敗 (file write failed)", filename);
78: debug(Stat);
79: seterrortext(1, Stat);
80: setstatustext(Stat);
81: result = 0;
82: }
83: fclose(fp);
84: } else {
85: sprintf(Stat, "%s ダウンロード失敗 ([%s]file open failed)", filename,fullpath);
86: debug(Stat);
87: seterrortext(1, Stat);
88: setstatustext(Stat);
89: result = 0;
90: }
91: } else {
92: sprintf(Stat, "%s ダウンロード失敗 (CODE = %d)", filename, dlresult);
93: debug(Stat);
94: seterrortext(1, Stat);
95: setstatustext(Stat);
96: result = 0;
97: }
98: free(buffer);
99: http_close(http);
100: } else {
101: sprintf(Stat, "%s ダウンロード失敗 (HTTP connection failed)", filename);
102: debug(Stat);
103: seterrortext(1, Stat);
104: setstatustext(Stat);
105: result = 0;
106: }
107: inet_close(inet);
108: } else {
109: sprintf(Stat, "%s ダウンロード失敗 (connection failed)", filename);
110: debug(Stat);
111: seterrortext(1, Stat);
112: setstatustext(Stat);
113: result = 0;
114: }
115: if(result) debug(filename);
116: return result;
117:}
|