<?php
///////////////////////////////////////////////////////////////////////////

require_once 'lib/action_factory.php';
require_once 'lib/dune_exception.php';

///////////////////////////////////////////////////////////////////////////

class DefaultDunePluginFw extends DunePluginFw
{
	public static $plugin_class_name = null;
	public static $plugin_creator_info = '';

	///////////////////////////////////////////////////////////////////////

	public function create_plugin()
	{
		return new DefaultDunePluginFw::$plugin_class_name;
	}

	///////////////////////////////////////////////////////////////////////

	public function call_plugin($call_ctx_json)
	{
		return
			json_encode(
				$this->call_plugin_impl(
					json_decode($call_ctx_json)));
	}

	///////////////////////////////////////////////////////////////////////

	protected function call_plugin_impl($call_ctx)
	{
		static $plugin;

		if (is_null($plugin))
		{
			try
			{
				hd_print('Instantiating plugin...');
				$plugin = $this->create_plugin();
				hd_print('Plugin instance created.');
			}
			catch (Exception $e)
			{
				hd_print('Fatal Error! Can not instantiate plugin.');
				hd_print($e->getMessage());

				ControlFactory::add_multiline_label($defs, null, "\"{$e->getMessage()}\"\n\nПожалуйста, перезагрузите медиаплеер и повторите попытку.\nЕсли проблема повторится, то сообщите о ней разработчику" . (empty(self::$plugin_creator_info)? "." : ": " . self::$plugin_creator_info), 10);
				ControlFactory::add_vgap($defs, 40);
				ControlFactory::add_close_dialog_button($button_defs, 'ОK', 350);
				ControlFactoryExt::add_button_centered($defs, $button_defs, 1300);
				ControlFactory::add_vgap($defs, 10);
				return array (
					PluginOutputData::has_data => false,
					PluginOutputData::plugin_cookies => $call_ctx->plugin_cookies,
					PluginOutputData::is_error => true,
					PluginOutputData::error_action =>
						ActionFactorySafe::show_dialog(
							'Фатальная ошибка!',
							$defs,
							false,
							1300),
				);
			}
		}

		$out_data = null;

		try
		{
			$out_data = $this->invoke_operation($plugin, $call_ctx);
		}
		catch (DuneException $e)
		{
			hd_print("Error! " . $e->getMessage());
			return
				array
				(
					PluginOutputData::has_data => false,
					PluginOutputData::plugin_cookies => $call_ctx->plugin_cookies,
					PluginOutputData::is_error => true,
					PluginOutputData::error_action => $e->get_error_action()
				);
		}
		catch (Exception $e)
		{
			hd_print("Fatal Error! " . $e->getMessage());

			ControlFactory::add_multiline_label($defs, null, "Плагин сообщает:\n\"{$e->getMessage()}\"\n\nПожалуйста, перезагрузите медиаплеер и повторите попытку.\nЕсли проблема повторится, то сообщите о ней разработчику" . (empty(self::$plugin_creator_info)? "." : ": " . self::$plugin_creator_info), 10);
			ControlFactory::add_vgap($defs, 40);
			ControlFactory::add_close_dialog_button($button_defs, 'ОK', 350);
			ControlFactoryExt::add_button_centered($defs, $button_defs, 1300);
			ControlFactory::add_vgap($defs, 10);
			return array (
				PluginOutputData::has_data => false,
				PluginOutputData::plugin_cookies => $call_ctx->plugin_cookies,
				PluginOutputData::is_error => true,
				PluginOutputData::error_action =>
					ActionFactorySafe::show_dialog(
						'Фатальная ошибка!',
						$defs,
						false,
						1300),
			);
		}

		// Note: change_tv_favorites() may return NULL even if it's completed
		// successfully.

		$plugin_output_data = array
		(
			PluginOutputData::has_data => !is_null($out_data),
			PluginOutputData::plugin_cookies => $call_ctx->plugin_cookies,
			PluginOutputData::is_error => false,
			PluginOutputData::error_action => null
		);

		if ($plugin_output_data[PluginOutputData::has_data])
		{
			$plugin_output_data[PluginOutputData::data_type] =
				$this->get_out_type_code($call_ctx->op_type_code);

			$plugin_output_data[PluginOutputData::data] = $out_data;
		}

		return $plugin_output_data;
	}
}

///////////////////////////////////////////////////////////////////////////

DunePluginFw::$instance = new DefaultDunePluginFw();

///////////////////////////////////////////////////////////////////////////
?>
