ForwardingFlags Class
=====================

A ForwardingFlags object holds the flags which specify how the forwarding daemon should forward an interest for a registered prefix.  We use a separate ForwardingFlags object to retain future compatibility if the daemon forwarding bits are changed, amended or deprecated.

:[C++]:
    Namespace: `ndn`

ForwardingFlags Constructor

Create a new ForwardingFlags with "active" and "childInherit" set and all other flags cleared.

:[C++]:

    .. code-block:: c++

        ForwardingFlags();

:[JavaScript]:

    .. code-block:: javascript

        var ForwardingFlags = function ForwardingFlags()

ForwardingFlags.getActive Method
--------------------------------

Get the value of the "active" flag.

:[C++]:

    .. code-block:: c++

        bool getActive() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getActive = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getChildInherit Method
--------------------------------------

Get the value of the "childInherit" flag.

:[C++]:

    .. code-block:: c++

        bool getChildInherit() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getChildInherit = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getAdvertise Method
-----------------------------------

Get the value of the "advertise" flag.

:[C++]:

    .. code-block:: c++

        bool getAdvertise() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getAdvertise = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getLast Method
------------------------------

Get the value of the "last" flag.

:[C++]:

    .. code-block:: c++

        bool getLast() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getLast = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getCapture Method
---------------------------------

Get the value of the "capture" flag.

:[C++]:

    .. code-block:: c++

        bool getCapture() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getCapture = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getLocal Method
-------------------------------

Get the value of the "local" flag.

:[C++]:

    .. code-block:: c++

        bool getLocal() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getLocal = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getTap Method
-----------------------------

Get the value of the "tap" flag.

:[C++]:

    .. code-block:: c++

        bool getTap() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getTap = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.getCaptureOk Method
-----------------------------------

Get the value of the "captureOk" flag.

:[C++]:

    .. code-block:: c++

        bool getCaptureOk() const;

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.getCaptureOk = function()

:Returns:

    true if the flag is set, false if it is cleared.

ForwardingFlags.setActive Method
--------------------------------

Set the value of the "active" flag

:[C++]:

    .. code-block:: c++

        void setActive(

            bool active;

        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setActive = function(
        
            active    // boolean
        
        )

:Parameters:

    - `active`
        true to set the flag, false to clear it.

ForwardingFlags.setChildInherit Method
--------------------------------------

Set the value of the "childInherit" flag

:[C++]:

    .. code-block:: c++

        void setChildInherit(

            bool childInherit;

        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setChildInherit = function(
        
            childInherit    // boolean
        
        )

:Parameters:

    - `childInherit`
        true to set the flag, false to clear it.

ForwardingFlags.setAdvertise Method
-----------------------------------

Set the value of the "advertise" flag

:[C++]:

    .. code-block:: c++

        void setAdvertise(

            bool advertise;

        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setAdvertise = function(
        
            advertise    // boolean
        
        )

:Parameters:

    - `advertise`
        true to set the flag, false to clear it.

ForwardingFlags.setLast Method
------------------------------

Set the value of the "last" flag

:[C++]:

    .. code-block:: c++

        void setLast(
        
            bool last;
        
        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setLast = function(
        
            last    // boolean
        
        )

:Parameters:

    - `last`
        true to set the flag, false to clear it.

ForwardingFlags.setCapture Method
---------------------------------

Set the value of the "capture" flag

:[C++]:

    .. code-block:: c++

        void setCapture(
        
            bool capture;
        
        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setCapture = function(
        
            capture    // boolean
        
        )

:Parameters:

    - `capture`
        true to set the flag, false to clear it.

ForwardingFlags.setLocal Method
-------------------------------

Set the value of the "local" flag

:[C++]:

    .. code-block:: c++

        void setLocal(
        
            bool local;
        
        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setLocal = function(
        
            local    // boolean
        
        )

:Parameters:

    - `local`
        true to set the flag, false to clear it.

ForwardingFlags.setTap Method
-----------------------------

Set the value of the "tap" flag

:[C++]:

    .. code-block:: c++

        void setTap(
        
            bool tap;
        
        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setTap = function(
        
            tap    // boolean
        
        )

:Parameters:

    - `tap`
        true to set the flag, false to clear it.

ForwardingFlags.setCaptureOk Method
-----------------------------------

Set the value of the "captureOk" flag

:[C++]:

    .. code-block:: c++

        void setCaptureOk(
        
            bool captureOk;
        
        );

:[JavaScript]:

    .. code-block:: javascript

        ForwardingFlags.prototype.setCaptureOk = function(
        
            captureOk    // boolean
        
        )

:Parameters:

    - `captureOk`
        true to set the flag, false to clear it.
