# documentation: http://code.google.com/apis/calendar/docs/2.0/developers_guide_protocol.html package require rest package require tls ::http::register https 443 [list ::tls::socket] set gcal(auth) { url https://www.google.com/accounts/ClientLogin method post req_args { Email: Passwd: } opt_args { source:tclrest } static_args { service cl } post_transform { regexp {Auth=(.*)\n} $result -> result return $result } } set gcal(all_calendars) { url http://www.google.com/calendar/feeds/default/allcalendars/%projection:full% headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } body required } set gcal(own_calendars) { url http://www.google.com/calendar/feeds/default/owncalendars/%projection:full% headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } } set gcal(new_calendar) { url http://www.google.com/calendar/feeds/default/owncalendars/full method post content-type application/atom+xml headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } } set gcal(edit_calendar) { url http://www.google.com/calendar/feeds/default/owncalendars/full/%calendar% method put content-type application/atom+xml headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } } set gcal(delete_calendar) { url http://www.google.com/calendar/feeds/default/owncalendars/full/%calendar% method delete headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } } set gcal(all_events) { url http://www.google.com/calendar/feeds/%user:default%/%visibility:private%/%projection:full% headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } } set gcal(new_event) { url http://www.google.com/calendar/feeds/default/private/full method post content-type application/atom+xml headers { Authorization {GoogleLogin auth=%token%} } opt_args { gsessionid: } } rest::create_interface gcal proc ::gcal::handle_redir {args} { if {[catch {eval $args} out]} { #puts "catch $out" if {[lindex $out 1] == "302"} { eval [linsert $args 1 -gsessionid [rest::parameters [lindex $out 2] gsessionid]] } else { return -code error $out } } } proc ::gcal::create_single_event_object {args} { set defaults [dict create \ text "" \ status confirmed \ where "" \ ] set args [lindex [::rest::parse_opts {} {title: start: end:} {text: status: where:} $args] 0] set args [dict merge $defaults $args] set event {} lappend event "" lappend event "" lappend event "[dict get $args title]" lappend event "[dict get $args text]" lappend event "" lappend event " " lappend event "" lappend event "" return [join $event \n] }