/** @file
  The implementation of delete policy entry function in IpSecConfig application.

  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>

  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php.

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#include "IpSecConfig.h"
#include "Indexer.h"
#include "Delete.h"
#include "Match.h"
#include "ForEach.h"

/**
  Private function to delete entry information in database.

  @param[in] Selector    The pointer to EFI_IPSEC_CONFIG_SELECTOR structure.
  @param[in] Data        The pointer to Data.
  @param[in] Context     The pointer to DELETE_POLICY_ENTRY_CONTEXT.

  @retval EFI_ABORTED    Abort the iteration.
  @retval EFI_SUCCESS    Continue the iteration.
**/
EFI_STATUS
DeletePolicyEntry (
  IN EFI_IPSEC_CONFIG_SELECTOR      *Selector,
  IN VOID                           *Data,
  IN DELETE_POLICY_ENTRY_CONTEXT    *Context
  )
{
  if (mMatchPolicyEntry[Context->DataType] (Selector, Data, &Context->Indexer)) {
    Context->Status = mIpSecConfig->SetData (
                                      mIpSecConfig,
                                      Context->DataType,
                                      Selector,
                                      NULL,
                                      NULL
                                      );
    //
    // Abort the iteration after the insertion.
    //
    return EFI_ABORTED;
  }

  return EFI_SUCCESS;
}

/**
  Flush or delete entry information in the database according to datatype.

  @param[in] DataType        The value of EFI_IPSEC_CONFIG_DATA_TYPE.
  @param[in] ParamPackage    The pointer to the ParamPackage list.

  @retval EFI_SUCCESS      Delete entry information successfully.
  @retval EFI_NOT_FOUND    Can't find the specified entry.
  @retval Others           Some mistaken case.
**/
EFI_STATUS
FlushOrDeletePolicyEntry (
  IN EFI_IPSEC_CONFIG_DATA_TYPE    DataType,
  IN LIST_ENTRY                    *ParamPackage
  )
{
  EFI_STATUS                     Status;
  DELETE_POLICY_ENTRY_CONTEXT    Context;
  CONST CHAR16                   *ValueStr;

  //
  // If user wants to remove all.
  //
  if (ShellCommandLineGetFlag (ParamPackage, L"-f")) {
    Status = mIpSecConfig->SetData (
                             mIpSecConfig,
                             DataType,
                             NULL,
                             NULL,
                             NULL
                             );
  } else {
    ValueStr = ShellCommandLineGetValue (ParamPackage, L"-d");
    if (ValueStr == NULL) {
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_INDEX_NOT_SPECIFIED), mHiiHandle, mAppName, ValueStr);
      return EFI_NOT_FOUND;
    }

    Status = mConstructPolicyEntryIndexer[DataType] (&Context.Indexer, ParamPackage);
    if (!EFI_ERROR (Status)) {
      Context.DataType  = DataType;
      Context.Status    = EFI_NOT_FOUND;
      ForeachPolicyEntry (DataType, (VISIT_POLICY_ENTRY) DeletePolicyEntry, &Context);
      Status = Context.Status;

      if (Status == EFI_NOT_FOUND) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_INDEX_NOT_FOUND), mHiiHandle, mAppName, ValueStr);
      } else if (EFI_ERROR (Status)) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_DELETE_FAILED), mHiiHandle, mAppName);
      }
    }
  }

  return Status;
}
