| 872 | */ |
| 873 | |
| 874 | ipp_attribute_t * /* O - New attribute */ |
| 875 | ippAddString(ipp_t *ipp, /* I - IPP message */ |
| 876 | ipp_tag_t group, /* I - IPP group */ |
| 877 | ipp_tag_t value_tag, /* I - Type of attribute */ |
| 878 | const char *name, /* I - Name of attribute */ |
| 879 | const char *language, /* I - Language code */ |
| 880 | const char *value) /* I - Value */ |
| 881 | { |
| 882 | ipp_tag_t temp_tag; /* Temporary value tag (masked) */ |
| 883 | ipp_attribute_t *attr; /* New attribute */ |
| 884 | char code[IPP_MAX_LANGUAGE]; |
| 885 | /* Charset/language code buffer */ |
| 886 | |
| 887 | |
| 888 | DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", language=\"%s\", value=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, language, value)); |
| 889 | |
| 890 | /* |
| 891 | * Range check input... |
| 892 | */ |
| 893 | |
| 894 | temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK); |
| 895 | |
| 896 | #if 0 |
| 897 | if (!ipp || !name || group < IPP_TAG_ZERO || |
| 898 | group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || |
| 899 | (temp_tag < IPP_TAG_TEXT && temp_tag != IPP_TAG_TEXTLANG && |
| 900 | temp_tag != IPP_TAG_NAMELANG) || temp_tag > IPP_TAG_MIMETYPE) |
| 901 | return (NULL); |
| 902 | |
| 903 | if ((temp_tag == IPP_TAG_TEXTLANG || temp_tag == IPP_TAG_NAMELANG) |
| 904 | != (language != NULL)) |
| 905 | return (NULL); |
| 906 | #else |
| 907 | if (!ipp || !name || group < IPP_TAG_ZERO || |
| 908 | group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) |
| 909 | return (NULL); |
| 910 | #endif /* 0 */ |
| 911 | |
| 912 | /* |
| 913 | * See if we need to map charset, language, or locale values... |
| 914 | */ |
| 915 | |
| 916 | if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && |
| 917 | strcmp(language, ipp_lang_code(language, code, sizeof(code)))) |
| 918 | value_tag = temp_tag; /* Don't do a fast copy */ |
| 919 | else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST) && |
| 920 | strcmp(value, ipp_get_code(value, code, sizeof(code)))) |
| 921 | value_tag = temp_tag; /* Don't do a fast copy */ |
| 922 | else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST) && |
| 923 | strcmp(value, ipp_lang_code(value, code, sizeof(code)))) |
| 924 | value_tag = temp_tag; /* Don't do a fast copy */ |
| 925 | |
| 926 | /* |
| 927 | * Create the attribute... |
| 928 | */ |
| 929 | |
| 930 | if ((attr = ipp_add_attr(ipp, name, group, value_tag, 1)) == NULL) |
| 931 | return (NULL); |