/*******************************************************************************
 * Copyright (c) 2010 Nokia and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Nokia - Initial API and implementation
 *******************************************************************************/
#ifndef TCFCONTEXT_H_
#define TCFCONTEXT_H_

#include <map>
#include <vector>
#include <list>
#include <string>

#include "AgentException.h"
#include "PropertyValue.h"

#define ROOT_CONTEXT_ID	"root"

/*
 * Properties of context.
 */
/* From: TCF IRunControl.java.
 */
#define PROP_ID 			"ID"
#define PROP_PARENT_ID		"ParentID"
#define PROP_PROCESS_ID		"ProcessID"
#define PROP_IS_CONTAINER	"IsContainer"
#define PROP_HAS_STATE		"HasState"
#define PROP_CAN_RESUME		"CanResume"	// value: int/long
#define PROP_CAN_COUNT		"CanCount"
#define PROP_CAN_SUSPEND	"CanSuspend"
#define PROP_CAN_TERMINATE	"CanTerminate"

/* From: TCF IProcesses.java
 */
/** Is the context attached */
#define PROP_ATTACHED		"Attached"
/** Process name. Client UI can show this name to a user */
#define PROP_NAME 			"Name"


typedef unsigned long ContextOSID; // ID in the OS
typedef std::string ContextID; // ID in debugger
typedef unsigned long ContextAddress; /* Type to represent byted address inside context memory */

/*
 * Context in TCF agent.
 * The context can be a process, thread, register group, register, etc.
 */
class Context {
  public:
	Context(const ContextID& parentID, const ContextID& internalID);

	Context(const ContextID& parentID, const ContextID& internalID, Properties& props);

	virtual ~Context();

	/*
	 * Get unique ID for the instance. This is internal ID, not process ID
	 * or thread ID in the OS.
	 */
	ContextID GetID() const;

	/* Get internal ID of the process if the context is a thread.
	 * Return invalid id if the context is a process.
	 */
	ContextID GetParentID() const;

	virtual std::list<Context*>& GetChildren();
	void AddChild(Context *);
	void RemoveChild(Context *);

	Properties& GetProperties();
	PropertyValue& GetProperty(const std::string& key);
	void SetProperty(const std::string& key, const PropertyValue& value);

  private:
	void Initialize();

	ContextID internalID;
	ContextID parentID;

	std::list<Context *> children_;
	Properties properties;
};

typedef void ContextAttachCallBack(int, Context *, void *);

#endif /* CONTEXT_H_ */
