| 3183 | */ |
| 3184 | |
| 3185 | int /* O - 1 on success, 0 on failure */ |
| 3186 | ippSetOctetString( |
| 3187 | ipp_t *ipp, /* I - IPP message */ |
| 3188 | ipp_attribute_t **attr, /* IO - IPP attribute */ |
| 3189 | int element, /* I - Value number (0-based) */ |
| 3190 | const void *data, /* I - Pointer to octetString data */ |
| 3191 | int datalen) /* I - Length of octetString data */ |
| 3192 | { |
| 3193 | _ipp_value_t *value; /* Current value */ |
| 3194 | |
| 3195 | |
| 3196 | /* |
| 3197 | * Range check input... |
| 3198 | */ |
| 3199 | |
| 3200 | if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_STRING && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || datalen < 0 || datalen > IPP_MAX_LENGTH) |
| 3201 | return (0); |
| 3202 | |
| 3203 | /* |
| 3204 | * Set the value and return... |
| 3205 | */ |
| 3206 | |
| 3207 | if ((value = ipp_set_value(ipp, attr, element)) != NULL) |
| 3208 | { |
| 3209 | if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST) |
| 3210 | { |
| 3211 | /* |
| 3212 | * Just copy the pointer... |
| 3213 | */ |
| 3214 | |
| 3215 | value->unknown.data = (void *)data; |
| 3216 | value->unknown.length = datalen; |
| 3217 | } |
| 3218 | else |
| 3219 | { |
| 3220 | /* |
| 3221 | * Copy the data... |
| 3222 | */ |
| 3223 | |
| 3224 | (*attr)->value_tag = IPP_TAG_STRING; |
| 3225 | |
| 3226 | if (value->unknown.data) |
| 3227 | { |
| 3228 | /* |
| 3229 | * Free previous data... |
| 3230 | */ |
| 3231 | |
| 3232 | free(value->unknown.data); |
| 3233 | |
| 3234 | value->unknown.data = NULL; |
| 3235 | value->unknown.length = 0; |
| 3236 | } |
| 3237 | |
| 3238 | if (datalen > 0) |
| 3239 | { |
| 3240 | void *temp; /* Temporary data pointer */ |
| 3241 | |
| 3242 | if ((temp = malloc((size_t)datalen)) != NULL) |
no test coverage detected