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

#ifndef __BGDNetNDSObject_h__
#define __BGDNetNDSObject_h__

#include "BGDNetConfig.h"

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

namespace BGDNet
{

class Context;
class NDSObject;

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

BGDNET_TEMPLATE(SharePtr<NDSObject>);
BGDNET_TEMPLATE(Collection<SharePtr<NDSObject> >);
BGDNET_TEMPLATE(Collection<String>);

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

typedef Collection<SharePtr<NDSObject> > NDSObjects;
typedef Collection<String> Strings;

/**
 * \class NDSObject
 * \brief Класс "Объект NDS"
 */
class BGDNET_API NDSObject : public Share
{
public:

  explicit NDSObject( const Context& ctx, const char* name = 0 )
    throw(Exception);
  /**<
   * \brief Конструктор
   * @param ctx Ссылка на контекст, в котором создается объект.
   * @param name Необязательный указатель на строку, содержащую имя объекта.
   */

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

  const String& rdn( void ) const;
  /**<
   * \brief Доступ к относительному имени объекта
   * @return Ссылка на строку, содержащая относительное имя объекта NDS
   */

  String baseClass( void ) const;
  /**<
   * brief Доступ к имени класса объекта (в терминах NDS-схемы)
   * @return Строка, содержащая имя базового класса объекта
   */

  bool isContainerEntry( void ) const;
  /**<
   * \brief Определяет, является ли объект контейнером
   * @return Признак того, что объект является контейнером, но не
   * является алиасом контейнера.
   */

  bool isContainerAlias( void ) const;
  /**<
   * \brief Определяет, является ли объект алиасом контейнера
   * @return Признак того, что объект является алиасом контейнера.
   */

  bool isContainer( void ) const;
  /**<
   * \brief Определяет, является ли объект контейнером
   * @return Признак того, что объект является либо контейнером,
   * либо алиасом контейнера.
   */

  void getSubordinates( NDSObjects* pColl ) const
    throw(Exception);
  /**<
   * \brief Доступ к подчиненным объектам
   * @param pColl Указатель на коллекцию, в которую помещаются указатели
   * на все подчиненные объекты данного объекта.
   */

  //bool attr( const char* name, String* pVal ) const;
	bool attr( const char* name, String* pVal, int valNum = 0) const;
  /**<
   * \brief Чтение строковых атрибутов объекта
   * @param name Указатель на строку, содержащую имя атрибута.
   * @param pVal Указатель на объект, в который помещается значение
	 * @param valNum Порядковый номер запрашиваемого значения для атрибутов с множественными значениями
   * строкового атрибута.
   * @return Признак того, что указанный атрибут существует.
   */

  bool attr( const char* name, Strings* pValues ) const;
  /**<
   * \brief Чтение строковых атрибутов объекта
   * @param name Указатель на строку, содержащую имя атрибута.
   * @param pValues Указатель на коллекцию, в которую помещается
   * список значений строкового атрибута.
   * @return Признак того, что указанный атрибут существует.
   */

private:

  nuint32 entryFlags( void ) const;
  /**<
   * \brief Доступ к флагам, являющимся частью DSI-информации
   * @return Флаги, являющиеся частью DSI-информации
   */

  const Context& m_ctx;
  /**<
   * \brief Ссылка на контекст, в котором находится объект
   */

  String m_dn;
  /**<
   * \brief Полное имя объекта NDS
   */

  String m_rdn;
  /**<
   * \brief Относительное имя объекта NDS
   */
};

} // namespace BGDNet

#endif //__BGDNetNDSObject_h__
