/*
 * Copyright 2016 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.
 */

package android.hardware.wifi@1.0;

/**
 * NAN Response and Asynchronous Event Callbacks.
 *
 * References to "NAN Spec" are to the Wi-Fi Alliance "Wi-Fi Neighbor Awareness
 * Networking (NAN) Technical Specification".
 */
interface IWifiNanIfaceEventCallback {
  /**
   * Notify callbacks are asynchronous callbacks - but in response to |IWifiNanIface| method calls.
   * Each method will receive a notify callback to return results (on success) or failure status.
   */

  /**
   * Asynchronous callback invoked in response to a capability request
   * |IWifiNanIface.getCapabilitiesRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   * @param capabilities Capability data.
   */
  oneway notifyCapabilitiesResponse(CommandIdShort id, WifiNanStatus status,
                                    NanCapabilities capabilities);

  /**
   * Asynchronous callback invoked in response to an enable request |IWifiNanIface.enableRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.ALREADY_ENABLED|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   *        |NanStatusType.PROTOCOL_FAILURE|
   *        |NanStatusType.NAN_NOT_ALLOWED|
   */
  oneway notifyEnableResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to a config request |IWifiNanIface.configRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   *        |NanStatusType.PROTOCOL_FAILURE|
   */
  oneway notifyConfigResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to a disable request |IWifiNanIface.disableRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.PROTOCOL_FAILURE|
   */
  oneway notifyDisableResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked to notify the status of the start publish request
   * |IWifiNanIface.startPublishRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.PROTOCOL_FAILURE|
   *        |NanStatusType.NO_RESOURCES_AVAILABLE|
   *        |NanStatusType.INVALID_SESSION_ID|
   * @param sessionId ID of the new publish session (if successfully created).
   */
  oneway notifyStartPublishResponse(CommandIdShort id, WifiNanStatus status, uint8_t sessionId);

  /**
   * Asynchronous callback invoked in response to a stop publish request
   * |IWifiNanIface.stopPublishRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_SESSION_ID|
   *        |NanStatusType.INTERNAL_FAILURE|
   */
  oneway notifyStopPublishResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked to notify the status of the start subscribe request
   * |IWifiNanIface.startSubscribeRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.PROTOCOL_FAILURE|
   *        |NanStatusType.NO_RESOURCES_AVAILABLE|
   *        |NanStatusType.INVALID_SESSION_ID|
   * @param sessionId ID of the new subscribe session (if successfully created).
   */
  oneway notifyStartSubscribeResponse(CommandIdShort id, WifiNanStatus status, uint8_t sessionId);

  /**
   * Asynchronous callback invoked in response to a stop subscribe request
   * |IWifiNanIface.stopSubscribeRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_SESSION_ID|
   *        |NanStatusType.INTERNAL_FAILURE|
   */
  oneway notifyStopSubscribeResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to a transmit followup request
   * |IWifiNanIface.transmitFollowupRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   *        |NanStatusType.INVALID_SESSION_ID|
   *        |NanStatusType.INVALID_PEER_ID|
   *        |NanStatusType.FOLLOWUP_TX_QUEUE_FULL|
   */
  oneway notifyTransmitFollowupResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to a create data interface request
   * |IWifiNanIface.createDataInterfaceRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   */
  oneway notifyCreateDataInterfaceResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to a delete data interface request
   * |IWifiNanIface.deleteDataInterfaceRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   */
  oneway notifyDeleteDataInterfaceResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to an initiate data path request
   * |IWifiNanIface.initiateDataPathRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   *        |NanStatusType.PROTOCOL_FAILURE|
   *        |NanStatusType.INVALID_PEER_ID|
   * @param ndpInstanceId ID of the new data path being negotiated (on successful status).
   */
  oneway notifyInitiateDataPathResponse(CommandIdShort id, WifiNanStatus status,
        uint32_t ndpInstanceId );

  /**
   * Asynchronous callback invoked in response to a respond to data path indication request
   * |IWifiNanIface.respondToDataPathIndicationRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   *        |NanStatusType.PROTOCOL_FAILURE|
   *        |NanStatusType.INVALID_NDP_ID|
   */
  oneway notifyRespondToDataPathIndicationResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback invoked in response to a terminate data path request
   * |IWifiNanIface.terminateDataPathRequest|.
   *
   * @param cmdId command Id corresponding to the original request.
   * @param status WifiNanStatus of the operation. Possible status codes are:
   *        |NanStatusType.SUCCESS|
   *        |NanStatusType.INVALID_ARGS|
   *        |NanStatusType.INTERNAL_FAILURE|
   *        |NanStatusType.PROTOCOL_FAILURE|
   *        |NanStatusType.INVALID_NDP_ID|
   */
  oneway notifyTerminateDataPathResponse(CommandIdShort id, WifiNanStatus status);

  /**
   * Callbacks for the various asynchornous NAN Events.
   */

  /**
   * Asynchronous callback indicating that a cluster event has been received.
   *
   * @param event: NanClusterEventInd containing event details.
   */
  oneway eventClusterEvent(NanClusterEventInd event);

  /**
   * Asynchronous callback indicating that a NAN has been disabled.
   *
   * @param status: WifiNanStatus describing the reason for the disable event.
   *                Possible status codes are:
   *                |NanStatusType.SUCCESS|
   *                |NanStatusType.UNSUPPORTED_CONCURRENCY_NAN_DISABLED|
   */
  oneway eventDisabled(WifiNanStatus status);

  /**
   * Asynchronous callback indicating that an active publish session has terminated.
   *
   * @param sessionId: The discovery session ID of the terminated session.
   * @param status: WifiNanStatus describing the reason for the session termination.
   *                Possible status codes are:
   *                |NanStatusType.SUCCESS|
   */
  oneway eventPublishTerminated(uint8_t sessionId, WifiNanStatus status);

  /**
   * Asynchronous callback indicating that an active subscribe session has terminated.
   *
   * @param sessionId: The discovery session ID of the terminated session.
   * @param status: WifiNanStatus describing the reason for the session termination.
   *                 Possible status codes are:
   *                |NanStatusType.SUCCESS|
   */
  oneway eventSubscribeTerminated(uint8_t sessionId, WifiNanStatus status);

  /**
   * Asynchronous callback indicating that a match has occurred: i.e. a service has been
   * discovered.
   *
   * @param event: NanMatchInd containing event details.
   */
  oneway eventMatch(NanMatchInd event);

  /**
   * Asynchronous callback indicating that a previously discovered match (service) has expired.
   *
   * @param discoverySessionId: The discovery session ID of the expired match.
   * @param peerId: The peer ID of the expired match.
   */
  oneway eventMatchExpired(uint8_t discoverySessionId, uint32_t peerId);

  /**
   * Asynchronous callback indicating that a followup message has been received from a peer.
   *
   * @param event: NanFollowupReceivedInd containing event details.
   */
  oneway eventFollowupReceived(NanFollowupReceivedInd event);

  /**
   * Asynchronous callback providing status on a completed followup message transmit operation.
   *
   * @param cmdId command Id corresponding to the original |transmitFollowupRequest| request.
   * @param status WifiNanStatus of the operation.  Possible status codes are:
   *               |NanStatusType.SUCCESS|
   *               |NanStatusType.NO_OTA_ACK|
   *               |NanStatusType.PROTOCOL_FAILURE|
   */
  oneway eventTransmitFollowup(CommandIdShort id, WifiNanStatus status);

  /**
   * Asynchronous callback indicating a data-path (NDP) setup has been requested by an Initiator
   * peer (received by the intended Respodner).
   *
   * @param event: NanDataPathRequestInd containing event details.
   */
  oneway eventDataPathRequest(NanDataPathRequestInd event);

  /**
   * Asynchronous callback indicating a data-path (NDP) setup has been completed: received by
   * both Initiator and Responder.
   *
   * @param event: NanDataPathConfirmInd containing event details.
   */
  oneway eventDataPathConfirm(NanDataPathConfirmInd event);

  /**
   * Asynchronous callback indicating a list of data-paths (NDP) have been terminated: received by
   * both Initiator and Responder.
   *
   * @param ndpInstanceId: data-path ID of the terminated data-path.
   */
  oneway eventDataPathTerminated(uint32_t ndpInstanceId);
};
