/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include <guacamole/client.h>
#include <winpr/wlog.h>
#include <winpr/wtypes.h>

#include <stddef.h>

/**
 * The guac_client that should be used within this process for FreeRDP log
 * messages. As all Guacamole connections are isolated at the process level,
 * this will only ever be set to the guac_client of the current process'
 * connection.
 */
static guac_client* current_client = NULL;

/**
 * Logs the text data within the given message to the logging facilities of the
 * guac_client currently stored under current_client (the guac_client of the
 * current process).
 *
 * @param message
 *     The message to log.
 *
 * @return
 *     TRUE if the message was successfully logged, FALSE otherwise.
 */
static BOOL guac_rdp_wlog_text_message(const wLogMessage* message) {

    /* Fail if log not yet redirected */
    if (current_client == NULL)
        return FALSE;

    /* Log all received messages at the debug level */
    guac_client_log(current_client, GUAC_LOG_DEBUG, "%s", message->TextString);
    return TRUE;

}

void guac_rdp_redirect_wlog(guac_client* client) {

    wLogCallbacks callbacks = {
        .message = guac_rdp_wlog_text_message
    };

    current_client = client;

    /* Reconfigure root logger to use callback appender */
    wLog* root = WLog_GetRoot();
    WLog_SetLogAppenderType(root, WLOG_APPENDER_CALLBACK);

    /* Set appender callbacks to our own */
    wLogAppender* appender = WLog_GetLogAppender(root);
    WLog_ConfigureAppender(appender, "callbacks", &callbacks);

}