/* -*- Mode: C -*- */
/*======================================================================
 FILE: icalvalue_cxx.h
 CREATOR: fnguyen 12/13/01
 (C) COPYRIGHT 2001, Critical Path

 This program is free software; you can redistribute it and/or modify
 it under the terms of either: 

    The LGPL as published by the Free Software Foundation, version
    2.1, available at: http://www.fsf.org/copyleft/lesser.html

  Or:

    The Mozilla Public License Version 1.0. You may obtain a copy of
    the License at http://www.mozilla.org/MPL/
======================================================================*/

#ifndef CP_ICALVALUE_H
#define CP_ICALVALUE_H

extern "C" {
#include "ical.h"
};
                          
#include "icptrholder.h"
                          
typedef	char* string; // Will use the string library from STL

class ICalValue {
public:
	ICalValue()                                  throw(icalerrorenum);
	ICalValue(const ICalValue&)                  throw(icalerrorenum);
	ICalValue& operator=(const ICalValue&)       throw(icalerrorenum);
	~ICalValue();

	ICalValue(icalvalue*)                        throw(icalerrorenum);
	ICalValue(icalvalue_kind kind)               throw(icalerrorenum);
	ICalValue(icalvalue_kind kind, string  str)  throw(icalerrorenum);

	operator icalvalue* () { return imp; }

	void detach() {
	    imp = NULL;
	}

public:
	string as_ical_string();
	bool is_valid();
	icalvalue_kind isa();
	int isa_value(void*);

	/* Special, non autogenerated value accessors */
	void set_recur(struct icalrecurrencetype v);
	struct icalrecurrencetype get_recur();

	void set_trigger(struct icaltriggertype v);
	struct icaltriggertype get_trigger();

	void set_datetimeperiod(struct icaldatetimeperiodtype v);
	struct icaldatetimeperiodtype get_datetimeperiod();

public:
	static icalparameter_xliccomparetype compare(ICalValue& a, ICalValue& b);

	/* Convert enumerations */
	static icalvalue_kind string_to_kind(string  str);
	string kind_to_string(icalvalue_kind kind);

public:
	/* BOOLEAN */ 
	int get_boolean(); 
	void set_boolean(int v);

	/* UTC-OFFSET */ 
	int get_utcoffset(); 
	void set_utcoffset(int v);

	/* METHOD */ 
	enum icalproperty_method get_method(); 
	void set_method(enum icalproperty_method v);

	/* CAL-ADDRESS */ 
	string get_caladdress(); 
	void set_caladdress(string  v);

	/* PERIOD */ 
	struct icalperiodtype get_period(); 
	void set_period(struct icalperiodtype v);

	/* STATUS */ 
	enum icalproperty_status get_status(); 
	void set_status(enum icalproperty_status v);

	/* BINARY */ 
	string get_binary(); 
	void set_binary(string  v);

	/* TEXT */ 
	string get_text(); 
	void set_text(string  v);

	/* DURATION */ 
	struct icaldurationtype get_duration(); 
	void set_duration(struct icaldurationtype v);

	/* INTEGER */ 
	int get_integer(); 
	void set_integer(int v);

	/* URI */ 
	string get_uri(); 
	void set_uri(string  v);

	/* ATTACH */ 
	icalattach *get_attach(); 
	void set_attach(icalattach *v);

	/* CLASS */ 
	enum icalproperty_class get_class(); 
	void set_class(enum icalproperty_class v);

	/* FLOAT */ 
	float get_float(); 
	void set_float(float v);

	/* QUERY */ 
	string get_query(); 
	void set_query(string  v);

	/* STRING */ 
	string get_string(); 
	void set_string(string  v);

	/* TRANSP */ 
	enum icalproperty_transp get_transp(); 
	void set_transp(enum icalproperty_transp v);

	/* DATE-TIME */ 
	struct icaltimetype get_datetime(); 
	void set_datetime(struct icaltimetype v);

	/* GEO */ 
	struct icalgeotype get_geo(); 
	void set_geo(struct icalgeotype v);

	/* DATE */ 
	struct icaltimetype get_date(); 
	void set_date(struct icaltimetype v);

	/* ACTION */ 
	enum icalproperty_action get_action(); 
	void set_action(enum icalproperty_action v);

private:
	icalvalue* imp;
};


typedef ICPointerHolder<ICalValue> ICalValueTmpPtr;    /* see icptrholder.h for comments */

#endif /*ICALVALUE_H*/
