#
#  W A R N I N G
#  -------------
#
# This file is not part of the Qt API.  It exists purely as an
# implementation detail.  It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#

load(moc)
qtPrepareTool(QMAKE_QDBUSXML2CPP, qdbusxml2cpp)

defineReplace(qdbusOutputBasename) {
    return($$lower($$section($$list($$basename(1)),.,-2,-2)))
}

dbus_TYPE = $$upper($$dbus_type)

groups =
for(entry, DBUS_$${dbus_TYPE}S) {

    files = $$eval($${entry}.files)
    isEmpty(files) {
        files = $$entry
        group = dbus_$${dbus_type}
    } else {
        group = $${entry}_dbus_$${dbus_type}
    }
    groups *= $$group

    input_list = $$upper($$group)_LIST
    for(subent, $$list($$unique(files))) {

        !contains(subent, .*\\w\\.xml$) {
            warning("Invalid D-BUS $${dbus_type}: '$$subent', please use 'com.mydomain.myinterface.xml' instead.")
            next()
        }

        $$input_list += $$subent
    }
}

for(group, groups) {
    GROUP = $$upper($$group)
    input_list = $${GROUP}_LIST

    # qmake does not keep empty elements in lists, so we reverse-engineer the short name
    grp = $$replace(group, _?dbus_$${dbus_type}\$, )
    isEmpty(grp) {
        hdr_flags = $$eval(QDBUSXML2CPP_$${dbus_TYPE}_HEADER_FLAGS)
        src_flags = $$eval(QDBUSXML2CPP_$${dbus_TYPE}_SOURCE_FLAGS)
    } else {
        hdr_flags = $$eval($${grp}.header_flags)
        src_flags = $$eval($${grp}.source_flags)
    }

    $${group}_header.commands = $$QMAKE_QDBUSXML2CPP $$hdr_flags $$qdbusxml2cpp_option ${QMAKE_FILE_OUT}: ${QMAKE_FILE_IN}
    $${group}_header.depends += $$QMAKE_QDBUSXML2CPP_EXE
    $${group}_header.output = ${QMAKE_FUNC_FILE_IN_qdbusOutputBasename}_$${dbus_type}.h
    $${group}_header.name = DBUSXML2CPP $${dbus_TYPE} HEADER ${QMAKE_FILE_IN}
    $${group}_header.variable_out = $${GROUP}_HEADERS
    $${group}_header.input = $$input_list

    $${group}_source.commands = $$QMAKE_QDBUSXML2CPP -i ${QMAKE_FILE_OUT_BASE}.h $$src_flags $$qdbusxml2cpp_option :${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
    $${group}_source.depends += $$QMAKE_QDBUSXML2CPP_EXE
    $${group}_source.output = ${QMAKE_FUNC_FILE_IN_qdbusOutputBasename}_$${dbus_type}.cpp
    $${group}_source.name = DBUSXML2CPP $${dbus_TYPE} SOURCE ${QMAKE_FILE_IN}
    $${group}_source.variable_out = SOURCES
    $${group}_source.input = $$input_list
    $${group}_source.depends += $$eval($${group}_header.output)   # this actually belongs to the object file

    $${group}_moc.commands = $$moc_header.commands
    $${group}_moc.depends += $$QMAKE_MOC_EXE
    $${group}_moc.output = $$moc_header.output
    $${group}_moc.input = $${GROUP}_HEADERS
    $${group}_moc.variable_out = GENERATED_SOURCES
    $${group}_moc.name = $${GROUP}_$$moc_header.name

    QMAKE_EXTRA_COMPILERS += $${group}_header $${group}_source $${group}_moc
}
