/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_frame_ProtocolHandler_idl__
#define __com_sun_star_frame_ProtocolHandler_idl__

#ifndef __com_sun_star_frame_XDispatchProvider_idl__
#include <com/sun/star/frame/XDispatchProvider.idl>
#endif

#ifndef __com_sun_star_lang_XInitialization_idl__
#include <com/sun/star/lang/XInitialization.idl>
#endif

//=============================================================================

 module com {  module sun {  module star {  module frame {

//=============================================================================
/** special dispatch provider registered for URL protocols

    <p>
    The generic dispatch mechanism on a <type>Frame</type>
    search for such registered protocol handler and use it if it agrees with
    the dispatched URL.
    </p>

    <p>
    Supported URLs must match follow format: <protocol scheme>:<protocol specific part>
    If a handler provides optional arguments ("?") or jump marks ("#") depends from his
    defintion and implementation. The generic dispatch provider will use registered
    URL pattern to detect right handler.
    </p>
 */
published service ProtocolHandler
{
        //-------------------------------------------------------------------------
        /** used from the generic dispatch mechanism of the frame, to ask ProtocolHandler
            for his agreement for the dispatched URL

        <p>
        Such asked handler can agree by returning itself or a special sub dispatch object, which
        can handle the given URL. Of course he can disagree with it by returning an empty reference.
        </p>
        */
        interface XDispatchProvider;

        //-------------------------------------------------------------------------
        /** initialize the new handler instance with some context informations

        <p>
        Sometimes it can be usefull for a handler object, to know something about the
        environment, in which it runs - especily the frame. For this case the generic
        code (which uses the handler) will ask for this optional interface and use it, if it exist.
        Following parameters are passed to the service:
        <ul>
        <li>sequence< any >[0] => the frame for which this ProtocolHandler was created [com.sun.star.frame.XFrame]</li>
        </ul>
        </p>

        <p>
        Please note: if this mechanism is used it seams not usefull (nor possible) to implement a ProtocolHandler
        as a singleton. Otherwhise the implementation can't distinguish between different environments
        and her corresponding dispatch requests.
        </p>
        */
        [optional] interface ::com::sun::star::lang::XInitialization;
};

//=============================================================================

}; }; }; };

#endif
