/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed 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 <stdlib.h>

#define LOG_TAG "SupplicantEventFactory"
#include <cutils/log.h>

#include "SupplicantEvent.h"
#include "SupplicantEventFactory.h"
#include "SupplicantAssociatingEvent.h"
#include "SupplicantAssociatedEvent.h"
#include "SupplicantConnectedEvent.h"
#include "SupplicantStateChangeEvent.h"
#include "SupplicantScanResultsEvent.h"
#include "SupplicantConnectionTimeoutEvent.h"
#include "SupplicantDisconnectedEvent.h"
#if 0
#include "SupplicantTerminatingEvent.h"
#include "SupplicantPasswordChangedEvent.h"
#include "SupplicantEapNotificationEvent.h"
#include "SupplicantEapStartedEvent.h"
#include "SupplicantEapMethodEvent.h"
#include "SupplicantEapSuccessEvent.h"
#include "SupplicantEapFailureEvent.h"
#include "SupplicantLinkSpeedEvent.h"
#include "SupplicantDriverStateEvent.h"
#endif

#include "libwpa_client/wpa_ctrl.h"

SupplicantEventFactory::SupplicantEventFactory() {
}

SupplicantEvent *SupplicantEventFactory::createEvent(char *event, size_t len) {
    int level = 0;

    if (event[0] == '<') {
        char *match = strchr(event, '>');
        if (match) {
            char tmp[16];

            strncpy(tmp, &event[1], (match - event));
            level = atoi(tmp);
            event += (match - event) + 1;
        } else
            ALOGW("Unclosed level brace in event");
    } else
        ALOGW("No level specified in event");

    /*
     * <N>CTRL-EVENT-XXX
     *    ^
     *    +---- event
     */

    if (!strncmp(event, "Authentication with ", 20)) {
        if (!strcmp(event + strlen(event) - strlen(" timed out."),
                    " timed out.")) {
            return new SupplicantConnectionTimeoutEvent(level,
                                                        event + 20,
                                                        len);
        } else
            return NULL;
        
    } else if (!strncmp(event, "Associated with ", 16))
        return new SupplicantAssociatedEvent(level, event + 16, len);
    else if (!strncmp(event, "Trying to associate with ", 25))
        return new SupplicantAssociatingEvent(level, event + 25, len);
    else if (!strncmp(event, WPA_EVENT_CONNECTED, strlen(WPA_EVENT_CONNECTED))) {
        return new SupplicantConnectedEvent(level,
                                            event + strlen(WPA_EVENT_CONNECTED),
                                            len);
    } else if (!strncmp(event, WPA_EVENT_SCAN_RESULTS, strlen(WPA_EVENT_SCAN_RESULTS))) {
        return new SupplicantScanResultsEvent(level,
                                              event + strlen(WPA_EVENT_SCAN_RESULTS),
                                              len);
    } else if (!strncmp(event, WPA_EVENT_STATE_CHANGE, strlen(WPA_EVENT_STATE_CHANGE))) {
        return new SupplicantStateChangeEvent(level,
                                              event + strlen(WPA_EVENT_STATE_CHANGE),
                                              len);
    }
    else if (!strncmp(event, WPA_EVENT_DISCONNECTED, strlen(WPA_EVENT_DISCONNECTED)))
        return new SupplicantDisconnectedEvent(level, event, len);
#if 0
    else if (!strncmp(event, WPA_EVENT_TERMINATING, strlen(WPA_EVENT_TERMINATING)))
        return new SupplicantTerminatingEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_PASSWORD_CHANGED, strlen(WPA_EVENT_PASSWORD_CHANGED)))
        return new SupplicantPasswordChangedEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_EAP_NOTIFICATION, strlen(WPA_EVENT_EAP_NOTIFICATION)))
        return new SupplicantEapNotificationEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_EAP_STARTED, strlen(WPA_EVENT_EAP_STARTED)))
        return new SupplicantEapStartedEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_EAP_METHOD, strlen(WPA_EVENT_EAP_METHOD)))
        return new SupplicantEapMethodEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_EAP_SUCCESS, strlen(WPA_EVENT_EAP_SUCCESS)))
        return new SupplicantEapSuccessEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_EAP_FAILURE, strlen(WPA_EVENT_EAP_FAILURE)))
        return new SupplicantEapFailureEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_LINK_SPEED, strlen(WPA_EVENT_LINK_SPEED)))
        return new SupplicantLinkSpeedEvent(event, len);
    else if (!strncmp(event, WPA_EVENT_DRIVER_STATE, strlen(WPA_EVENT_DRIVER_STATE)))
         return new SupplicantDriverStateEvent(event, len);
#endif
    return NULL;
}
