/*
 * 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.
 */
/*
 * Handle registration of events, and debugger event notification.
 */
#ifndef ART_JDWP_JDWPEVENT_H_
#define ART_JDWP_JDWPEVENT_H_

#include "jdwp/jdwp_constants.h"
#include "jdwp/jdwp_expand_buf.h"

namespace art {

namespace JDWP {

/*
 * Event modifiers.  A JdwpEvent may have zero or more of these.
 */
union JdwpEventMod {
  JdwpModKind modKind;
  struct {
    JdwpModKind modKind;
    int         count;
  } count;
  struct {
    JdwpModKind modKind;
    uint32_t          exprId;
  } conditional;
  struct {
    JdwpModKind modKind;
    ObjectId    threadId;
  } threadOnly;
  struct {
    JdwpModKind modKind;
    RefTypeId   refTypeId;
  } classOnly;
  struct {
    JdwpModKind modKind;
    char*       classPattern;
  } classMatch;
  struct {
    JdwpModKind modKind;
    char*       classPattern;
  } classExclude;
  struct {
    JdwpModKind modKind;
    JdwpLocation loc;
  } locationOnly;
  struct {
    JdwpModKind modKind;
    uint8_t          caught;
    uint8_t          uncaught;
    RefTypeId   refTypeId;
  } exceptionOnly;
  struct {
    JdwpModKind modKind;
    RefTypeId   refTypeId;
    FieldId     fieldId;
  } fieldOnly;
  struct {
    JdwpModKind modKind;
    ObjectId    threadId;
    int         size;           /* JdwpStepSize */
    int         depth;          /* JdwpStepDepth */
  } step;
  struct {
    JdwpModKind modKind;
    ObjectId    objectId;
  } instanceOnly;
};

/*
 * One of these for every registered event.
 *
 * We over-allocate the struct to hold the modifiers.
 */
struct JdwpEvent {
  JdwpEvent* prev;           /* linked list */
  JdwpEvent* next;

  JdwpEventKind eventKind;      /* what kind of event is this? */
  JdwpSuspendPolicy suspend_policy;  /* suspend all, none, or self? */
  int modCount;       /* #of entries in mods[] */
  uint32_t requestId;      /* serial#, reported to debugger */

  JdwpEventMod mods[1];        /* MUST be last field in struct */
};

/*
 * Allocate an event structure with enough space.
 */
JdwpEvent* EventAlloc(int numMods);
void EventFree(JdwpEvent* pEvent);

}  // namespace JDWP

}  // namespace art

#endif  // ART_JDWP_JDWPEVENT_H_
