Ignore:
Timestamp:
01/11/11 03:32:37 (10 years ago)
Author:
Admin
Message:

WebIf: Add support to serve images as files. They are accessible via for example "/image?i=ICSTA"

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/oscam-http-helpers.c

    r4398 r4402  
    369369#endif
    370370
    371 int webif_write(char *buf, FILE* f) {
     371int webif_write_raw(char *buf, FILE* f, int len) {
    372372#ifdef WITH_SSL
    373373    if (cfg->http_use_ssl) {
    374         return SSL_write((SSL*)f, buf, strlen(buf));
     374        return SSL_write((SSL*)f, buf, len);
    375375    } else
    376376#endif
    377         return fwrite(buf, 1, strlen(buf), f);
     377        return fwrite(buf, 1, len, f);
     378}
     379
     380int webif_write(char *buf, FILE* f) {
     381    return webif_write_raw(buf, f, strlen(buf));
    378382}
    379383
     
    410414        pos += sprintf(pos, "Expires: Sat, 26 Jul 1997 05:00:00 GMT\r\n");
    411415    } else {
    412         pos += sprintf(pos, "Cache-Control: public, max-age=7200");
     416        pos += sprintf(pos, "Cache-Control: public, max-age=7200\r\n");
    413417    }
    414418    pos += sprintf(pos, "Last-Modified: %s\r\n", timebuf);
     
    560564    return tpl_addTmp(vars, result);
    561565}
     566
     567int b64decode(unsigned char *result){
     568    char inalphabet[256], decoder[256];
     569    unsigned char alphabet[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
     570    int i, len = strlen((char *)result), j = 0, bits = 0, char_count = 0;
     571   
     572    for (i = sizeof(alphabet) - 1; i >= 0; --i) {
     573        inalphabet[alphabet[i]] = 1;
     574        decoder[alphabet[i]] = i;
     575    }
     576    for(i = 0; i < len; ++i){
     577        if (result[i] == '=') break;
     578        if (!inalphabet[result[i]]) continue;
     579        bits += decoder[result[i]];
     580        ++char_count;
     581        if (char_count == 4) {
     582            result[j++] = bits >> 16;
     583            result[j++] = (bits >> 8) & 0xff;
     584            result[j++] = bits & 0xff;
     585            bits = 0;
     586            char_count = 0;
     587        } else {
     588            bits <<= 6;
     589        }
     590    }
     591    if (i == len) {
     592        if (char_count) {
     593            result[j] = '\0';
     594            return 0;
     595        }
     596    } else {
     597        switch (char_count) {
     598            case 1:
     599                result[j] = '\0';
     600                return 0;
     601            case 2:
     602                result[j++] = bits >> 10;
     603                result[j] = '\0';
     604                break;
     605            case 3:
     606                result[j++] = bits >> 16;
     607                result[j++] = (bits >> 8) & 0xff;
     608                result[j] = '\0';
     609            break;
     610        }
     611    }
     612    return j;
     613}
    562614#endif
Note: See TracChangeset for help on using the changeset viewer.