#!/usr/bin/env python

import samba_utils

def generate_winexesvc_c_from_exe(t):
    src = t.inputs[0].bldpath(t.env)
    tgt = t.outputs[0].bldpath(t.env)
    fn = t.env.SAMBA_GENERATOR_VARS['WINEXE_FN']
    src_blob = samba_utils.load_file(src)

    def c_array(src):
        N = 0
        result = ''
        while src:
            l = src[:8]
            src = src[8:]
            h = ' '.join(["0x%02X," % ord(x) for x in l])
            result += "\t\t%s\n" % (h)
        return result

    src_array = c_array(src_blob)

    contents = '''
#include "replace.h"
#include "lib/util/data_blob.h"

const DATA_BLOB *%s(void);
const DATA_BLOB *%s(void)
{
\tstatic const uint8_t array[] = {
%s
\t};
\tstatic const DATA_BLOB blob = {
\t\t.data = discard_const_p(uint8_t, array),
\t\t.length = ARRAY_SIZE(array),
\t};
\treturn &blob;
}
''' % (fn, fn, src_array)

    ret = samba_utils.save_file(tgt, contents)
    assert(ret == True)

winexesvc_binaries = ''

if bld.env.WINEXE_CC_WIN32:
    bld.SAMBA_GENERATOR(
        'winexesvc32_exe',
        source='winexesvc.c',
        target='winexesvc32.exe',
        rule='${WINEXE_CC_WIN32} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}')
    vars = {"WINEXE_FN": "winexesvc32_exe_binary"}
    bld.SAMBA_GENERATOR(
        'winexesvc32_exe_binary',
        source='winexesvc32.exe',
        target='winexesvc32_exe_binary.c',
        group='build_source',
        vars=vars,
        rule=generate_winexesvc_c_from_exe)
    winexesvc_binaries += ' winexesvc32_exe_binary.c'

if bld.env.WINEXE_CC_WIN64:
    bld.SAMBA_GENERATOR(
        'winexesvc64_exe',
        source='winexesvc.c',
        target='winexesvc64.exe',
        rule='${WINEXE_CC_WIN64} ${SRC} -o ${TGT} ${WINEXE_LDFLAGS}')
    vars = {"WINEXE_FN": "winexesvc64_exe_binary"}
    bld.SAMBA_GENERATOR(
        'winexesvc64_exe_binary',
        source='winexesvc64.exe',
        target='winexesvc64_exe_binary.c',
        group='build_source',
        vars=vars,
        rule=generate_winexesvc_c_from_exe)
    winexesvc_binaries += ' winexesvc64_exe_binary.c'

if winexesvc_binaries != '':
    bld.SAMBA3_BINARY('winexe',
                      source='winexe.c ' + winexesvc_binaries,
                      deps='''
                          popt
                          samba-credentials
                          LOADPARM_CTX
                          libsmb
                          msrpc3
                      ''')
