Calendar-CSA
view release on metacpan or search on metacpan
if (items>1) {
csa_attrs = safe_calloc(sizeof(CSA_attribute)*((items-1)/2), 1);
for(j=0,i=1;i<items;j++,i+=2) {
csa_attrs[j].name = lengthen(SvPV(ST(i),na));
csa_attrs[j].value = SvCSA_attribute_value(ST(i+1), 0);
}
} else
csa_attrs = 0;
err = csa_add_calendar((CSA_session_handle)NULL, &u, (items-1)/2, csa_attrs, NULL);
if (csa_attrs)
free(csa_attrs);
if (err)
CsaCroak("add_calendar", err);
}
Calendar::CSA::Session
logon(service=0, user=0, password=0, charset=0)
char * service
SV * user
char * password
char * charset
CODE:
{
Calendar__CSA__Session session = safe_calloc(sizeof(struct Calendar__CSA__Session_t),1);
CSA_return_code ret;
CSA_calendar_user cu;
if (service && !strlen(service))
service = 0;
ret =
csa_logon(service,
SvCSA_calendar_user(user, &cu),
password,
charset,
"-//XAPIA/CSA/VERSION1/NONSGML CSA Version 1//EN",
&session->session,
NULL);
session->iso_times = 1;
if (ret != CSA_SUCCESS)
{
free(session);
CsaCroak("logon", ret);
}
session->connected = 1;
RETVAL = session;
}
OUTPUT:
RETVAL
void
list_calendars(service=0)
char * service
PPCODE:
{
CSA_calendar_user *result;
CSA_uint32 number;
int err,i;
SV ** s;
HV * u;
number = 0;
err = csa_list_calendars(service, &number, &result, NULL);
if (err)
CsaCroak("list_calendars", err);
if (result) {
for(i=0;i<number;i++) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVpv(result[i].calendar_address,0)));
}
csa_free(result);
}
}
int
accept_numeric_enumerations(set=&sv_undef)
SV * set
CODE:
{
RETVAL = Csa_accept_numeric_enumerations;
if (set && SvOK(set))
Csa_accept_numeric_enumerations = SvTRUE(set);
}
OUTPUT:
RETVAL
int
generate_numeric_enumerations(set=&sv_undef)
SV * set
CODE:
{
RETVAL = Csa_generate_numeric_enumerations;
if (set && SvOK(set))
Csa_generate_numeric_enumerations = SvTRUE(set);
}
OUTPUT:
RETVAL
MODULE = Calendar::CSA PACKAGE = Calendar::CSA::Session
void
DESTROY(session)
Calendar::CSA::Session session
CODE:
if (session->connected)
csa_logoff(session->session, NULL);
free(session);
void
logoff(session)
Calendar::CSA::Session session
CODE:
{
int error = csa_logoff(session->session, NULL);
if (error != CSA_SUCCESS)
CsaCroak("logoff", error);
session->connected = 0;
}
OUTPUT:
int
short_entry_names(session, set=&sv_undef)
Calendar::CSA::Session session
SV * set
CODE:
{
RETVAL = session->shorten;
if (set && SvOK(set))
session->shorten = SvTRUE(set);
}
OUTPUT:
RETVAL
int
unix_times(session, set=&sv_undef)
Calendar::CSA::Session session
SV * set
CODE:
{
RETVAL = !session->iso_times;
if (set && SvOK(set))
session->iso_times = !SvTRUE(set);
}
OUTPUT:
RETVAL
void
look_up(session, users, flags=0)
Calendar::CSA::Session session
SV * users
SV * flags
PPCODE:
{
CSA_calendar_user user, *result;
CSA_uint32 number;
int err,i;
SvCSA_calendar_user(users, &user);
number = 1;
err = csa_look_up(session->session, &user, SvCSA_LOOKUP(flags), &number, &result, NULL);
if (err)
CsaCroak("look_up", err);
for(i=0;i<number;i++) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVCSA_calendar_user(result+i)));
}
csa_free(result);
}
void
query_configuration(session, item)
Calendar::CSA::Session session
SV * item
PPCODE:
{
CSA_calendar_user user, *result;
CSA_uint32 number;
int err=0,i;
i = SvOpt(item, "configuration item", configs);
switch (i) {
case CSA_CONFIG_CHARACTER_SET:
{
char ** data;
err = csa_query_configuration(session->session, CSA_CONFIG_CHARACTER_SET, (void**)&data, NULL);
if (err) goto done;
csa_free(data);
while (data && *data) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVpv(*data, 0)));
data++;
}
break;
}
case CSA_CONFIG_LINE_TERM:
{
CSA_enum data;
err = csa_query_configuration(session->session, i, (void**)&data, NULL);
if (err) goto done;
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVCSA_LINE_TERM(data)));
break;
}
case CSA_CONFIG_DEFAULT_SERVICE:
case CSA_CONFIG_DEFAULT_USER:
case CSA_CONFIG_VER_IMPLEM:
case CSA_CONFIG_VER_SPEC:
{
CSA_string data;
err = csa_query_configuration(session->session, i, (void**)&data, NULL);
if (err) goto done;
EXTEND(sp, 1);
PUSHs(sv_2mortal(data ? newSVpv(data,0) : newSVsv(&sv_undef)));
csa_free(data);
break;
}
case CSA_CONFIG_REQ_PASSWORD:
case CSA_CONFIG_REQ_SERVICE:
case CSA_CONFIG_REQ_USER:
{
CSA_enum data;
err = csa_query_configuration(session->session, i, (void**)&data, NULL);
if (err) goto done;
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVCSA_REQUIRED(data)));
break;
}
case CSA_CONFIG_UI_AVAIL:
{
CSA_boolean data;
err = csa_query_configuration(session->session, i, (void**)&data, NULL);
if (err) goto done;
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSViv(data)));
break;
}
default:
croak("unhandled configuration query");
}
done:
if (err)
CsaCroak("query_configuration", err);
}
void
list_calendar_attributes(session)
Calendar::CSA::Session session
PPCODE:
{
CSA_attribute_reference *result;
CSA_uint32 number;
int err,i;
SV ** s;
HV * u;
number = 0;
err = csa_list_calendar_attributes(session->session, &number, &result, NULL);
if (err)
CsaCroak("list_calendar_attributes", err);
if (result) {
for(i=0;i<number;i++) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVpv(shorten(result[i], session->shorten),0)));
}
csa_free(result);
}
}
void
read_calendar_attributes(session, ...)
Calendar::CSA::Session session
PPCODE:
{
int i, j, err;
int flags=0;
CSA_uint32 count;
CSA_attribute * result;
CSA_attribute_reference * csa_names;
if (items>1) {
csa_names = safe_calloc(sizeof(CSA_attribute_reference)*(items-1),1);
for(i=1;i<items;i++)
csa_names[i-1] = lengthen(SvPV(ST(i), na));
} else {
csa_names = 0;
}
err = csa_read_calendar_attributes(session->session, items-1, csa_names, &count, &result, NULL);
if (csa_names)
free(csa_names);
if (err)
CsaCroak("read_calendar_attributes", err);
if (result) {
for(i=0;i<count;i++) {
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSVpv(shorten(result[i].name,session->shorten), 0)));
PUSHs(sv_2mortal(newSVCSA_attribute_value(result[i].value, session->shorten, session->iso_times)));
}
csa_free(result);
}
}
void
read_next_reminder(session, given_time, ...)
Calendar::CSA::Session session
SV * given_time
PPCODE:
{
int i, j, err;
int flags=0;
CSA_uint32 count;
CSA_reminder_reference * result;
CSA_attribute_reference * csa_names;
if (items>1) {
csa_names = safe_calloc(sizeof(CSA_attribute_reference)*(items-1),1);
for(i=1;i<items;i++)
csa_names[i-1] = SvPV(ST(i), na);
} else {
csa_names = 0;
}
err = csa_read_next_reminder(session->session, items-1, csa_names, SvISO_date_time(given_time,0), &count, &result, NULL);
if (csa_names)
free(csa_names);
if (err)
CsaCroak("read_next_reminder", err);
if (result) {
for(i=0;i<count;i++) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVCSA_reminder_reference(result+i, session, ST(0))));
}
csa_free(result);
}
}
void
update_calendar_attributes(session, ...)
Calendar::CSA::Session session
CODE:
{
int i,j, err;
CSA_attribute * csa_attrs;
if ((items-1)%2)
croak("attributes must be paired names and values");
if (items>1) {
csa_attrs = safe_calloc(sizeof(CSA_attribute)*((items-1)/2), 1);
for(j=0,i=1;i<items;j++,i+=2) {
csa_attrs[j].name = lengthen(SvPV(ST(i),na));
csa_attrs[j].value = SvCSA_attribute_value(ST(i+1), 0);
}
} else
csa_attrs = 0;
err = csa_update_calendar_attributes(session->session, items-1, csa_attrs, NULL);
if (csa_attrs)
free(csa_attrs);
if (err)
CsaCroak("update_calendar_attributes", err);
}
void
add_calendar(session, user, ...)
Calendar::CSA::Session session
SV * user
CODE:
{
int i, j, err;
CSA_calendar_user u;
CSA_attribute * csa_attrs;
if ((items-2)%2)
croak("attributes must be paired names and values");
SvCSA_calendar_user(user, &u);
if (items>2) {
csa_attrs = safe_calloc(sizeof(CSA_attribute)*((items-2)/2), 1);
for(j=0,i=2;i<items;j++,i+=2) {
csa_attrs[j].name = lengthen(SvPV(ST(i),na));
csa_attrs[j].value = SvCSA_attribute_value(ST(i+1), 0);
}
} else
csa_attrs = 0;
err = csa_add_calendar(session->session, &u, (items-2)/2, csa_attrs, NULL);
if (csa_attrs)
free(csa_attrs);
if (err)
CsaCroak("add_calendar", err);
}
void
free_time_search(session, range, duration, calendar,...)
Calendar::CSA::Session session
SV * range
SV * duration
SV * calendar
PPCODE:
{
int i, j, err;
CSA_uint32 count;
CSA_free_time * result;
CSA_calendar_user * csa_users;
if (items>3) {
csa_users = safe_malloc(sizeof(CSA_calendar_user)*(items-3));
for(i=3;i<items;i++)
SvCSA_calendar_user(ST(i), &csa_users[i-3]);
} else
csa_users = 0;
err = csa_free_time_search(session->session, SvISO_date_time_range(range,0), SvISO_time_duration(duration,0), items-3, csa_users, &result, NULL);
if (csa_users)
free(csa_users);
if (err)
CsaCroak("free_time_search", err);
if (result) {
for(i=0;i<result->number_free_time_data;i++) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newSVISO_date_time(result->free_time_data[i], 0)));
}
csa_free(result);
}
}
void
delete_calendar(session)
Calendar::CSA::Session session
CODE:
{
int err = csa_delete_calendar(session->session, NULL);
if (err)
CsaCroak("delete_calendar", err);
}
int
register_callback(session, mode, callback, ...)
Calendar::CSA::Session session
SV * mode
SV * callback
CODE:
{
int i;
int flags=0;
AV * args;
if (SvROK(mode) && (SvTYPE(SvRV(mode)) == SVt_PVAV)) {
args = (AV*)SvRV(mode);
for (i=0;i<=av_len(args);i++)
flags |= SvCSA_callback_mode(*av_fetch(args, i, 0));
} else {
flags = SvCSA_callback_mode(mode);
}
i = csa_register_callback(session->session, flags, callback_handler, (void*)(max_callback+1), NULL);
}
void
x_process_updates(session)
Calendar::CSA::Session session
CODE:
/*csa_x_process_updates(session->session);*/
Calendar::CSA::Entry
add_entry(session, ...)
Calendar::CSA::Session session
CODE:
{
int i, j = 0, err;
CSA_uint32 count;
CSA_attribute * result;
CSA_entry_handle new_entry;
CSA_attribute * csa_attrs;
Calendar__CSA__Entry entry;
if ((items-1)%2)
croak("attributes must be paired names and values");
if (items>1) {
csa_attrs = safe_calloc(sizeof(CSA_attribute)*((items-1)/2), 1);
for(j=0,i=1;i<items;j++,i+=2) {
csa_attrs[j].name = lengthen(SvPV(ST(i),na));
csa_attrs[j].value = SvCSA_attribute_value(ST(i+1), 0);
}
} else
csa_attrs = 0;
/*for(i=0;i<j;i++) {
char c;
fprintf(stderr, "attribute %d name is %s\n", i, csa_attrs[i].name);
fprintf(stderr, "attribute %d value is %d\n", i, csa_attrs[i].value);
c = *(char*)csa_attrs[i].value;
}*/
err = csa_add_entry(session->session, j, csa_attrs, &new_entry, NULL);
if (csa_attrs)
free(csa_attrs);
if (err)
CsaCroak("add_entry", err);
entry = safe_malloc(sizeof(struct Calendar__CSA__Entry_t));
entry->session_sv = newRV(SvRV(ST(0)));
entry->session = session;
entry->entry = new_entry;
RETVAL = entry;
}
OUTPUT:
RETVAL
void
list_entries(session, ...)
Calendar::CSA::Session session
PPCODE:
{
int i, j=0, err;
int flags=0;
CSA_uint32 count;
CSA_entry_handle *new_entries;
CSA_attribute * csa_attrs;
CSA_enum * csa_matches;
Calendar__CSA__EntryList entrylist;
if ((items-1)%2)
croak("attributes must be paired names and values");
if (items>1) {
csa_attrs = safe_calloc(sizeof(CSA_attribute)*((items-1)/2), 1);
csa_matches = safe_calloc(sizeof(CSA_enum)*((items-1)/2), 1);
for(j=0,i=1;i<items;j++,i+=2) {
SV * r;
csa_matches[j] = CSA_MATCH_ANY;
csa_attrs[j].name = lengthen(SvPV(ST(i),na));
csa_attrs[j].value = SvCSA_attribute_value(ST(i+1), 0);
r = ST(i+1);
if (r && SvOK(r) && SvRV(r) && (SvTYPE(SvRV(r))==SVt_PVHV)) {
SV ** s = hv_fetch((HV*)SvRV(r), "match", 5, 0);
if (s)
if (SvOK(*s))
csa_matches[j] = SvCSA_MATCH(*s);
}
}
} else {
csa_attrs = 0;
csa_matches = 0;
}
#ifdef CSA_DEBUG
for(i=0;i<j;i++) {
char *c;
fprintf(stderr, "attribute %d name is %s\n", i, csa_attrs[i].name);
fprintf(stderr, "attribute %d value is %d\n", i, csa_attrs[i].value);
fprintf(stderr, "attribute %d match is %s\n", i, SvPV(newSVCSA_MATCH(csa_matches[i]),na));
/* hack alert */
c = csa_attrs[i].value->item.string_value;
if (isascii(*c))
{
printf("\t%s\n", c);
}
}
#endif
err = csa_list_entries(session->session, j, csa_attrs, csa_matches, &count, &new_entries, NULL);
if (err)
CsaCroak("list_entries", err);
if (csa_attrs)
free(csa_attrs);
if (csa_matches)
free(csa_matches);
if (new_entries) {
SV * result;
entrylist = safe_malloc(sizeof(struct Calendar__CSA__EntryList_t));
entrylist->count = count;
entrylist->list = new_entries;
entrylist->session_sv = newRV(SvRV(ST(0)));
entrylist->session = session;
result = sv_newmortal();
sv_setref_pv(result, "Calendar::CSA::EntryList",
(void *)entrylist);
XPUSHs(result);
}
}
MODULE = Calendar::CSA PACKAGE = Calendar::CSA::EntryList
void
DESTROY(entrylist)
Calendar::CSA::EntryList entrylist
CODE:
SvREFCNT_dec(entrylist->session_sv);
if (entrylist->list)
csa_free(entrylist->list);
free(entrylist);
void
free(entrylist)
Calendar::CSA::EntryList entrylist
CODE:
if (entrylist->list)
csa_free(entrylist->list);
entrylist->list = 0;
AV *
entries(entrylist)
Calendar::CSA::EntryList entrylist
PPCODE:
{
int i;
Calendar__CSA__Entry entry;
SV *result;
if (!entrylist->list)
croak("Cannot retrieve entries from a freed EntryList");
for(i=0;i<entrylist->count;i++) {
entry = safe_malloc(sizeof(struct Calendar__CSA__Entry_t));
entry->session_sv = newRV(SvRV(entrylist->session_sv));
entry->session = entrylist->session;
entry->entry = entrylist->list[i];
result = sv_newmortal();
sv_setref_pv(result, "Calendar::CSA::Entry",
(void*)entry);
XPUSHs(result);
}
}
MODULE = Calendar::CSA PACKAGE = Calendar::CSA::Entry
void
DESTROY(entry)
Calendar::CSA::Entry entry
CODE:
SvREFCNT_dec(entry->session_sv);
free(entry);
void
delete_entry(entry, scope)
Calendar::CSA::Entry entry
SV * scope
CODE:
{
int err;
err = csa_delete_entry(entry->session->session, entry->entry, SvCSA_SCOPE(scope), NULL);
if (err)
CsaCroak("delete_entry", err);
}
void
read_entry_attributes(entry, ...)
Calendar::CSA::Entry entry
PPCODE:
{
int i, j, err;
CSA_uint32 count;
CSA_attribute * result;
CSA_attribute_reference * csa_names;
if (items>1) {
csa_names = safe_calloc(sizeof(CSA_attribute_reference)*(items-1),1);
for(i=1;i<items;i++)
csa_names[i-1] = lengthen(SvPV(ST(i), na));
} else {
csa_names = 0;
}
err = csa_read_entry_attributes(entry->session->session, entry->entry, items-1, csa_names, &count, &result, NULL);
if (csa_names)
free(csa_names);
if (err)
CsaCroak("read_entry_attributes", err);
if (result) {
EXTEND(sp, 2 * count);
for(i=0;i<count;i++) {
PUSHs(sv_2mortal(newSVpv(shorten(result[i].name,entry->session->shorten), 0)));
PUSHs(sv_2mortal(newSVCSA_attribute_value(result[i].value, entry->session->shorten, entry->session->iso_times)));
}
csa_free(result);
}
}
void
update_entry_attributes(entry, scope, propagate, ...)
Calendar::CSA::Entry entry
SV * scope
int propagate
CODE:
{
int i, j = 0, err;
CSA_uint32 count;
CSA_attribute * result;
CSA_entry_handle new_entry;
CSA_attribute * csa_attrs;
if ((items-3)%2)
croak("attributes must be paired names and values");
if (items>3) {
csa_attrs = safe_calloc(sizeof(CSA_attribute)*((items-3)/2),1);
for(j=0,i=3;i<items;i+=2,j++) {
csa_attrs[j].name = lengthen(SvPV(ST(i), na));
csa_attrs[j].value = SvCSA_attribute_value(ST(i+1), 0);
}
} else
csa_attrs = 0;
err = csa_update_entry_attributes(entry->session->session, entry->entry, SvCSA_SCOPE(scope), propagate, j, csa_attrs, &new_entry, NULL);
if (csa_attrs)
free(csa_attrs);
if (err)
CsaCroak("update_entry_attributes", err);
if (new_entry != 0)
entry->entry = new_entry;
}
void
list_entry_sequence(entry, range=&sv_undef, ...)
Calendar::CSA::Entry entry
SV * range
PPCODE:
{
int i, j, err;
int flags=0;
CSA_uint32 count;
CSA_attribute * result;
CSA_entry_handle *new_entries;
CSA_attribute csa_attr;
Calendar__CSA__EntryList entrylist;
err = csa_list_entry_sequence(entry->session->session, entry->entry, SvISO_date_time_range(range,0), &count, &new_entries, NULL);
if (err)
CsaCroak("list_entry_sequence", err);
if (new_entries) {
SV * result;
entrylist = safe_malloc(sizeof(struct Calendar__CSA__EntryList_t));
entrylist->count = count;
entrylist->list = new_entries;
entrylist->session_sv = newRV(SvRV(entry->session_sv));
entrylist->session = entry->session;
result = sv_newmortal();
sv_setref_pv(result,
"Calendar::CSA::EntryList",
(void *)entrylist);
XPUSHs(result);
}
}
BOOT:
callbacks = newAV();
callback_mode = newAV();
{
char buffer[54];
_csa_range_to_iso8601(time(0),time(0)+20,buffer);
}
( run in 0.730 second using v1.01-cache-2.11-cpan-71847e10f99 )