/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * 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 <securec.h>
#include <hdf_base.h>
#include <hdf_log.h>
#include <osal_time.h>
#include <osal_mem.h>
#include "v1_1/iwpa_callback.h"
#include "v1_1/iwpa_interface.h"
#include "wpa_common_cmd.h"
#include "wpa_p2p_cmd.h"
#include "wpa_impl.h"

struct WpaInterfaceService {
    struct IWpaInterface interface;
};

struct IWpaInterface *WpaInterfaceImplGetInstance(void)
{
    struct WpaInterfaceService *service = (struct WpaInterfaceService *)OsalMemCalloc(
        sizeof(struct WpaInterfaceService));
    if (service == NULL) {
        HDF_LOGE("%{public}s: malloc WpaInterfaceService obj failed!", __func__);
        return NULL;
    }

    service->interface.Start = WpaInterfaceStart;
    service->interface.Stop = WpaInterfaceStop;
    service->interface.AddWpaIface = WpaInterfaceAddWpaIface;
    service->interface.RemoveWpaIface = WpaInterfaceRemoveWpaIface;
    service->interface.Scan = WpaInterfaceScan;
    service->interface.ScanResult= WpaInterfaceScanResult;
    service->interface.AddNetwork = WpaInterfaceAddNetwork;
    service->interface.RemoveNetwork = WpaInterfaceRemoveNetwork;
    service->interface.DisableNetwork = WpaInterfaceDisableNetwork;
    service->interface.SetNetwork = WpaInterfaceSetNetwork;
    service->interface.ListNetworks = WpaInterfaceListNetworks;
    service->interface.SelectNetwork = WpaInterfaceSelectNetwork;
    service->interface.EnableNetwork = WpaInterfaceEnableNetwork;
    service->interface.Reconnect = WpaInterfaceReconnect;
    service->interface.Disconnect = WpaInterfaceDisconnect;
    service->interface.SetPowerSave = WpaInterfaceSetPowerSave;
    service->interface.AutoConnect = WpaInterfaceAutoConnect;
    service->interface.WifiStatus  = WpaInterfaceWifiStatus;
    service->interface.SaveConfig = WpaInterfaceSaveConfig;
    service->interface.WpsPbcMode = WpaInterfaceWpsPbcMode;
    service->interface.WpsPinMode = WpaInterfaceWpsPinMode;
    service->interface.WpsCancel = WpaInterfaceWpsCancel;
    service->interface.GetCountryCode = WpaInterfaceGetCountryCode;
    service->interface.GetNetwork = WpaInterfaceGetNetwork;
    service->interface.BlocklistClear = WpaInterfaceBlocklistClear;
    service->interface.SetSuspendMode = WpaInterfaceSetSuspendMode;
    service->interface.RegisterEventCallback = WpaInterfaceRegisterEventCallback;
    service->interface.UnregisterEventCallback = WpaInterfaceUnregisterEventCallback;
    service->interface.RegisterWpaEventCallback = WpaInterfaceRegisterEventCallback;
    service->interface.UnregisterWpaEventCallback = WpaInterfaceUnregisterEventCallback;
    service->interface.GetConnectionCapabilities = WpaInterfaceGetConnectionCapabilities;
    service->interface.GetScanSsid = WpaInterfaceGetScanSsid;
    service->interface.GetPskPassphrase = WpaInterfaceGetPskPassphrase;
    service->interface.GetPsk = WpaInterfaceGetPsk;
    service->interface.GetWepKey = WpaInterfaceGetWepKey;
    service->interface.GetWepTxKeyIdx = WpaInterfaceGetWepTxKeyIdx;
    service->interface.GetRequirePmf = WpaInterfaceGetRequirePmf;
    service->interface.SetCountryCode = WpaInterfaceSetCountryCode;
    service->interface.Reassociate = WpaInterfaceReassociate;
    service->interface.StaShellCmd = WpaInterfaceStaShellCmd;

    service->interface.P2pSetSsidPostfixName = WpaInterfaceP2pSetSsidPostfixName;
    service->interface.P2pSetWpsDeviceType = WpaInterfaceP2pSetWpsDeviceType;
    service->interface.P2pSetWpsConfigMethods = WpaInterfaceP2pSetWpsConfigMethods;
    service->interface.P2pSetGroupMaxIdle = WpaInterfaceP2pSetGroupMaxIdle;
    service->interface.P2pSetWfdEnable = WpaInterfaceP2pSetWfdEnable;
    service->interface.P2pSetPersistentReconnect = WpaInterfaceP2pSetPersistentReconnect;
    service->interface.P2pSetWpsSecondaryDeviceType = WpaInterfaceP2pSetWpsSecondaryDeviceType;
    service->interface.P2pSetupWpsPbc = WpaInterfaceP2pSetupWpsPbc;
    service->interface.P2pSetupWpsPin = WpaInterfaceP2pSetupWpsPin;
    service->interface.P2pSetPowerSave = WpaInterfaceP2pSetPowerSave;
    service->interface.P2pSetDeviceName = WpaInterfaceP2pSetDeviceName;
    service->interface.P2pSetWfdDeviceConfig = WpaInterfaceP2pSetWfdDeviceConfig;
    service->interface.P2pSetRandomMac = WpaInterfaceP2pSetRandomMac;
    service->interface.P2pStartFind = WpaInterfaceP2pStartFind;
    service->interface.P2pSetExtListen = WpaInterfaceP2pSetExtListen;
    service->interface.P2pSetListenChannel = WpaInterfaceP2pSetListenChannel;
    service->interface.P2pProvisionDiscovery = WpaInterfaceP2pProvisionDiscovery;
    service->interface.P2pAddGroup = WpaInterfaceP2pAddGroup;
    service->interface.P2pAddService = WpaInterfaceP2pAddService;
    service->interface.P2pRemoveService = WpaInterfaceP2pRemoveService;
    service->interface.P2pStopFind = WpaInterfaceP2pStopFind;
    service->interface.P2pFlush = WpaInterfaceP2pFlush;
    service->interface.P2pFlushService = WpaInterfaceP2pFlushService;
    service->interface.P2pRemoveNetwork = WpaInterfaceP2pRemoveNetwork;
    service->interface.P2pSetGroupConfig = WpaInterfaceP2pSetGroupConfig;
    service->interface.P2pInvite = WpaInterfaceP2pInvite;
    service->interface.P2pReinvoke = WpaInterfaceP2pReinvoke;
    service->interface.P2pGetDeviceAddress = WpaInterfaceP2pGetDeviceAddress;
    service->interface.P2pReqServiceDiscovery = WpaInterfaceP2pReqServiceDiscovery;
    service->interface.P2pCancelServiceDiscovery = WpaInterfaceP2pCancelServiceDiscovery;
    service->interface.P2pRespServerDiscovery = WpaInterfaceP2pRespServerDiscovery;
    service->interface.P2pConnect = WpaInterfaceP2pConnect;
    service->interface.P2pHid2dConnect = WpaInterfaceP2pHid2dConnect;
    service->interface.P2pSetServDiscExternal = WpaInterfaceP2pSetServDiscExternal;
    service->interface.P2pRemoveGroup = WpaInterfaceP2pRemoveGroup;
    service->interface.P2pCancelConnect = WpaInterfaceP2pCancelConnect;
    service->interface.P2pGetGroupConfig = WpaInterfaceP2pGetGroupConfig;
    service->interface.P2pAddNetwork = WpaInterfaceP2pAddNetwork;
    service->interface.P2pGetPeer = WpaInterfaceP2pGetPeer;
    service->interface.P2pGetGroupCapability = WpaInterfaceP2pGetGroupCapability;
    service->interface.P2pListNetworks = WpaInterfaceP2pListNetworks;
    service->interface.DeliverP2pData = WpaInterfaceDeliverP2pData;
    service->interface.P2pSaveConfig = WpaInterfaceP2pSaveConfig;

    service->interface.VendorProcessCmd = WpaInterfaceVendorExtProcessCmd;

    return &service->interface;
}

void WpaInterfaceImplRelease(struct IWpaInterface *instance)
{
    if (instance == NULL) {
        return;
    }
    OsalMemFree(instance);
}