/*
 * Copyright (C) 2003 Ximian, Inc. 2005 Armin Bauer
 *
 * Copyright (C) 2003 Ximian, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 * 
 * Author: Chris Toshok (toshok@ximian.com)
 * Author: Armin Bauer (armin.bauer@opensync.org)
 * 
 */

#ifndef _VFORMAT_H
#define _VFORMAT_H

#include <glib.h>
#include <time.h>

typedef enum {
	VFORMAT_CARD_21,
	VFORMAT_CARD_30,
	VFORMAT_NOTE,
	VFORMAT_EVENT_10,
	VFORMAT_EVENT_20,
	VFORMAT_TODO_10,
	VFORMAT_TODO_20
} VFormatType;

typedef struct VFormat {
	//VFormatType type;
	GList *attributes;
} VFormat;

#define CRLF "\r\n"

typedef enum {
	VF_ENCODING_RAW,    /* no encoding */
	VF_ENCODING_BASE64, /* base64 */
	VF_ENCODING_QP,     /* quoted-printable */
	VF_ENCODING_8BIT
} VFormatEncoding;

typedef struct VFormatAttribute {
	char  *group;
	char  *name;
	GList *params; /* VFormatParam */
	GList *values;
	GList *decoded_values;
	VFormatEncoding encoding;
	gboolean encoding_set;
} VFormatAttribute;

typedef struct VFormatParam {
	char     *name;
	GList    *values;  /* GList of char*'s*/
} VFormatParam;


/*VFormat *vcard_new(VFormatType type);
VFormat *vcard_new_from_string (const char *str, VFormatType type);
//char *vcard_to_string(VFormat *card, VFormatType format);

VFormat *vnote_new(void);
VFormat *vnote_new_from_string(const char *str);
//char *vnote_to_string(VFormat *note);


VFormat *vevent_new(void);
VFormat *vevent_new_from_string(const char *str);
//char *vevent_to_string(VFormat *event);

VFormat *vtodo_new(void);
VFormat *vtodo_new_from_string(const char *str);*/
//char *vtodo_to_string(VFormat *todo);

/* mostly for debugging */
VFormat *vformat_new(void);
VFormat *vformat_new_from_string(const char *str);
void vformat_dump_structure(VFormat *format);
char *vformat_to_string(VFormat *evc, VFormatType type);
time_t vformat_time_to_unix(const char *inptime);

/* attributes */
VFormatAttribute *vformat_attribute_new               (const char *attr_group, const char *attr_name);
void             vformat_attribute_free              (VFormatAttribute *attr);
VFormatAttribute *vformat_attribute_copy              (VFormatAttribute *attr);
void             vformat_remove_attributes           (VFormat *vformat, const char *attr_group, const char *attr_name);
void             vformat_remove_attribute            (VFormat *vformat, VFormatAttribute *attr);
void             vformat_add_attribute               (VFormat *vformat, VFormatAttribute *attr);
void             vformat_add_attribute_with_value    (VFormat *vformat, VFormatAttribute *attr, const char *value);
void             vformat_add_attribute_with_values   (VFormat *vformat, VFormatAttribute *attr, ...);
void             vformat_attribute_add_value         (VFormatAttribute *attr, const char *value);
void             vformat_attribute_set_value         (VFormatAttribute *attr, int nth, const char *value);
void             vformat_attribute_add_value_decoded (VFormatAttribute *attr, const char *value, int len);
void             vformat_attribute_add_values        (VFormatAttribute *attr, ...);
void             vformat_attribute_remove_values     (VFormatAttribute *attr);
void             vformat_attribute_remove_params     (VFormatAttribute *attr);
VFormatAttribute *vformat_find_attribute             (VFormat *evc, const char *name);

/* attribute parameters */
VFormatParam* vformat_attribute_param_new             (const char *param_name);
void                  vformat_attribute_param_free            (VFormatParam *param);
VFormatParam* vformat_attribute_param_copy            (VFormatParam *param);
void                  vformat_attribute_add_param             (VFormatAttribute *attr, VFormatParam *param);
VFormatParam *vformat_attribute_find_param(VFormatAttribute *attr, const char *name);
void                  vformat_attribute_add_param_with_value  (VFormatAttribute *attr, const char *name, const char *value);
void                  vformat_attribute_add_param_with_values (VFormatAttribute *attr,
							       VFormatParam *param, ...);

void                  vformat_attribute_param_add_value       (VFormatParam *param,
							       const char *value);
void                  vformat_attribute_param_add_values      (VFormatParam *param,
							       ...);
void                  vformat_attribute_param_remove_values   (VFormatParam *param);
gboolean vformat_attribute_has_param(VFormatAttribute *attr, const char *name);

/* VFormat* accessors.  nothing returned from these functions should be
   freed by the caller. */
GList*           vformat_get_attributes       (VFormat *vformat);
const char*      vformat_attribute_get_group  (VFormatAttribute *attr);
const char*      vformat_attribute_get_name   (VFormatAttribute *attr);
GList*           vformat_attribute_get_values (VFormatAttribute *attr);  /* GList elements are of type char* */
GList*           vformat_attribute_get_values_decoded (VFormatAttribute *attr); /* GList elements are of type GString* */
const char *vformat_attribute_get_nth_value(VFormatAttribute *attr, int nth);

/* special accessors for single valued attributes */
gboolean              vformat_attribute_is_single_valued      (VFormatAttribute *attr);
char*                 vformat_attribute_get_value             (VFormatAttribute *attr);
GString*              vformat_attribute_get_value_decoded     (VFormatAttribute *attr);

GList*           vformat_attribute_get_params       (VFormatAttribute *attr);
const char*      vformat_attribute_param_get_name   (VFormatParam *param);
GList*           vformat_attribute_param_get_values (VFormatParam *param);
const char *vformat_attribute_param_get_nth_value(VFormatParam *param, int nth);

/* special TYPE= parameter predicate (checks for TYPE=@typestr */
gboolean         vformat_attribute_has_type         (VFormatAttribute *attr, const char *typestr);

/* Utility functions. */
char*            vformat_escape_string (const char *str, VFormatType type);
char*            vformat_unescape_string (const char *str);

#endif /* _VFORMAT_H */


syntax highlighted by Code2HTML, v. 0.9.1