/**
 * \file BGDNetServer.h
 * \brief Объявление классов Server и Servers
 */

#ifndef __BGDNetServer_h__
#define __BGDNetServer_h__

#include "BGDNetConfig.h"

#include <nwnamspc.h>
#include "BGDNetShare.h"
#include "BGDNetConnRef.h"
#include "BGDNetCollection.h"
#include "BGDNetVolume.h"
#include "BGDNetException.h"
#include "BGDNetString.h"

namespace BGDNet
{

class Context;

#ifdef _MSC_VER
# pragma warning(disable:4231)
#endif

BGDNET_TEMPLATE(SharePtr<Volume>);
BGDNET_TEMPLATE(Collection<SharePtr<Volume> >);

#ifdef _MSC_VER
# pragma warning(default:4231)
#endif

typedef Collection<SharePtr<Volume> > Volumes;

/**
 * \class Server
 * \brief Класс "Сервер"
 *
 * Сервер используется для получения доступа к файловой системе.
 */
class BGDNET_API Server : public Share
{
public:

  explicit Server( ConnRef ref )
    throw(Exception);
  /**<
   * \brief Конструктор
   * @param ref Ссылка на соединение с реальным сервером NetWare.
   */

  explicit Server( const String& srvName )
    throw(Exception);
  /**<
   * \brief Конструктор
   * @param srvName Ссылка на строку, содержащую имя сервера.
   */

  void getVolumes( Volumes* pColl ) const
    throw(Exception);
  /**<
   * \brief Доступ к томам, расположенным на сервере.
   * По умолчанию для всех томов устанавливается пространство имен NW_NS_DOS.
   * @param pColl Указатель на коллекцию указателей на тома, которая заполняется
   * данным методом.
   */

  ConnRef connRef( void ) const;
  /**<
   * \brief Доступ к соответствующему соединению
   * @return Ссылка на соединение с сервером.
   */

  const String& name( void ) const;
  /**<
   * \brief Доступ к имени сервера
   * @return Ссылка на строку, содержащую имя сервера.
   */

  String objNameById( nuint32 objId, const Context& ctx ) const
    throw(Exception);
  /**<
   * \brief Преобразование идентификатора объекта в имя объекта.
   * @param objId Идентификатор объекта.
   * @param ctx Ссылка на контекст NDS.
   * @return Строка, содержащая имя объекта.
   */

  nuint32 objIdByName( const char* objName, const Context& ctx ) const
    throw(Exception);
  /**<
   * \brief Преобразование имени объекта в идентификатор объекта.
   * @param objName Указатель на строку, содержащую имя объекта.
   * @param ctx Ссылка на контекст NDS.
   * @return Идентификатор объекта.
   */

private:

  Server( const Server& );
  /**<
   * \brief Копирование запрещено!
   */
  
  Server& operator =( const Server& );
  /**<
   * \brief Присваивание запрещено!
   */

  ConnRef m_connRef;
  /**<
   * \brief Ссылка на соединение с реальным сервером NetWare
   */

  String m_srvName;
  /**<
   * \brief Строка, содержащая имя сервера
   */
};




#ifdef _MSC_VER
# pragma warning(disable:4231)
#endif

BGDNET_TEMPLATE(SharePtr<Server>);
BGDNET_TEMPLATE(Collection<SharePtr<Server> >);

#ifdef _MSC_VER
# pragma warning(default:4231)
#endif




/**
 * \class Servers
 * \brief Класс "Сервера".
 *
 * Представляет собой коллекцию указателей на все доступные сервера.
 */
class BGDNET_API Servers
{
public:

  Servers( void )
    throw(Exception);
  /**<
   * \brief Конструктор.
   */

  int count( void ) const;
  /**<
   * \brief Доступ к количеству серверов.
   * @return Количество доступных серверов.
   */

  Server* operator []( int n );
  /**<
   * \brief Доступ к серверам.
   * @param n Индекс сервера (начиная с 0).
   * @ return Ссылка на n-й сервер.
   */

  const Server* operator []( int n ) const;
  /**<
   * \brief Доступ к серверам.
   * @param n Индекс сервера (начиная с 0).
   * @ return Ссылка на n-й сервер.
   */

private:

  Collection<SharePtr<Server> > m_servers;
  /**<
   * \brief Коллекция указателей на все доступные сервера.
   */
};

} // namespace BGDNet

#endif //__BGDNetServer_h__
