# -*- coding: utf-8 -*-
#######################################################################################
#   Plinn - http://plinn.org                                                          #
#   Copyright (C) 2005-2009  Benoît PIN <benoit.pin@ensmp.fr>                         #
#                                                                                     #
#   This program 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.                            #
#                                                                                     #
#   This program 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 this program; if not, write to the Free Software                       #
#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.   #
#######################################################################################
""" provides utilities to raise / handle zope server shutdown events



"""

import asyncore
from zope.event import notify
from zope.component import getSiteManager
from events import ZopeShutdownEvent
from OFS.interfaces import IApplication

class ZopeShutdownDispatcher(asyncore.dispatcher):

	
	def __init__(self, app, map=None):
		asyncore.dispatcher.__init__(self, None, map)
		self.connected = False
		self.app = self._fileno = app
		self.add_channel()
	
	def close(self) :
		self.del_channel()

	def readable(self):
		return False

	def handle_read(self):
		return True

	def writable(self):
		return False

	def handle_write (self):
		return True
		
	def clean_shutdown_control(self, phase, time):
		asyncore.dispatcher.log_info(self, 'zope shutdown event raised at phase: %s' % phase, 'info')
		e = ZopeShutdownEvent(self.app, phase, time)
		notify(e)
		return e.veto
