# This file is part of EventGhost.
# Copyright (C) 2005 Lars-Peter Voss <bitmonster@eventghost.org>
# 
# EventGhost is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# EventGhost is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with EventGhost; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#
# $LastChangedDate: 2009-01-25 12:33:16 +0100 (So, 25 Jan 2009) $
# $LastChangedRevision: 799 $
# $LastChangedBy: Bitmonster $

import eg

eg.RegisterPlugin(
    name = "JBMedia LM Pro Remote Emulator",
    author = "Siutsch",
    version = "1.0." + "$LastChangedRevision: 001 $".split()[1],
    kind = "external",
    canMultiLoad = True,
    createMacrosOnAdd = True,
    description = "Control your JBMedia LightManagerPro over Ethernet.",
    help = "<i></i>",
)


ACTIONS = (
    ("Taste 01", "Taste 01", None, "KEY=1"),
    ("Taste 02", "Taste 02", None, "KEY=2"),
    ("Taste 03", "Taste 03", None, "KEY=3"),
    ("Taste 04", "Taste 04", None, "KEY=4"),
    ("Taste 05", "Taste 05", None, "KEY=5"),
    ("Taste 06", "Taste 06", None, "KEY=6"),
    ("Taste 07", "Taste 07", None, "KEY=7"),
    ("Taste 08", "Taste 08", None, "KEY=8"),
    ("Taste 09", "Taste 09", None, "KEY=9"),
    ("Taste 10", "Taste 10", None, "KEY=10"),
    ("Taste 11", "Taste 11", None, "KEY=11"),
    ("Taste 12", "Taste 12", None, "KEY=12"),
    ("Taste 13", "Taste 13", None, "KEY=13"),
    ("Taste 14", "Taste 14", None, "KEY=14"),
    ("Taste 15", "Taste 15", None, "KEY=15"),
    ("Taste 16", "Taste 16", None, "KEY=16"),
    ("Taste 17", "Taste 17", None, "KEY=17"),
    ("Taste 18", "Taste 18", None, "KEY=18"),
    ("Taste 19", "Taste 19", None, "KEY=19"),
    ("Taste 20", "Taste 20", None, "KEY=20"),
    ("Taste 21", "Taste 21", None, "KEY=21"),
    ("Taste 22", "Taste 22", None, "KEY=22"),
    ("Taste 23", "Taste 23", None, "KEY=23"),
    ("Taste 24", "Taste 24", None, "KEY=24"),
    ("Taste 25", "Taste 25", None, "KEY=25"),
    ("Taste 26", "Taste 26", None, "KEY=26"),
    ("Taste 27", "Taste 27", None, "KEY=27"),
    ("Taste 28", "Taste 28", None, "KEY=28"),
    ("Taste 29", "Taste 29", None, "KEY=29"),
    ("Taste 30", "Taste 30", None, "KEY=30"),
    ("Taste 31", "Taste 31", None, "KEY=31"),
    ("Taste 32", "Taste 32", None, "KEY=32"),
    ("Taste 33", "Taste 33", None, "KEY=33"),
    ("Taste 34", "Taste 34", None, "KEY=34"),
    ("Taste 35", "Taste 35", None, "KEY=35"),
    ("Taste 36", "Taste 36", None, "KEY=36"),
    ("Taste 37", "Taste 37", None, "KEY=37"),
    ("Taste 38", "Taste 38", None, "KEY=38"),
    ("Taste 39", "Taste 39", None, "KEY=39"),
    ("Taste 40", "Taste 40", None, "KEY=40"),
    ("Taste 41", "Taste 41", None, "KEY=41"),
    ("Taste 42", "Taste 42", None, "KEY=42"),
    ("Taste 43", "Taste 43", None, "KEY=43"),
    ("Taste 44", "Taste 44", None, "KEY=44"),
    ("Taste 45", "Taste 45", None, "KEY=45"),
    ("Taste 46", "Taste 46", None, "KEY=46"),
    ("Taste 47", "Taste 47", None, "KEY=47"),
    ("Taste 48", "Taste 48", None, "KEY=48"),
    ("Taste 49", "Taste 49", None, "KEY=49"),
    ("Taste 50", "Taste 50", None, "KEY=50"),
    ("Taste 51", "Taste 51", None, "KEY=51"),
    ("Taste 52", "Taste 52", None, "KEY=52"),
    ("Taste 53", "Taste 53", None, "KEY=53"),
    ("Taste 54", "Taste 54", None, "KEY=54"),
    ("Taste 55", "Taste 55", None, "KEY=55"),
    ("Taste 56", "Taste 56", None, "KEY=56"),
    ("Taste 57", "Taste 57", None, "KEY=57"),
    ("Taste 58", "Taste 58", None, "KEY=58"),
    ("Taste 59", "Taste 59", None, "KEY=59"),
    ("Taste 60", "Taste 60", None, "KEY=60"),
)

TIMEOUT = 1.5

# stolen from the standard library and added a timeout to the socket
import socket
from httplib import HTTPConnection

class MyHTTPConnection(HTTPConnection):
    
    def connect(self):
        """Connect to the host and port specified in __init__."""
        msg = "getaddrinfo returns an empty list"
        for res in socket.getaddrinfo(self.host, self.port, 0,
                                      socket.SOCK_STREAM):
            af, socktype, proto, canonname, sa = res
            try:
                self.sock = socket.socket(af, socktype, proto)
                self.sock.settimeout(TIMEOUT)
                if self.debuglevel > 0:
                    print "connect: (%s, %s)" % (self.host, self.port)
                self.sock.connect(sa)
            except socket.error, exc:
                if self.debuglevel > 0:
                    print 'connect fail:', (self.host, self.port)
                if self.sock:
                    self.sock.close()
                self.sock = None
                continue
            break
        if not self.sock:
            raise exc



class ActionPrototype(eg.ActionBase):
    
    def __call__(self):
        conn = MyHTTPConnection(self.plugin.host)
        try:
            conn.request("GET", self.plugin.connectString % self.value)
        except socket.timeout:
            raise self.Exceptions.DeviceNotFound
        conn.getresponse()
        conn.close()
        
        

class JBMedia(eg.PluginBase):
    
    def __init__(self):
        self.AddActionsFromList(ACTIONS, ActionPrototype)


    def __start__(self, host, useRcem=False):
        self.host = host
        if useRcem:
            self.connectString = "/control?%s&pass=password"
        else:
            self.connectString = "/control?%s&pass=password"
            
        
    def Configure(self, host="127.0.0.1", useRcem=True):
        panel = eg.ConfigPanel()
        hostCtrl = panel.TextCtrl(host)
        useRcemCtrl = panel.CheckBox(useRcem, 'Use "rcem" instead of "rcsim"')
        panel.AddLine("JBMedia Host:", hostCtrl)
        panel.AddLine(useRcemCtrl)        
        while panel.Affirmed():
            panel.SetResult(hostCtrl.GetValue(), useRcemCtrl.GetValue())
    
        