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

#ifndef __BGDNetDirectory_h__
#define __BGDNetDirectory_h__

#include "BGDNetConfig.h"

#include "BGDNetFile.h"
#include "BGDNetDirectory.h"
#include "BGDNetCollection.h"
#include "BGDNetPath.h"
#include "BGDNetException.h"

namespace BGDNet
{

class Volume;

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

BGDNET_TEMPLATE(SharePtr<Directory>);
BGDNET_TEMPLATE(SharePtr<File>);
BGDNET_TEMPLATE(Collection<SharePtr<Directory> >);
BGDNET_TEMPLATE(Collection<SharePtr<File> >);

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

typedef Collection<SharePtr<Directory> > Directories;
typedef Collection<SharePtr<File> > Files;




/**
 * \class Directory
 * \brief Класс "Каталог"
 *
 * Представляет собой абстракцию каталога в файловой системе сервера NetWare.
 */
class BGDNET_API Directory : public DirEntry
{
public:

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

  Directory( const Directory* pParent, const Path& subdirName )
    throw(Exception);
  /**<
   * \brief Конструктор
   * @param pParent Указатель на родительский каталог.
   * @param subdirName Имя подкаталога.
   */

  void getSubdirs( Directories* pColl ) const
    throw(Exception);
  /**<
   * \brief Доступ к подкаталогам.
   * @param pColl Коллекция указателей на подкаталоги, заполняемая
   * данным методом.
   */

  void getFiles( Files* pColl ) const
    throw(Exception);
  /**<
   * \brief Доступ к файлам.
   * @param pColl Коллекция указателей на файлы, заполняемая
   * данным методом.
   */

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

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

private:

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

} // namespace BGDNet

#endif //__BGDNetDirectory_h__
