#! /usr/bin/python
# - coding: utf-8 -*-

# Copyright (c) 2007-2008 Renato Chencarek. All rights reserved.
#
# Author: Renato Chencarek <renato.chencarek@gmail.com>
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


import sys
import os
import feedparser

import dbus
import dbus.service
import dbus.glib

import gtk
import gobject
import hildon

#timeout = None
main_loop = gobject.MainLoop()
#rfd, wfd = os.pipe()

def to_utf8(text):
    """Best-effort converting an arbitrary string to byte string in UTF-8"""

    if type(text) is unicode:
        return text.encode("utf-8")

    encoding_lst = [("utf-8",), ("latin-1",), ("utf-8", "replace")]
    for encoding in encoding_lst:
        try:
            return text.decode(*encoding).encode("utf-8")
        except:
            pass
    return "???"   # Return something indicating we had problem w/ encoding

class FeedDialog(gtk.Dialog):
    feeds = ['TestTest A custom newsreader', 'TestTest Another Newsreader',  'TestTest Podcast app', 'RSS feed reader']

    def __init__(self, parent=None):
        gtk.Dialog.__init__(self, 'Maemo Feed Handler', parent)
        self.set_has_separator(False)
        self.vbox.set_spacing(6)

        label = gtk.Label()
        label.set_markup('<b>Add this feed to:</b>' + ' ' * 12)
        label.set_justify(gtk.JUSTIFY_LEFT)
        label.set_padding(8, 4)
        self.vbox.pack_start(label, expand=False)

        alignment = gtk.Alignment(xalign=0.2)
        vbox = gtk.VBox(spacing=6)
        vbox.set_border_width(10)

        self.radios = {}
        last = None
        for feed in FeedDialog.feeds:
            last = gtk.RadioButton(last, feed)
            self.radios[feed] = last
            vbox.pack_start(last)

        alignment.add(vbox)
        self.vbox.pack_start(alignment)

        self.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                         gtk.STOCK_OK, gtk.RESPONSE_OK)

        self.show_all()

    def set_feed(self, feed_id):
        self.radios[feed[feed_id]].set_active(True)

    def get_feed(self):
        for radio in self.radios.keys():
            if self.radios[radio].get_active():
                return radio

        return None


#class ProgressDialog(gtk.Dialog):
#
#    def __init__(self, parent=None):
#        gtk.Dialog.__init__(self, 'Downloading feed', parent)
#        self.vbox.set_spacing(6)
#        self.running = False
#
#        self.progress = gtk.ProgressBar()
#        self.progress.pulse()
#        self.progress.set_size_request(360, -1)
#
#        self.vbox.pack_start(self.progress)
#
#        self.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
#        self.action_area.set_layout(0)
#        self.show_all()
#
#    def __pulse(self):
#        self.progress.pulse()
#        return self.running
#
#    def stop(self):
#        self.running = False
#
#    def run(self):
#        self.running = True
#        gobject.timeout_add(100, self.__pulse)
#        return gtk.Dialog.run(self)
#
#def stop_loading_dialog(fd, cond, fhandler):
#    r = os.read(fd, 1)
#    fhandler.loading.stop()
#    fhandler.loading.destroy()
#    return False
#
#def create_progress_dialog(window, cancel_cb=None):
#    dialog = ProgressDialog(window)
#
#    def _distract_response(dialog, response_id):
#        global timeout
#        timeout = 0.00001
#        dialog.stop()
#        dialog.destroy()
#
#    if not cancel_cb:
#        dialog.connect('response', _distract_response)
#    else:
#        dialog.connect('response', cancel_cb)
#
#    return dialog

def show_feed_type_dialog(window):
    dialog = FeedDialog(window)
    response = dialog.run()
    dialog.destroy()

    if response == gtk.RESPONSE_OK:
        return dialog.get_feed()
    else:
        return None


class FeedHandler(dbus.service.Object):
    DBUS_SERVICE_NAME = "org.maemo.garage.feedhandler"
    DBUS_OBJ_PATH     = "/org/maemo/garage/feedhandler"
    DBUS_IFACE        = "org.maemo.garage.feedhandler"

    def __init__(self):
        self.session_bus = dbus.SessionBus()
        self.bn = dbus.service.BusName(self.DBUS_SERVICE_NAME,
                                       bus=self.session_bus)

        dbus.service.Object.__init__(self, self.bn, self.DBUS_OBJ_PATH)

    def add_podcast(self, url):
        contents = feedparser.parse(url)
        data = contents.feed

        title = to_utf8(data.title)
        if data.has_key("description"):
            desc = to_utf8(data.description)
        else:
            desc = ""
	
	return (title, desc)

    @dbus.service.method(DBUS_IFACE)
    def mime_open(self, url):
        #global error_msg, timeout, main_loop
	global main_loop

        self.window = hildon.Window()
        self.window.connect('destroy', gtk.main_quit)
        feed_type = show_feed_type_dialog(self.window)

        if not feed_type:
            main_loop.quit()
            return
        elif "RSS" in feed_type.upper():
            service_name = "com.nokia.osso_rss_feed_reader_refresh"
            obj_path = "/com/nokia/osso_rss_feed_reader_refresh"
            session_bus = dbus.SessionBus()
            obj = session_bus.get_object(service_name, obj_path)
            iface = dbus.Interface(obj, service_name)
            iface.mime_open(url)
            main_loop.quit()
            return

        #title, desc = self.add_podcast(url)
	msg = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL,
				gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
				url + '\nadd to: ' + feed_type)
	msg.run()
	msg.destroy()

#        self.loading = create_progress_dialog(self.window, None)
#        tag = gobject.io_add_watch(rfd, gobject.IO_IN, stop_loading_dialog, self)
#
#        handler.setDaemon(True)
#        handler.start()
#
#        self.loading.run()
#
#        gobject.source_remove(tag)
#
#        handler.join(timeout)
        main_loop.quit()

if __name__ == "__main__":
    gtk.gdk.threads_init()

    f = FeedHandler()

    if len(sys.argv) == 2:
        gobject.timeout_add(100, f.mime_open, sys.argv[1])

    main_loop.run()


