『スタパライフ』エージェント Ver1.10 download.h


   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:}