// Módulo de intercambio de mensajes entre usuarios
module Mensajes {
	interface comun {
		// Version de la aplicacion
		readonly attribute string version;

		// Nombre de usuario
		typedef string usuario;
		// Lista de usuarios
		typedef sequence<usuario> lista_usuarios;

		// Excepcion de usuario no presente
		exception ClienteNoPresente {usuario nombre;};

		struct alarma {
			unsigned short codigo;
			string mensaje;
		};
	}; 
	
	// Interfaz a implementar por el cliente
	interface cliente {
		// Función básica de recepcion de mensajes
		// Devuelve "true" ante recepcion correcta
		boolean recibeMensaje (in string mensaje);
		// Mensajes de aviso especiales del servidor
		boolean recibeAviso (in comun::alarma mensaje);
		// Mensajes directos a otros usuarios
		void enviaMensaje (in comun::usuario destino, in string mensaje);
	};

	// El operador es informado de accesos al servicio
	interface operador:cliente {
		boolean nuevaConexion(in string nombre);
	};

	// Interfaz a implementar por el servidor
	interface servidor {
		// Conexion de un operador
		string conectar_operador (in operador interfaz, in string clave);
		// Devuelve una cadena con el nombre del servidor
		string conectar (in cliente interfaz);
		// Desconecta un usuario del sistema
		boolean desconectar (in cliente interfaz);
		// Mira si un usuario esta conectado y recibe la interfaz al mismo
		cliente presente (in string nombre) raises (comun::ClienteNoPresente);
		// Devuelve una lista de los usuarios presentes en el sistema
		void listaUsuarios (out comun::lista_usuarios lista);
	};

};