// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef BIN_ISOLATE_DATA_H_
#define BIN_ISOLATE_DATA_H_

#include "include/dart_api.h"
#include "platform/assert.h"
#include "platform/globals.h"

namespace dart {
namespace bin {

// Forward declaration.
class EventHandler;

// Data associated with every isolate in the standalone VM
// embedding. This is used to free external resources for each isolate
// when the isolate shuts down.
class IsolateData {
 public:
  IsolateData(const char* url,
              const char* package_root,
              const char* packages_file)
      : script_url((url != NULL) ? strdup(url) : NULL),
        package_root(NULL),
        packages_file(NULL),
        udp_receive_buffer(NULL),
        builtin_lib_(NULL) {
    if (package_root != NULL) {
      ASSERT(packages_file == NULL);
      this->package_root = strdup(package_root);
    } else if (packages_file != NULL) {
      this->packages_file = strdup(packages_file);
    }
  }

  ~IsolateData() {
    free(script_url);
    script_url = NULL;
    free(package_root);
    package_root = NULL;
    free(packages_file);
    packages_file = NULL;
    free(udp_receive_buffer);
    udp_receive_buffer = NULL;
    if (builtin_lib_ != NULL) {
      Dart_DeletePersistentHandle(builtin_lib_);
    }
  }

  Dart_Handle builtin_lib() const {
    ASSERT(builtin_lib_ != NULL);
    ASSERT(!Dart_IsError(builtin_lib_));
    return builtin_lib_;
  }
  void set_builtin_lib(Dart_Handle lib) {
    ASSERT(builtin_lib_ == NULL);
    ASSERT(lib != NULL);
    ASSERT(!Dart_IsError(lib));
    builtin_lib_ = Dart_NewPersistentHandle(lib);
  }

  char* script_url;
  char* package_root;
  char* packages_file;
  uint8_t* udp_receive_buffer;

 private:
  Dart_Handle builtin_lib_;

  DISALLOW_COPY_AND_ASSIGN(IsolateData);
};

}  // namespace bin
}  // namespace dart

#endif  // BIN_ISOLATE_DATA_H_
