/**
 * \file BGDNetDrive.h
 * \brief Объявление классов NetworkDrive и NetworkDrives.
 */

#ifndef __BGDNetDrive_h__
#define __BGDNetDrive_h__

#include "BGDNetConfig.h"

#include "BGDNetString.h"
#include "BGDNetException.h"
#include "BGDNetShare.h"
#include "BGDNetCollection.h"

namespace BGDNet
{

class Server;
class Volume;
class Directory;

/**
 * \class NetworkDrive
 * \brief Класс "Сетевой диск"
 *
 * Предоставляет доступ к сетевому диску.
 */
class BGDNET_API NetworkDrive : public Share
{
public:

  explicit NetworkDrive( char drv )
    throw(Exception);
  /**<
   * \brief Конструктор
   * @param drv Буква, соответствующая сетевому диску.
   */

  ~NetworkDrive( void );
  /**<
   * \brief Деструктор.
   */

  char drvLetter( void ) const;
  /**<
   * \brief Доступ к букве сетевого диска.
   */

  Directory* mappedDir( void );
  /**<
   * \brief Доступ к отображенному каталогу.
   * @return Указатель на каталог, соответствующий данному сетевому диску.
   * Возвращает нулевой указатель в том случае, если сетевой диск недоступен.
   */

  const Directory* mappedDir( void ) const;
  /**<
   * \brief Доступ к отображенному каталогу.
   * @return Указатель на каталог, соответствующий данному сетевому диску.
   * Возвращает нулевой указатель в том случае, если сетевой диск недоступен.
   */

private:

  void getMappedDir( void );
  /**<
   * \brief Инициализирует отображенный каталог.
   */

  const char m_drvLetter;
  /**<
   * \brief Буква, соответствующая сетевому диску.
   */

  Server* m_pSrv;
  /**<
   * \brief Указатель на сервер, на котором находится сетевой диск.
   */

  Volume* m_pVol;
  /**<
   * \brief Указатель на том, на котором находится сетевой диск.
   */

  Directory* m_pDir;
  /**<
   * \brief Указатель на отображенный каталог.
   */
};




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

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

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




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

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

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

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

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

private:

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

} // namespace BGDNet

#endif //__BGDNetDrive_h__
