// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ENTD_UTILS_H_
#define ENTD_UTILS_H_

#include <list>
#include <string>
#include <vector>
#include <v8.h>

namespace entd {

namespace utils {

// malloc some memory, exit(2) if OOM.  Used to create things libevent might
// want to free.
void* malloc(size_t size);

// free some memory allocated by utils::malloc()
void free(void *buf);

// Extracts a C string from a V8 Utf8Value.
const char* ToCString(const v8::String::Utf8Value& value);

// Checks to see if the string contains only characters legal in a domain name
bool CheckHostnameCharset(const std::string& str);

// Reads a file into a V8 String.
v8::Handle<v8::String> ReadFile(const std::string& name);

// Reads the contents of a directory into an array of file/dir names.
std::vector<std::string> ReadDirectory(const std::string& path);

// Expands any environment variables, including ~ and ~user
// Asumes that path is a single word.
std::string ExpandFilePath(const std::string& path);

// Convert a V8 Value to a std::string
std::string ValueAsUtf8String(v8::Handle<v8::Value> value);

// Retrieve the named JS parameter from the V8 object
// and convert it to a std::string
std::string GetPropertyAsString(v8::Handle<v8::Object> obj,
                                const std::string& name);

// Returns the named property "desc" in object "obj" as a StringList.
// "desc" can be either:
// * an Array, in which case each element is added to the result
//   as its String representation
// * an Object, in which case each property is added to the result
//   as "property + delim + property value"
typedef std::list<std::string> StringList;
StringList GetPropertyAsStringList(v8::Handle<v8::Object> obj,
                                   const std::string& name,
                                   const std::string& delim);

v8::Handle<v8::Value> ThrowV8Exception(const std::string& err);

// Prints the exception described in 'try_catch'
void ReportV8Exception(v8::TryCatch* try_catch);

// Call the V8 method in 'obj' associated with the property 'cb_name'
// 'argc' and 'arcv' specify arguments to the V8 method.
// Returns the result of the function if successfully called,
// or an empty handle if the function is not called.
v8::Handle<v8::Value> CallV8Function(
    v8::Handle<v8::Object> obj, const std::string& cb_name,
    int argc, v8::Handle<v8::Value> argv[]);

}  // namespace utils

}  // namespace entd

#endif // ENTD_UTILS_H_
