/**
 * \file BGDNetConnection.h
 * \brief Объявление класса Connection
 */

#ifndef __BGDNetConnection_h__
#define __BGDNetConnection_h__

#include "BGDNetConfig.h"

#include <nwclxcon.h>
#include "BGDNetConnRef.h"
#include "BGDNetException.h"

namespace BGDNet
{

/**
 * \class Connection
 * \brief Класс "Соединение с Сервером"
 * 
 * Рабочая станция может иметь один из трех типов соединений с сервером:
 * - Установленное;
 * - Авторизованное;
 * - Лицензированное.
 * 
 * Рабочей станции, просто подключенной к серверу, не предоставляются никакие
 * права доступа к его ресурсам. Однако, ограниченный доступ, например, к
 * Login-каталогу или возможность получать адреса других серверов все же
 * имеются.
 * 
 * После того, как соединение с сервером установлено, оно может быть авторизовано
 * для использования определенным пользователем. После авторизации пользователю
 * предоставляются определенные права доступа к ресурсам сервера.
 * 
 * Лицензированное соединение необходимо для подключения сетевых дисков,
 * доступа к файловой системе сервера и функциям печати.
 */
class BGDNET_API Connection
{
public:

  Connection( ConnRef ref, bool licenseFlag = true )
    throw(Exception);
  /**<
   * \brief Конструктор
   * Открывает соединение по имеющейся ссылке.
   * @param ref Ссылка на соединение, которое необходимо открыть.
   * @param licenseFlag Признак запроса лицензированного соединения.
   */

  Connection( const char* srvName, bool licenseFlag = true )
    throw(Exception);
  /**<
   * \brief Конструктор
   * Открывает соединение по имени сервера.
   * @param srvName Ссылка Указатель на строку, содержащую имя сервера.
   * @param licenseFlag Признак запроса лицензированного соединения.
   */

  void open( ConnRef ref, bool licenseFlag = true )
    throw(Exception);
  /**<
   * \brief Открывает соединение по имеющейся ссылке
   * @param ref Ссылка на соединение, которое необходимо открыть.
   * @param licenseFlag Признак запроса лицензированного соединения.
   */

  void open( const char* srvName, bool licenseFlag = true )
    throw(Exception);
  /**<
   * \brief Открывает соединение по имени сервера
   * @param srvName Ссылка Указатель на строку, содержащую имя сервера.
   * @param licenseFlag Признак запроса лицензированного соединения.
   */

  void close( void );
  /**<
   * \brief Закрывает соединение, если оно открыто
   */

  ConnRef ref( void ) const
    throw(Exception);
  /**<
   * \brief Возвращает ссылку на соединение
   */

  operator NWCONN_HANDLE( void ) const;
  /**<
   * \brief Оператор преобразования к типу дескриптора соединения
   */

  ~Connection( void );
  /**<
   * \brief Деструктор
   * Закрывает соединение, если оно было открыто
   */

private:

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

  static const NWCONN_HANDLE s_invalidHandle;
  /**<
   * \brief Заведомо несуществующее значение дескриптора соединения.
   */

  NWCONN_HANDLE m_connHandle;
  /**<
   * \brief Дескриптор соединения
   */
};

} // namespace BGDNet

#endif //__BGDNetConnection_h__
