diff --git a/res/res_calendar.c b/res/res_calendar.c index bc3689e8b06a9e6aaee78056a681c7d21244aa7f..01f5f95c118ef1f8834fa11782b703d0ca396494 100644 --- a/res/res_calendar.c +++ b/res/res_calendar.c @@ -54,7 +54,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <syntax> <parameter name="calendar" required="true" /> </syntax> - <description> + <description> <para>Check the specified calendar's current busy status.</para> </description> <see-also> @@ -186,6 +186,18 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <description> <para>Example: CALENDAR_WRITE(calendar,field1,field2,field3)=val1,val2,val3</para> <para>The field and value arguments can easily be set/passed using the HASHKEYS() and HASH() functions</para> + <variablelist> + <variable name="CALENDAR_SUCCESS"> + <para>The status of the write operation to the calendar</para> + <value name="1" > + The event was successfully written to the calendar. + </value> + <value name="0" > + The event was not written to the calendar due to network issues, permissions, etc. + </value> + </variable> + </variablelist> + </description> <see-also> <ref type="function">CALENDAR_BUSY</ref> @@ -1361,7 +1373,7 @@ static int calendar_write_exec(struct ast_channel *chan, const char *cmd, char * if (!(val_dup = ast_strdup(value))) { ast_log(LOG_ERROR, "Could not allocate memory for values\n"); - return -1; + goto write_cleanup; } AST_STANDARD_APP_ARGS(fields, data); @@ -1434,6 +1446,11 @@ static int calendar_write_exec(struct ast_channel *chan, const char *cmd, char * } write_cleanup: + if (ret) { + pbx_builtin_setvar_helper(chan, "CALENDAR_SUCCESS", "0"); + } else { + pbx_builtin_setvar_helper(chan, "CALENDAR_SUCCESS", "1"); + } if (cal) { cal = unref_calendar(cal); } diff --git a/res/res_calendar_caldav.c b/res/res_calendar_caldav.c index 14fce0ca7ebe391730ddd73f3b590cd1aba2a263..55fd4f7613194e5f5aab0ca139d69db0c80cfd80 100644 --- a/res/res_calendar_caldav.c +++ b/res/res_calendar_caldav.c @@ -125,6 +125,15 @@ static int auth_credentials(void *userdata, const char *realm, int attempts, cha return 0; } +static int debug_response_handler(void *userdata, ne_request *req, const ne_status *st) +{ + if (st->code < 200 || st->code > 299) { + ast_debug(1, "Unexpected response from server, %d: %s\n", st->code, st->reason_phrase); + return 0; + } + return 1; +} + static struct ast_str *caldav_request(struct caldav_pvt *pvt, const char *method, struct ast_str *req_body, struct ast_str *subdir, const char *content_type) { struct ast_str *response; @@ -145,17 +154,15 @@ static struct ast_str *caldav_request(struct caldav_pvt *pvt, const char *method snprintf(buf, sizeof(buf), "%s%s", pvt->uri.path, subdir ? ast_str_buffer(subdir) : ""); req = ne_request_create(pvt->session, method, buf); - ne_add_response_body_reader(req, ne_accept_2xx, fetch_response_reader, &response); + ne_add_response_body_reader(req, debug_response_handler, fetch_response_reader, &response); ne_set_request_body_buffer(req, ast_str_buffer(req_body), ast_str_strlen(req_body)); ne_add_request_header(req, "Content-type", ast_strlen_zero(content_type) ? "text/xml" : content_type); ret = ne_request_dispatch(req); ne_request_destroy(req); - if (ret != NE_OK || !ast_str_strlen(response)) { - if (ret != NE_OK) { - ast_log(LOG_WARNING, "Unknown response to CalDAV calendar %s, request %s to %s: %s\n", pvt->owner->name, method, buf, ne_get_error(pvt->session)); - } + if (ret != NE_OK) { + ast_log(LOG_WARNING, "Unknown response to CalDAV calendar %s, request %s to %s: %s\n", pvt->owner->name, method, buf, ne_get_error(pvt->session)); ast_free(response); return NULL; } @@ -244,9 +251,9 @@ static int caldav_write_event(struct ast_calendar_event *event) ast_str_append(&body, 0, "%s", icalcomponent_as_ical_string(calendar)); ast_str_set(&subdir, 0, "%s%s.ics", pvt->url[strlen(pvt->url) - 1] == '/' ? "" : "/", event->uid); - response = caldav_request(pvt, "PUT", body, subdir, "text/calendar"); - - ret = 0; + if ((response = caldav_request(pvt, "PUT", body, subdir, "text/calendar"))) { + ret = 0; + } write_cleanup: if (body) { @@ -302,6 +309,10 @@ static struct ast_str *caldav_get_events_between(struct caldav_pvt *pvt, time_t response = caldav_request(pvt, "REPORT", body, NULL, NULL); ast_free(body); + if (response && !ast_str_strlen(response)) { + ast_free(response); + return NULL; + } return response; } diff --git a/res/res_calendar_exchange.c b/res/res_calendar_exchange.c index 4a2df1822c825e041a278d908bec6b807b9145bc..6c0982a63add1cb5f1a6b454e07f2ef25952e49f 100644 --- a/res/res_calendar_exchange.c +++ b/res/res_calendar_exchange.c @@ -505,9 +505,10 @@ static int exchangecal_write_event(struct ast_calendar_event *event) ast_verb(0, "\n\n%s\n\n", ast_str_buffer(body)); ast_str_set(&subdir, 0, "/Calendar/%s.eml", ast_str_buffer(uid)); - response = exchangecal_request(event->owner->tech_pvt, "PROPPATCH", body, subdir); + if ((response = exchangecal_request(event->owner->tech_pvt, "PROPPATCH", body, subdir))) { + ret = 0; + } - ret = 0; write_cleanup: if (uid) { ast_free(uid);