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

"""
authored by:  RaNaN

socket for connecting to the core's server

"""
import asynchat
import asyncore
import socket
import threading

from ClientHandler import ClientHandler
from RequestObject import RequestObject

class SocketThread(threading.Thread):
    def __init__(self, adress, port, pw, client):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((adress, port))
        self.socket = ClientSocket(sock, pw, client)
        self.start()

    def run(self):
        asyncore.loop()
        print "loop closed"

    def push_exec(self, function, args=[]):
        obj = RequestObject()
        obj.command = "exec"
        obj.function = function
        obj.args = args
        self.push(obj)

    def push(self, obj):
        self.socket.push_obj(obj)


class ClientSocket(asynchat.async_chat):
    def __init__(self, sock, pw, client):
        asynchat.async_chat.__init__(self, sock)
        self.data = ""
        self.handler = ClientHandler(client, pw)
        self.set_terminator("\n")
        #self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

    def handle_close(self):
        print "Disconnected from", self.getpeername()
        self.close()

    def collect_incoming_data(self, data):
        self.data += data

    def found_terminator(self):
        self.handler.proceed(self.data)
        self.data = ""

    def push_obj(self, obj):
        string = self.handler.encrypt(obj)
        self.push(string)