// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
//  File   : SALOME_PACOExtension.idl
//  Author : André RIBES, EDF

#ifndef _SALOME_PACOExtension_IDL_
#define _SALOME_PACOExtension_IDL_

/*! \file SALOME_PACOExtension.idl 
    \brief Interfaces for Parallel Component and Container using PaCO++
*/

#include "SALOME_Component.idl"
#include "DSC_Engines.idl"

module Engines
{
  interface Parallel_Component : Engines::EngineComponent {
    void send_parallel_proxy_object(in Object proxy_ref);
  };

  interface PACO_Container : Engines::Container {
    // Replicated Method used by the proxy to create
    // a PACO Component
    void create_paco_component_node_instance(in string registeredName,
					     in string proxy_containerName,
					     in long studyId) raises(SALOME::SALOME_Exception);

    void updateInstanceNumber();
  };

/*--------------------------------------------------------------------------------------------*/

  /*! \brief Interface of a Parallel_DSC component.
    This interface defines the operations needed to add a paco++ port 
    into a parallel DSC component.
  */
  interface Parallel_DSC : Engines::Superv_Component, Engines::Parallel_Component {

    /*!
      This operation gives the proxy node of a paco++ port to all the nodes.
      Only a node of the parallel component is going to add a proxy object 
      with an internal method.

      \param ref provides proxy port's reference.
      \param provides_port_name provides port's name.

      \see Engines_ParallelDSC_i::add_parallel_provides_proxy_port
     */
    void set_paco_proxy(in Object ref, 
			in string provides_port_name,
			in Ports::PortProperties port_prop);
			
  };  

  /*! \brief Interface of a Parallel_Salome_file
    This interface is used by parallel components and containers.
    It adds methods to enable to choose on which node of the parallel component the file has to 
    be received.
  */
  interface Parallel_Salome_file : Engines::Salome_file {

    /*!
      Set a number of node for the file. Default is the node 0.

      \param file_name name of the file.
      \param node_nbr node number where the file is.

      \exception raised if the file doesn't exist.
    */
    void setFileNode(in string file_name, in long node_nbr) raises (SALOME::SALOME_Exception);

    /*!
      Get the number of the node that actually managed the file.

      \param file_name name of managed file.

      \return node number of the file

      \exception raised if the file doesn't exist.
     */
    long getFileNode(in string file_name) raises (SALOME::SALOME_Exception);

    /*!
      This method update the state of file for the Parallel_Salome_file. 

      \param new_file the new state of file.
     */
    Engines::Container updateFile(in Engines::file new_file);

    /*!
      This method is used by the parallel implementation of recvFiles.

      \exception raised if the file cannot be ok.
     */
    void recvFiles_node() raises (SALOME::SALOME_Exception);
  };
};

#endif
