13aff2d1de59972684bf2ab798351be5544158239San Mehat/*
23aff2d1de59972684bf2ab798351be5544158239San Mehat * Copyright (C) 2008 The Android Open Source Project
33aff2d1de59972684bf2ab798351be5544158239San Mehat *
43aff2d1de59972684bf2ab798351be5544158239San Mehat * Licensed under the Apache License, Version 2.0 (the "License");
53aff2d1de59972684bf2ab798351be5544158239San Mehat * you may not use this file except in compliance with the License.
63aff2d1de59972684bf2ab798351be5544158239San Mehat * You may obtain a copy of the License at
73aff2d1de59972684bf2ab798351be5544158239San Mehat *
83aff2d1de59972684bf2ab798351be5544158239San Mehat *      http://www.apache.org/licenses/LICENSE-2.0
93aff2d1de59972684bf2ab798351be5544158239San Mehat *
103aff2d1de59972684bf2ab798351be5544158239San Mehat * Unless required by applicable law or agreed to in writing, software
113aff2d1de59972684bf2ab798351be5544158239San Mehat * distributed under the License is distributed on an "AS IS" BASIS,
123aff2d1de59972684bf2ab798351be5544158239San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133aff2d1de59972684bf2ab798351be5544158239San Mehat * See the License for the specific language governing permissions and
143aff2d1de59972684bf2ab798351be5544158239San Mehat * limitations under the License.
153aff2d1de59972684bf2ab798351be5544158239San Mehat */
163aff2d1de59972684bf2ab798351be5544158239San Mehat
173aff2d1de59972684bf2ab798351be5544158239San Mehat#include <stdlib.h>
183aff2d1de59972684bf2ab798351be5544158239San Mehat
193aff2d1de59972684bf2ab798351be5544158239San Mehat#define LOG_TAG "SupplicantEventFactory"
203aff2d1de59972684bf2ab798351be5544158239San Mehat#include <cutils/log.h>
213aff2d1de59972684bf2ab798351be5544158239San Mehat
223aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEvent.h"
233aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEventFactory.h"
243aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantAssociatingEvent.h"
253aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantAssociatedEvent.h"
263aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantConnectedEvent.h"
273aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantStateChangeEvent.h"
283aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantScanResultsEvent.h"
293aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantConnectionTimeoutEvent.h"
303aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantDisconnectedEvent.h"
313aff2d1de59972684bf2ab798351be5544158239San Mehat#if 0
323aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantTerminatingEvent.h"
333aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantPasswordChangedEvent.h"
343aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEapNotificationEvent.h"
353aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEapStartedEvent.h"
363aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEapMethodEvent.h"
373aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEapSuccessEvent.h"
383aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantEapFailureEvent.h"
393aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantLinkSpeedEvent.h"
403aff2d1de59972684bf2ab798351be5544158239San Mehat#include "SupplicantDriverStateEvent.h"
413aff2d1de59972684bf2ab798351be5544158239San Mehat#endif
423aff2d1de59972684bf2ab798351be5544158239San Mehat
433aff2d1de59972684bf2ab798351be5544158239San Mehat#include "libwpa_client/wpa_ctrl.h"
443aff2d1de59972684bf2ab798351be5544158239San Mehat
453aff2d1de59972684bf2ab798351be5544158239San MehatSupplicantEventFactory::SupplicantEventFactory() {
463aff2d1de59972684bf2ab798351be5544158239San Mehat}
473aff2d1de59972684bf2ab798351be5544158239San Mehat
483aff2d1de59972684bf2ab798351be5544158239San MehatSupplicantEvent *SupplicantEventFactory::createEvent(char *event, size_t len) {
493aff2d1de59972684bf2ab798351be5544158239San Mehat    int level = 0;
503aff2d1de59972684bf2ab798351be5544158239San Mehat
513aff2d1de59972684bf2ab798351be5544158239San Mehat    if (event[0] == '<') {
523aff2d1de59972684bf2ab798351be5544158239San Mehat        char *match = strchr(event, '>');
533aff2d1de59972684bf2ab798351be5544158239San Mehat        if (match) {
543aff2d1de59972684bf2ab798351be5544158239San Mehat            char tmp[16];
553aff2d1de59972684bf2ab798351be5544158239San Mehat
563aff2d1de59972684bf2ab798351be5544158239San Mehat            strncpy(tmp, &event[1], (match - event));
573aff2d1de59972684bf2ab798351be5544158239San Mehat            level = atoi(tmp);
583aff2d1de59972684bf2ab798351be5544158239San Mehat            event += (match - event) + 1;
593aff2d1de59972684bf2ab798351be5544158239San Mehat        } else
603aff2d1de59972684bf2ab798351be5544158239San Mehat            LOGW("Unclosed level brace in event");
613aff2d1de59972684bf2ab798351be5544158239San Mehat    } else
623aff2d1de59972684bf2ab798351be5544158239San Mehat        LOGW("No level specified in event");
633aff2d1de59972684bf2ab798351be5544158239San Mehat
643aff2d1de59972684bf2ab798351be5544158239San Mehat    /*
653aff2d1de59972684bf2ab798351be5544158239San Mehat     * <N>CTRL-EVENT-XXX
663aff2d1de59972684bf2ab798351be5544158239San Mehat     *    ^
673aff2d1de59972684bf2ab798351be5544158239San Mehat     *    +---- event
683aff2d1de59972684bf2ab798351be5544158239San Mehat     */
693aff2d1de59972684bf2ab798351be5544158239San Mehat
703aff2d1de59972684bf2ab798351be5544158239San Mehat    if (!strncmp(event, "Authentication with ", 20)) {
713aff2d1de59972684bf2ab798351be5544158239San Mehat        if (!strcmp(event + strlen(event) - strlen(" timed out."),
723aff2d1de59972684bf2ab798351be5544158239San Mehat                    " timed out.")) {
733aff2d1de59972684bf2ab798351be5544158239San Mehat            return new SupplicantConnectionTimeoutEvent(level,
743aff2d1de59972684bf2ab798351be5544158239San Mehat                                                        event + 20,
753aff2d1de59972684bf2ab798351be5544158239San Mehat                                                        len);
763aff2d1de59972684bf2ab798351be5544158239San Mehat        } else
773aff2d1de59972684bf2ab798351be5544158239San Mehat            return NULL;
783aff2d1de59972684bf2ab798351be5544158239San Mehat
793aff2d1de59972684bf2ab798351be5544158239San Mehat    } else if (!strncmp(event, "Associated with ", 16))
803aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantAssociatedEvent(level, event + 16, len);
813aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, "Trying to associate with ", 25))
823aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantAssociatingEvent(level, event + 25, len);
833aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_CONNECTED, strlen(WPA_EVENT_CONNECTED))) {
843aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantConnectedEvent(level,
853aff2d1de59972684bf2ab798351be5544158239San Mehat                                            event + strlen(WPA_EVENT_CONNECTED),
863aff2d1de59972684bf2ab798351be5544158239San Mehat                                            len);
873aff2d1de59972684bf2ab798351be5544158239San Mehat    } else if (!strncmp(event, WPA_EVENT_SCAN_RESULTS, strlen(WPA_EVENT_SCAN_RESULTS))) {
883aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantScanResultsEvent(level,
893aff2d1de59972684bf2ab798351be5544158239San Mehat                                              event + strlen(WPA_EVENT_SCAN_RESULTS),
903aff2d1de59972684bf2ab798351be5544158239San Mehat                                              len);
913aff2d1de59972684bf2ab798351be5544158239San Mehat    } else if (!strncmp(event, WPA_EVENT_STATE_CHANGE, strlen(WPA_EVENT_STATE_CHANGE))) {
923aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantStateChangeEvent(level,
933aff2d1de59972684bf2ab798351be5544158239San Mehat                                              event + strlen(WPA_EVENT_STATE_CHANGE),
943aff2d1de59972684bf2ab798351be5544158239San Mehat                                              len);
953aff2d1de59972684bf2ab798351be5544158239San Mehat    }
963aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_DISCONNECTED, strlen(WPA_EVENT_DISCONNECTED)))
973aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantDisconnectedEvent(level, event, len);
983aff2d1de59972684bf2ab798351be5544158239San Mehat#if 0
993aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_TERMINATING, strlen(WPA_EVENT_TERMINATING)))
1003aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantTerminatingEvent(event, len);
1013aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_PASSWORD_CHANGED, strlen(WPA_EVENT_PASSWORD_CHANGED)))
1023aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantPasswordChangedEvent(event, len);
1033aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_EAP_NOTIFICATION, strlen(WPA_EVENT_EAP_NOTIFICATION)))
1043aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantEapNotificationEvent(event, len);
1053aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_EAP_STARTED, strlen(WPA_EVENT_EAP_STARTED)))
1063aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantEapStartedEvent(event, len);
1073aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_EAP_METHOD, strlen(WPA_EVENT_EAP_METHOD)))
1083aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantEapMethodEvent(event, len);
1093aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_EAP_SUCCESS, strlen(WPA_EVENT_EAP_SUCCESS)))
1103aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantEapSuccessEvent(event, len);
1113aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_EAP_FAILURE, strlen(WPA_EVENT_EAP_FAILURE)))
1123aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantEapFailureEvent(event, len);
1133aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_LINK_SPEED, strlen(WPA_EVENT_LINK_SPEED)))
1143aff2d1de59972684bf2ab798351be5544158239San Mehat        return new SupplicantLinkSpeedEvent(event, len);
1153aff2d1de59972684bf2ab798351be5544158239San Mehat    else if (!strncmp(event, WPA_EVENT_DRIVER_STATE, strlen(WPA_EVENT_DRIVER_STATE)))
1163aff2d1de59972684bf2ab798351be5544158239San Mehat         return new SupplicantDriverStateEvent(event, len);
1173aff2d1de59972684bf2ab798351be5544158239San Mehat#endif
1183aff2d1de59972684bf2ab798351be5544158239San Mehat    return NULL;
1193aff2d1de59972684bf2ab798351be5544158239San Mehat}
120