Ignore:
Timestamp:
Apr 1, 2009 3:54:46 PM (15 years ago)
Author:
gah
Message:

Fix encoding::decode to obey flags

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/RpEncode.cc

    r1367 r1371  
    3131        return 0;
    3232    }
    33 
    3433    if (size < 0) {
    3534        size = strlen(buf);
    3635    }
    37 
    38     for (int index = 0; index < size; index++) {
    39         int c = *buf++;
    40         // FIXME: use ctype's isascii and isprint
    41         //        TAB (011), LF(012), CR(015) is ascii.
    42         //        what about BS(010), VT(013), FF(014)?
    43         if (((c >= '\000') && (c <= '\010')) ||
    44             ((c >= '\013') && (c <= '\014')) ||
    45             ((c >= '\016') && (c <= '\037')) ||
    46             ((c >= '\177') && (c <= '\377')) ) {
    47             // data is binary
    48             return index+1;
    49         }
     36    const char *cp, *endPtr;
     37    for (cp = buf, endPtr = buf + size; cp < endPtr; cp++) {
     38        if ((!isascii(*cp)) || (!isprint(*cp))) {
     39            return (cp - buf) + 1;
     40        }
    5041    }
    5142    return 0;
     
    138129    addHeader = (flags & RPENC_HDR);
    139130
     131    if ((!compress) && (!base64)) {
     132        return true;            // Nothing to do.
     133    }
    140134    if (outData.append(buf.bytes(), buf.size()) != (int)buf.size()) {
    141135        err.addError("can't append %d bytes", buf.size());
     
    143137    }
    144138    if (outData.encode(err, compress, base64)) {
    145         buf.clear();
    146         if (addHeader) {
    147             if ((compress) && (!base64)) {
    148                 buf.append("@@RP-ENC:z\n", 11);
    149             } else if ((!compress) && (base64)) {
    150                 buf.append("@@RP-ENC:b64\n", 13);
    151             } else if ((compress) && (base64)) {
    152                 buf.append("@@RP-ENC:zb64\n", 14);
    153             } else {
    154                 // do nothing
    155             }
    156         } else {
    157             // do nothing
    158         }
    159         if (buf.append(outData.bytes(),outData.size()) != (int)outData.size()) {
    160             err.addError("can't append %d bytes", outData.size());
    161             return false;
     139        buf.clear();
     140        if (addHeader) {
     141            if ((compress) && (!base64)) {
     142                buf.append("@@RP-ENC:z\n", 11);
     143            } else if ((!compress) && (base64)) {
     144                buf.append("@@RP-ENC:b64\n", 13);
     145            } else if ((compress) && (base64)) {
     146                buf.append("@@RP-ENC:zb64\n", 14);
     147            } else {
     148                // do nothing
     149            }
     150        } else {
     151            // do nothing
    162152        }
     153    }
     154    if (buf.append(outData.bytes(),outData.size()) != (int)outData.size()) {
     155        err.addError("can't append %d bytes", outData.size());
     156        return false;
    163157    }
    164158    return true;
     
    183177    Rappture::Buffer outData;
    184178
    185     bool decompress, base64, checkHDR;
    186     decompress = (flags & RPENC_Z);
    187     base64     = (flags & RPENC_B64);
    188     checkHDR  = (flags & RPENC_HDR);
     179    bool decompress, base64, checkHeader;
     180    decompress  = (flags & RPENC_Z);
     181    base64      = (flags & RPENC_B64);
     182    checkHeader = (flags & RPENC_HDR);
    189183
    190184    off_t offset;
    191     if ((buf.size() > 11) && (strncmp(buf.bytes(),"@@RP-ENC:z\n", 11) == 0)) {
    192         offset = 11;
    193         if ((checkHDR) || ((!decompress) && (!base64))) {
     185    const char *bytes;
     186    int size;
     187
     188    size = buf.size();
     189    bytes = buf.bytes();
     190    if (strncmp(bytes, "@@RP-ENC:z\n", 11) == 0) {
     191        bytes += 11;
     192        size -= 11;
     193        if ((checkHeader) || ((!decompress) && (!base64))) {
    194194            decompress = true;
    195             base64 = false;
    196         }
    197     } else if ((buf.size() > 13) &&
    198                (strncmp(buf.bytes(),"@@RP-ENC:b64\n",13) == 0)) {
    199         offset = 13;
    200         if ((checkHDR) || ((!decompress) && (!base64) )) {
     195            base64     = false;
     196        }
     197    } else if (strncmp(bytes, "@@RP-ENC:b64\n",13) == 0) {
     198        bytes += 13;
     199        size -= 13;
     200        if ((checkHeader) || ((!decompress) && (!base64) )) {
    201201            decompress = false;
    202             base64 = true;
    203         }
    204     } else if ((buf.size() > 14) &&
    205                (strncmp(buf.bytes(), "@@RP-ENC:zb64\n",14) == 0)) {
    206         offset = 14;
    207         if ((checkHDR) || ((!decompress) && (!base64))) {
     202            base64     = true;
     203        }
     204    } else if (strncmp(bytes, "@@RP-ENC:zb64\n",14) == 0) {
     205        bytes += 14;
     206        size -= 14;
     207        if ((checkHeader) || ((!decompress) && (!base64))) {
    208208            decompress = true;
    209             base64 = true;
     209            base64     = true;
    210210        }
    211211    } else {
    212212        offset = 0;
    213213    }
    214     int nBytes = buf.size() - offset;
    215     if (outData.append(buf.bytes() + offset, nBytes) != nBytes) {
    216         err.addError("can't append %d bytes to buffer", nBytes);
     214    if (outData.append(bytes, size) != size) {
     215        err.addError("can't append %d bytes to buffer", size);
    217216        return false;
    218217    }
    219     if (!outData.decode(err, decompress, base64)) {
    220         return false;
     218    if ((decompress) || (base64)) {
     219        if (!outData.decode(err, decompress, base64)) {
     220            return false;
     221        }
    221222    }
    222223    buf.move(outData);
Note: See TracChangeset for help on using the changeset viewer.