#ifndef __TUPLE_H
#define __TUPLE_H

/* PA tuple functions (data structures are defined in presentity.h) */

#include "presentity.h"

/* Create a new presence_tuple */
int new_presence_tuple(str* _contact, time_t expires, 
		presence_tuple_t ** _t, int is_published, str *id,
		str *published_id, str *etag);

/* add presence tuple to presentity and to database */
void add_presence_tuple(presentity_t *_p, presence_tuple_t *_t);

/* Remove tuple from presentity and from database too */
void remove_presence_tuple(presentity_t *_p, presence_tuple_t *_t);

/* Free all memory associated with a presence_tuple */
void free_presence_tuple(presence_tuple_t * _t);

/* Find a tuple for contact _contact on presentity _p - only registered contacts ! */
int find_registered_presence_tuple(str* _contact, presentity_t *_p, presence_tuple_t ** _t);

/* Find tuple with given id */
int find_presence_tuple_id(str* id, presentity_t *_p, presence_tuple_t ** _t);

/* Find published tuple with given ID (ID used for publication, not tuple ID!) */
presence_tuple_t *find_published_tuple(presentity_t *presentity, str *etag, str *id);

/** Function reads all tuples from DB for given presentity */
int db_read_tuples(presentity_t *_p, db_con_t* db);

/* update tuple status in database */
int db_update_presence_tuple(presentity_t *_p, presence_tuple_t *t, int update_notes_and_ext);

/* creates new tuple from given information (needed for publishing */
presence_tuple_t *presence_tuple_info2pa(presence_tuple_info_t *i, str *etag, time_t expires);

/* updates published information */
void update_tuple(presentity_t *p, presence_tuple_t *t, presence_tuple_info_t *i, time_t expires);