/*******************************************************************************
 * 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. Feb 26, 2010
 *******************************************************************************/


#ifndef PROPERTYVALUE_H_
#define PROPERTYVALUE_H_

#include <map>
#include <string>
#include "TCFOutputStream.h"

enum PropertyType {
	PVT_UNKNOWN,
	PVT_INT,
	PVT_ULONG_INT,
	PVT_BOOL,
	PVT_STRING
};

class PropertyValue {
public:
	PropertyValue();

	PropertyValue(const PropertyValue &src);

	PropertyValue(int x);
	
	PropertyValue(unsigned long int x);

	PropertyValue(bool x);

	PropertyValue(const char *x);

	PropertyValue(const std::string& x);

	PropertyType getType();

	int getIntValue();
	unsigned long int getUnsignedLongIntValue();

	bool getBoolValue();

	const std::string& getStringValue();


	void writeToTCFChannel(TCFOutputStream& tcf_stream) const;

	void log() const;

private:
	PropertyType type;

	union {
		int v_int;		
		unsigned long int v_ulong_int;
		bool v_bool;
	} v;

	// "std::string" is not allowed to be in a union.
	// But I still prefer std::string to char* for easier memory management.
	std::string v_string;
};

typedef std::map<std::string, PropertyValue>	Properties;

void logProperties(Properties& properties);

#endif /* PROPERTYVALUE_H_ */
