Exemplo n.º 1
0
/*
 * Format a value according to the xml setting.
 * Returns an allocated buffer that must be freed by the caller.
 */
GString *
format_value (XmlSettings *xml, guint value)
{
    GString        *buf = g_string_sized_new(1);
    EffectValues   *values = NULL;
    ValueType       vtype;
    gchar          *suffix = "";
    gdouble         step = 1.0;
    gint            offset = 0;
    gboolean        decimal = FALSE;

    values = xml->values;
    vtype = values->type;
    while ((vtype & VALUE_TYPE_EXTRA) && value_is_extra(values, value)) {
        values = values->extra;
        vtype = values->type;
    }
    vtype &= ~VALUE_TYPE_EXTRA;

    if (vtype & VALUE_TYPE_OFFSET) {
        offset = values->offset;
        vtype &= ~VALUE_TYPE_OFFSET;
    }

    if (vtype & VALUE_TYPE_STEP) {
        step = values->step;
        vtype &= ~VALUE_TYPE_STEP;
    }

    if (vtype & VALUE_TYPE_SUFFIX) {
        suffix = values->suffix;
        vtype &= ~VALUE_TYPE_SUFFIX;
    }

    if (vtype & VALUE_TYPE_DECIMAL) {
        decimal = TRUE;
        vtype &= ~VALUE_TYPE_DECIMAL;
    }

    switch (vtype) {
    case VALUE_TYPE_LABEL:
    {
        char *textp = map_xml_value(xml, values, value);
        if (!textp) {
            g_warning("%s: Unable to map %s value %d for id %d position %d",
                      __FUNCTION__, xml->label, value, xml->id, xml->position);
            textp = "";
        }
        g_string_printf(buf, "%s", textp);
        break;
    }
    case VALUE_TYPE_PLAIN:
    {
        if (decimal) {
            double dvalue = ((gint)value + offset) * step;
                g_string_printf(buf, "%0.2f%s", dvalue, suffix);
        } else {
            gint ivalue = ((gint)value + offset) * step;
            g_string_printf(buf, "%d%s", ivalue, suffix);
        }
        break;
    }
    case VALUE_TYPE_NONE:
        g_string_printf(buf, "%s", "");
        break;

    case VALUE_TYPE_POSID:
        g_string_printf(buf, "%d", value);
        break;

    default:
        g_warning("Unhandled value type %d", vtype);
        break;
    }

    return buf;
}
Exemplo n.º 2
0
void
write_preset_to_xml(Preset *preset, gchar *filename)
{
    int rc;
    xmlTextWriterPtr writer;
    GList *iter_params = preset->params;
    guint last_id = 0;
    guint last_position = 0;

    printf("Creating a new xml doc\n");
    /* Create a new XmlWriter for uri, with no compression. */
    writer = xmlNewTextWriterFilename(filename, 0);
    if (writer == NULL) {
        printf("testXmlwriterFilename: Error creating the xml writer\n");
        return;
    }

    /* 
     * Start the document with the xml default for the version,
     * encoding and the default for the standalone declaration.
     */
    rc = xmlTextWriterStartDocument(writer, NULL, GDIGI_ENCODING, NULL);
    if (rc < 0) {
        printf
            ("testXmlwriterFilename: Error at xmlTextWriterStartDocument\n");
        return;
    }

    rc = xmlTextWriterSetIndent(writer, 1);
    rc = xmlTextWriterSetIndentString(writer, BAD_CAST "  ");
    /* Write the tag identifying type of prefix, schema version and ns. */
    rc = xmlTextWriterStartElement(writer, BAD_CAST get_preset_filename(product_id));

    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "SchemaVersion",
                                     BAD_CAST "1.2");

   
    rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "xmlns",
                                     BAD_CAST "http://www.digitech.com/xml/preset");

    /* Write the Name tag. */
    rc = xmlTextWriterWriteElement(writer, BAD_CAST "Name", BAD_CAST preset->name);

    rc = xmlTextWriterStartElement(writer, BAD_CAST "Params");

    while (iter_params) {
        XmlSettings *xml;
        SettingParam *param = (SettingParam *) iter_params->data;
 
        if (param->id == last_id && param->position == last_position) {
            g_warning("Skipping duplicate parameter id %d position %d",
                       last_id, last_position);
            iter_params  = iter_params->next;
            continue;
        }

        rc = xmlTextWriterStartElement(writer, BAD_CAST "Param");

        rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ID",
                                             "%d", param->id);
        rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Position",
                                             "%d", param->position);
        rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Value",
                                             "%d", param->value);

        last_id = param->id;
        last_position = param->position;
        xml  = get_xml_settings(param->id, param->position);
        if (!xml) {
            printf("Failed to get xml settings for id %d position %d\n",
                    param->id, param->position);
        } else {
            ValueType type;
            gchar *suffix = "";
            gdouble step = 1.0;
            gint offset = 0;
            gboolean        decimal = FALSE;
            EffectValues *values = NULL;

            rc = xmlTextWriterWriteElement(writer, BAD_CAST "Name",
                                                   BAD_CAST xml->label);
            values = xml->values;
            type = values->type;
            while ((type & VALUE_TYPE_EXTRA) && value_is_extra(values, param->value)) {
                values = values->extra;
                type = values->type;
            }
            type &= ~VALUE_TYPE_EXTRA;

            if (type & VALUE_TYPE_OFFSET) {
                offset = values->offset;
                type &= ~VALUE_TYPE_OFFSET;
            }

            if (type & VALUE_TYPE_STEP) {
                step = values->step;
                type &= ~VALUE_TYPE_STEP;
            }

            if (type & VALUE_TYPE_SUFFIX) {
                suffix = values->suffix;
                type &= ~VALUE_TYPE_SUFFIX;
            }

            if (type & VALUE_TYPE_DECIMAL) {
                decimal = TRUE;
                type &= ~VALUE_TYPE_DECIMAL;
            }

            switch (type) {
            case VALUE_TYPE_LABEL:
            {
                char *textp = map_xml_value(xml, param->value);
                if (!textp) {
                    g_warning("Unable to map %s value %d for id %d position %d",
                              xml->label, param->value, param->id,
                              param->position);
                    textp = "";
                }
                rc = xmlTextWriterWriteElement(writer, BAD_CAST "Text",
                                                       BAD_CAST textp);
                break;
            }

            case VALUE_TYPE_PLAIN:
            {
                if (decimal) {
                    double value = (param->value + offset) * step;
                    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Text",
                            "%0.2f%s", value, suffix);
                } else {    
                    gint value = (param->value + offset) * step;
                    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "Text",
                            "%d%s", value, suffix);
                }
                break;

            }
            case VALUE_TYPE_NONE:
                rc = xmlTextWriterStartElement(writer, BAD_CAST "Text");
                rc = xmlTextWriterEndElement(writer);
                break;

            default:
                g_warning("Unhandled value type %d", type);
                break;
            }
        }
        
        rc = xmlTextWriterEndElement(writer);

        iter_params  = iter_params->next;
    }

    rc = xmlTextWriterEndDocument(writer);
    if (rc < 0) {
        printf("testXmlwriterFilename: Error at xmlTextWriterEndDocument\n");
        return;
    }

    xmlFreeTextWriter(writer);
}