arc/src/observer.c

156 lines
3.4 KiB
C

/******************************************************************************
*
* Copyright (c) 2017-2019 by Löwenware Ltd
* Please, refer LICENSE file for legal information
*
******************************************************************************/
/**
* @file observer.c
* @author Ilja Kartašov <ik@lowenware.com>
* @brief AISL event observer source code file
*
* @see https://lowenware.com/
*/
#include <string.h>
/* modules */
#include <mods/module.h>
/* commons */
#include "config.h"
#include "end-points.h"
#include "log.h"
#include "observer.h"
/* static struct ax_feedback m_feedback = {0}; */
AislStatus
observer_init(void)
{
AislStatus result = AISL_SUCCESS;
/* struct ax_feedback_cfg feedback_cfg; */
/*
memset(&feedback_cfg, 0, sizeof(struct ax_feedback_cfg));
feedback_cfg.end_point = FEEDBACK_END_POINT;
feedback_cfg.smtp.host = CONFIG_SMTP_SERVER;
feedback_cfg.smtp.user = CONFIG_SMTP_USER;
feedback_cfg.smtp.pass = CONFIG_SMTP_PASS;
feedback_cfg.smtp.port = CONFIG_SMTP_PORT;
feedback_cfg.mail_from = CONFIG_MAIL_FROM;
feedback_cfg.mail_to = CONFIG_MAIL_TO;
feedback_cfg.mail_subject = CONFIG_MAIL_SUBJECT;
feedback_cfg.name_email = "email";
feedback_cfg.name_msg = "msg";
if ((result = ax_feedback_init(&m_feedback, &feedback_cfg)) != 0)
return result;
*/
return result;
}
void
observer_release(void)
{
/* ax_feedback_release(&m_feedback); */
}
static void
observer_on_stream_event(const struct aisl_evt *evt)
{
AxModule mods[] = { /* AX_MODULE(&m_feedback) */ NULL };
int i, c = sizeof (mods) / sizeof (mods[0]);
for (i = 0; i < c; i++) {
/* TODO: remove !!!! */
if (!mods[i])
continue;
AislStatus status = ax_module_on_event(mods[i], evt);
switch(status) {
case AISL_IDLE:
continue;
case AISL_SUCCESS:
return;
default:
LOG_ALERT("Module error: %s", aisl_status_to_string(status));
return;
}
}
}
static void
observer_on_server_event(const struct aisl_evt *evt)
{
struct sockaddr_in srv_addr;
AislServer srv = (AislServer) evt->source;
AislStatus status = evt->status;
aisl_server_get_address(srv, &srv_addr);
LOG_STATE("HTTP%s server %s:%d: %s", (aisl_server_get_ssl(srv) ? "s" : ""),
inet_ntoa(srv_addr.sin_addr), ntohs(srv_addr.sin_port),
(status ? aisl_status_to_string(status) : "ready"));
}
static void
observer_on_client_event(const struct aisl_evt *evt, const char *msg)
{
struct sockaddr_in cli_addr;
AislClient cli = (AislClient) evt->source;
aisl_client_get_address(cli, &cli_addr);
if (evt->status == AISL_IDLE)
msg = "timeout";
LOG_STATE( "HTTP%s client %s:%d: %s",
(aisl_client_is_secure(cli) ? "s" : ""),
inet_ntoa(cli_addr.sin_addr),
ntohs(cli_addr.sin_port),
msg
);
}
void
observer_on_aisl_event(const struct aisl_evt *evt, void *p_ctx)
{
switch(evt->code) {
case AISL_EVENT_SERVER_READY:
case AISL_EVENT_SERVER_ERROR:
observer_on_server_event(evt);
break;
case AISL_EVENT_CLIENT_CONNECT:
observer_on_client_event(evt, "connected");
break;
case AISL_EVENT_CLIENT_DISCONNECT:
observer_on_client_event(evt, "disconnected");
break;
case AISL_EVENT_STREAM_OPEN:
case AISL_EVENT_STREAM_HEADER:
case AISL_EVENT_STREAM_INPUT:
case AISL_EVENT_STREAM_REQUEST:
case AISL_EVENT_STREAM_OUTPUT:
case AISL_EVENT_STREAM_CLOSE:
case AISL_EVENT_STREAM_ERROR:
observer_on_stream_event(evt);
break;
}
}