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

#ifndef __BGDNetDirEntry_h__
#define __BGDNetDirEntry_h__

#include "BGDNetConfig.h"

#include <nwdirect.h>
#include <nwdentry.h>
#include "BGDNetShare.h"
#include "BGDNetPath.h"
#include "BGDNetString.h"
#include "BGDNetConnRef.h"
#include "BGDNetException.h"

namespace BGDNet
{

class Volume;
class Context;

/**
 * \class DirHandle
 * \brief Класс "Дескриптор каталога"
 *
 * Дексрипторы идентифицируют отдельные каталоги на сервере Novell.
 */
class BGDNET_API DirHandle
{
public:

  DirHandle( const Volume* pVol, const Path& path, nuint8 nameSpc )
    throw(Exception);
  /**<
   * \brief Конструктор
   * @param pVol Указатель на том, на котором находится каталог, который
   * описывает дескриптор.
   * @param path Путь к каталогу относительно корневого каталога тома.
   * @param nameSpc Идентификатор пространства имен, к которому должен
   * относиться дескриптор каталога.
   */

  ~DirHandle( void );
  /**<
   * \brief Деструктор
   * Автоматически закрывает дескриптор каталога, если он открыт.
   */

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

private:

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

  ConnRef m_connRef;
  /**<
   * \brief Ссылка на соответствующее соединение
   */

  NWDIR_HANDLE m_handle;
  /**<
   * \brief Реальный дескриптор каталога
   */
};




/**
 * \class DirEntry
 * \brief Класс "Элемент Каталога"
 *
 * Представляет собой абстракцию элемента каталога в файловой системе
 * сервера NetWare. Класс DirEntry описывает общие свойства всех элементов
 * каталога и является базовым для классов "Каталог" и "Файл".
 */
class BGDNET_API DirEntry : public Share
{
public:

  DirEntry( const Volume* pVol, const Path& relPath );
  /**<
   * \brief Конструктор
   * @param pVol Указатель на том, в котором находится элемент.
   * @param relPath Путь к элементу относительно корневого каталога тома
   */

  virtual ~DirEntry( void ) {}
  /**<
   * \brief Деструктор.
   */

  const Volume* vol( void ) const;
  /**<
   * \brief Доступ к тому
   * @return Указатель на том, в котором находится элемент.
   */

  const Path& relPath( void ) const;
  /**<
   * \brief Доступ к относительному пути.
   * @return Ссылка на путь к элементу относительно корневого каталога
   * тома, на котором он находится.
   */

  Path fullPath( void ) const;
  /**<
   * \brief Получение полного пути.
   * Полный путь к элементу каталога включает имя сервера, имя тома
   * и относительный путь.
   * @return Полный путь к элементу каталога.
   */

  String dosName( void ) const;
  /**<
   * \brief DOS-имя элемента каталога.
   * @return Строка, содержащая DOS-имя элемента каталога.
   */

  String name( void ) const;
  /**<
   * \brief Имя элемента каталога.
   * Возвращается либо длинное, либо DOS-имя в зависимости от
   * загруженных на соответствующем томе пространств имен.
   * @return Строка, содержащая длинное имя элемента каталога.
   */

  virtual nuint32 ownerId( void ) const = 0;
  /**<
   * \brief Доступ к идентификатору владельца.
   * @return Идентификатор владельца элемента каталога.
   */

  virtual void ownerId( nuint32 id ) = 0;
  /**<
   * \brief Изменяет идентификатор владельца.
   * @param id Новый идентификатор владельца.
   */

  String ownerName( const Context& ctx ) const;
  /**<
   * \brief Доступ к имени владельца.
   * @param ctx Ссылка на контекст NDS.
   * @return Строка, содержащая имя владельца в указанном контексте.
   */

  void ownerName( const Context& ctx, const char* name );
  /**<
   * \brief Изменяет имя владельца.
   * @param ctx Ссылка на контекст NDS.
   * @param name Указатель на строку, содержащую новое имя владельца.
   */

protected:

  Path& relPath( void );
  /**<
   * \brief Доступ к относительному пути.
   * @return Ссылка на путь к элементу относительно корневого каталога
   * тома, на котором он находится.
   */

  void getEntryInfo( nuint16 attrs, NWENTRY_INFO* pInfo ) const;
  /**<
   * \brief Получает информацию об элементе каталога.
   * @param attrs Атрибуты для поиска.
   * @param pInfo Указатель на структуру, в которую помещается
   * информация.
   */

  void setEntryInfo(
    nuint16 attrs,
    const NWENTRY_INFO& info,
    nuint32 changeBits );
  /**<
   * \brief Изменяет информацию об элементе каталога.
   * @param attrs Атрибуты для поиска.
   * @param info Ссылка на структуру, содержащую информацию.
   * @param changeBits Маска, определяющая изменившиеся биты.
   */

private:

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

  String name( nuint8 nameSpc ) const;
  /**<
   * \brief Имя элемента каталога в заданном пространстве имен.
   * @param nameSpc Идентификатор необходимого пространства имен.
   * @return Строка, содержащая имя элемента каталога в заданном
   * пространстве имен.
   */

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

  Path m_relPath;
  /**<
   * \brief путь к элементу относительно корневого каталога тома.
   */
};

} // namespace BGDNet

#endif //__BGDNetDirEntry_h__
