as3cf = $as3cf; } /** * Get the item handler key name. * * @return string */ public static function get_item_handler_key_name() { return static::$item_handler_key; } /** * The default options that should be used if none supplied. * * @return array */ public static function default_options() { return array(); } /** * Main entrypoint for handling an item. * * @param Item $as3cf_item * @param array $options * * @return boolean|WP_Error */ public function handle( Item $as3cf_item, array $options = array() ) { // Merge supplied option values into the defaults as long as supplied options are recognised. if ( empty( $options ) || ! is_array( $options ) ) { $options = array(); } $options = array_merge( $this->default_options(), array_intersect_key( $options, $this->default_options() ) ); try { /** * Filter fires before handling an action on an item, allows action to be cancelled. * * This is a generic handler filter that includes the handler's key name as the last param. * * @param bool $cancel Should the action on the item be cancelled? * @param Item $as3cf_item The item that the action is being handled for. * @param array $options Handler dependent options that may have been set for the action. * @param array $handler_key_name The handler's key name as per `Item_Handler::get_item_handler_key_name()`. * * @see Item_Handler::get_item_handler_key_name() */ $cancel = apply_filters( 'as3cf_pre_handle_item', /** * Filter fires before handling an action on an item, allows action to be cancelled. * * This is a handler specific filter whose name ends with the handler's key name. * Format is `as3cf_pre_handle_item_{item-handler-key-name}`. * * Example filter names: * * as3cf_pre_handle_item_upload * as3cf_pre_handle_item_download * as3cf_pre_handle_item_remove-local * as3cf_pre_handle_item_remove-provider * as3cf_pre_handle_item_update-acl * * For a more generic filter, use `as3cf_pre_handle_item`. * * @param bool $cancel Should the action on the item be cancelled? * @param Item $as3cf_item The item that the action is being handled for. * @param array $options Handler dependent options that may have been set for the action. * * @see Item_Handler::get_item_handler_key_name() */ apply_filters( 'as3cf_pre_handle_item_' . static::get_item_handler_key_name(), false, $as3cf_item, $options ), $as3cf_item, $options, static::get_item_handler_key_name() ); } catch ( Exception $e ) { return $this->return_result( new WP_Error( $e->getMessage() ), $as3cf_item, $options ); } // Cancelled, let caller know that request was not handled. if ( false !== $cancel ) { // If something unexpected happened, let the caller know. if ( is_wp_error( $cancel ) ) { return $this->return_result( $cancel, $as3cf_item, $options ); } return $this->return_result( false, $as3cf_item, $options ); } $manifest = $this->pre_handle( $as3cf_item, $options ); if ( is_wp_error( $manifest ) ) { return $this->return_result( $manifest, $as3cf_item, $options ); } // Nothing to do, let caller know that request was not handled. if ( empty( $manifest ) || empty( $manifest->objects ) ) { return $this->return_result( false, $as3cf_item, $options ); } $result = $this->handle_item( $as3cf_item, $manifest, $options ); if ( is_wp_error( $result ) ) { return $this->return_result( $result, $as3cf_item, $options ); } $result = $this->post_handle( $as3cf_item, $manifest, $options ); return $this->return_result( $result, $as3cf_item, $options ); } /** * Process an Item and options to generate a Manifest for `handle_item`. * * @param Item $as3cf_item * @param array $options * * @return Manifest|WP_Error */ abstract protected function pre_handle( Item $as3cf_item, array $options ); /** * Perform action for Item using given Manifest. * * @param Item $as3cf_item * @param Manifest $manifest * @param array $options * * @return bool|WP_Error */ abstract protected function handle_item( Item $as3cf_item, Manifest $manifest, array $options ); /** * Process results of `handle_item` as appropriate. * * @param Item $as3cf_item * @param Manifest $manifest * @param array $options * * @return bool|WP_Error */ abstract protected function post_handle( Item $as3cf_item, Manifest $manifest, array $options ); /** * Helper to record errors and return them or optional supplied value. * * @param string|WP_Error $error_msg An error message or already constructed WP_Error. * @param mixed|null $return Optional return value instead of WP_Error. * * @return mixed|WP_Error */ protected function return_handler_error( $error_msg, $return = null ) { if ( is_wp_error( $error_msg ) ) { foreach ( $error_msg->get_error_messages() as $msg ) { AS3CF_Error::Log( $msg ); } } else { AS3CF_Error::log( $error_msg ); } if ( is_null( $return ) ) { return is_wp_error( $error_msg ) ? $error_msg : new WP_Error( 'exception', $error_msg ); } return $return; } /** * Fires a couple of actions to let interested parties know that a handler has returned a result. * * @param bool|WP_Error $result Result for the action, either handled (true/false), or an error. * @param Item $as3cf_item The item that the action was being handled for. * @param array $options Handler dependent options that may have been set for the action. * * @return bool|WP_Error */ private function return_result( $result, Item $as3cf_item, array $options ) { /** * Action fires after attempting to handle an action on an item. * * This is a handler specific action whose name ends with the handler's key name. * Format is `as3cf_post_handle_item_{item-handler-key-name}`. * * Example filter names: * * as3cf_post_handle_item_upload * as3cf_post_handle_item_download * as3cf_post_handle_item_remove-local * as3cf_post_handle_item_remove-provider * as3cf_post_handle_item_update-acl * * For a more generic filter, use `as3cf_post_handle_item`. * * @param bool|WP_Error $result Result for the action, either handled (true/false), or an error. * @param Item $as3cf_item The item that the action was being handled for. * @param array $options Handler dependent options that may have been set for the action. * * @see Item_Handler::get_item_handler_key_name() */ do_action( 'as3cf_post_handle_item_' . static::get_item_handler_key_name(), $result, $as3cf_item, $options ); /** * Action fires after attempting to handle an action on an item. * * This is a generic handler action that includes the handler's key name as the last param. * * @param bool|WP_Error $result Result for the action, either handled (true/false), or an error. * @param Item $as3cf_item The item that the action was being handled for. * @param array $options Handler dependent options that may have been set for the action. * @param array $handler_key_name The handler's key name as per `Item_Handler::get_item_handler_key_name()`. * * @see Item_Handler::get_item_handler_key_name() */ do_action( 'as3cf_post_handle_item', $result, $as3cf_item, $options, static::get_item_handler_key_name() ); return $result; } }