class AgCalDAV::Client

Attributes

host[RW]
password[RW]
port[RW]
ssl[RW]
url[RW]
user[RW]

Public Class Methods

new( data ) click to toggle source
# File lib/agcaldav/client.rb, line 14
def initialize( data )
  unless data[:proxy_uri].nil?
    proxy_uri   = URI(data[:proxy_uri])
    @proxy_host = proxy_uri.host
    @proxy_port = proxy_uri.port.to_i
  end
  uri = URI(data[:uri])
  @host     = uri.host
  @port     = uri.port.to_i
  @url      = uri.path
  @user     = data[:user]
  @password = data[:password]
  @ssl      = uri.scheme == 'https'
end

Public Instance Methods

__create_http() click to toggle source
# File lib/agcaldav/client.rb, line 29
def __create_http
  if @proxy_uri.nil?
    http = Net::HTTP.new(@host, @port)
  else
    http = Net::HTTP.new(@host, @port, @proxy_host, @proxy_port)
  end
  if @ssl
    http.use_ssl = @ssl
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  http
end
add_alarm(tevent, altCal="Calendar") click to toggle source
# File lib/agcaldav/client.rb, line 146
def add_alarm tevent, altCal="Calendar"

end
create_event(event) click to toggle source
# File lib/agcaldav/client.rb, line 103
def create_event event
  c = Calendar.new
  c.events = []
  uuid = UUID.new.generate
  raise DuplicateError if entry_with_uuid_exists?(uuid)
  c.event do
    uid           uuid 
    dtstart       DateTime.parse(event[:start])
    dtend         DateTime.parse(event[:end])
    categories    event[:categories]# Array
    contacts       event[:contacts] # Array
    attendees      event[:attendees]# Array
    duration      event[:duration]
    summary       event[:title]
    description   event[:description]
    klass         event[:accessibility] #PUBLIC, PRIVATE, CONFIDENTIAL
    location      event[:location]
    geo_location  event[:geo_location]
    status        event[:status]
  end
  cstring = c.to_ical
  res = nil
  http = Net::HTTP.new(@host, @port)
  __create_http.start { |http|
    req = Net::HTTP::Put.new("#{@url}/#{uuid}.ics")
    req['Content-Type'] = 'text/calendar'
    req.basic_auth @user, @password
    req.body = cstring
    res = http.request( req )
  }
  errorhandling res
  find_event uuid
end
create_todo(todo) click to toggle source
# File lib/agcaldav/client.rb, line 174
def create_todo todo
  c = Calendar.new
  uuid = UUID.new.generate
  raise DuplicateError if entry_with_uuid_exists?(uuid)
  c.todo do
    uid           uuid 
    start         DateTime.parse(todo[:start])
    duration      todo[:duration]
    summary       todo[:title]
    description   todo[:description]
    klass         todo[:accessibility] #PUBLIC, PRIVATE, CONFIDENTIAL
    location      todo[:location]
    percent       todo[:percent]
    priority      todo[:priority]
    url           todo[:url]
    geo           todo[:geo_location]
    status        todo[:status]
  end
  c.todo.uid = uuid
  cstring = c.to_ical
  res = nil
  http = Net::HTTP.new(@host, @port)
  __create_http.start { |http|
    req = Net::HTTP::Put.new("#{@url}/#{uuid}.ics")
    req['Content-Type'] = 'text/calendar'
    req.basic_auth @user, @password
    req.body = cstring
    res = http.request( req )
  }
  errorhandling res
  find_todo uuid
end
delete_event(uuid) click to toggle source
# File lib/agcaldav/client.rb, line 88
def delete_event uuid
  res = nil
  __create_http.start {|http|
    req = Net::HTTP::Delete.new("#{@url}/#{uuid}.ics")
    req.basic_auth @user, @password
    res = http.request( req )
  }
  errorhandling res
  if res.code.to_i == 200
    return true
  else
    return false
  end
end
find_event(uuid) click to toggle source
# File lib/agcaldav/client.rb, line 70
def find_event uuid
  res = nil
  __create_http.start {|http|
    req = Net::HTTP::Get.new("#{@url}/#{uuid}.ics")
    req.basic_auth @user, @password
    res = http.request( req )
  }  
  errorhandling res
  r = Icalendar.parse(res.body)
  unless r.empty?
    r.first.events.first 
  else
    return false
  end

  
end
find_events(data) click to toggle source
# File lib/agcaldav/client.rb, line 42
def find_events data
  result = ""
  events = []
  res = nil
  __create_http.start {|http|
    req = Net::HTTP::Report.new(@url, initheader = {'Content-Type'=>'application/xml'} )
    req.basic_auth @user, @password
    req.body = AgCalDAV::Request::ReportVEVENT.new(DateTime.parse(data[:start]).strftime("%Y%m%dT%H%M"), 
                                                   DateTime.parse(data[:end]).strftime("%Y%m%dT%H%M") ).to_xml
    res = http.request(req)
  } 
    errorhandling res
    result = ""
    xml = REXML::Document.new(res.body)
    REXML::XPath.each( xml, '//c:calendar-data/', {"c"=>"urn:ietf:params:xml:ns:caldav"} ){|c| result << c.text}
    r = Icalendar.parse(result)      
    unless r.empty?
      r.each do |calendar|
        calendar.events.each do |event|
          events << event
        end
      end
      events
    else
      return false
    end
end
find_todo(uuid) click to toggle source
# File lib/agcaldav/client.rb, line 158
def find_todo uuid
  res = nil
  __create_http.start {|http|
    req = Net::HTTP::Get.new("#{@url}/#{uuid}.ics")
    req.basic_auth @user, @password
    res = http.request( req )
  }  
  errorhandling res
  r = Icalendar.parse(res.body)
  r.first.todos.first
end
format() click to toggle source
# File lib/agcaldav/client.rb, line 10
def format
  @format ||= Format::Debug.new
end
format=( fmt ) click to toggle source
# File lib/agcaldav/client.rb, line 6
def format=( fmt )
  @format = fmt
end
update_event(event) click to toggle source
# File lib/agcaldav/client.rb, line 137
def update_event event
  #TODO... fix me
  if delete_event event[:uid]
    create_event event
  else
    return false
  end
end

Private Instance Methods

entry_with_uuid_exists?(uuid) click to toggle source
# File lib/agcaldav/client.rb, line 222
def entry_with_uuid_exists? uuid
  res = nil
  __create_http.start {|http|
    req = Net::HTTP::Get.new("#{@url}/#{uuid}.ics")
    req.basic_auth @user, @password
    res = http.request( req )
  }      
  if res.body.empty?
    return false
  else
    return true
  end
end
errorhandling(response) click to toggle source
# File lib/agcaldav/client.rb, line 236
def  errorhandling response   
  raise AuthenticationError if response.code.to_i == 401
  raise NotExistError if response.code.to_i == 410 
  raise APIError if response.code.to_i >= 500
end