Ahmad
Ahmad

Reputation: 9658

How to work with integer flags

I am trying to set an integer variable to a combination of an enum values, the enum is:

public enum WebBrowserDownloadControlFlags : uint
{
    DLIMAGES = 0x00000010,
    VIDEOS = 0x00000020,
    BGSOUNDS = 0x00000040,
    NO_SCRIPTS = 0x00000080,
    NO_JAVA = 0x00000100,
    NO_RUNACTIVEXCTLS = 0x00000200,
    NO_DLACTIVEXCTLS = 0x00000400,
    DOWNLOADONLY = 0x00000800,
    NO_FRAMEDOWNLOAD = 0x00001000,
    RESYNCHRONIZE = 0x00002000,
    PRAGMA_NO_CACHE = 0x00004000,
    NO_BEHAVIORS = 0x00008000,
    NO_METACHARSET = 0x00010000,
    URL_ENCODING_DISABLE_UTF8 = 0x00020000,
    URL_ENCODING_ENABLE_UTF8 = 0x00040000,
    NOFRAMES = 0x00080000,
    FORCEOFFLINE = 0x10000000,
    NO_CLIENTPULL = 0x20000000,
    SILENT = 0x40000000,
    OFFLINEIFNOTCONNECTED = 0x80000000,
    OFFLINE = OFFLINEIFNOTCONNECTED,
}

The DownloadControlFlags is an integer field:

    public int DownloadControlFlags
    {
        get
        {
            return _downloadControlFlags;
        }
        set
        {
            if (_downloadControlFlags == value)
                return;

            _downloadControlFlags = value;
            IOleControl ctl = (IOleControl)ActiveXInstance;
            ctl.OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
        }
    }

To set this variable I used summation as :

  webBrowser1.DownloadControlFlags = (int)WebBrowserDownloadControlFlags.DLIMAGES
             + (int)WebBrowserDownloadControlFlags.NOFRAMES
             + (int)WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD
             + (int)WebBrowserDownloadControlFlags.NO_JAVA
             + (int)WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
             + (int)WebBrowserDownloadControlFlags.NO_BEHAVIORS
             + (int)WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
        + (int)WebBrowserDownloadControlFlags.SILENT;

I am not sure if it is the correct way, but it seems that it works. But now I want to check if the variable contains an specific value or not. For normal enum the solution could be the answer of this question How to check if any flags of a flag combination are set?, but I am not sure if I can use the same way in my case.

How can I check if a specific flag has been set or not?! for example if the DownloadControlFlags contains WebBrowserDownloadControlFlags.NO_JAVA or not!

Upvotes: 1

Views: 5772

Answers (1)

poke
poke

Reputation: 387607

For normal enum the solution could be the answer of this question How to check if any flags of a flag combination are set?, but I am not sure if I can use the same way in my case.

Have you tried it?

int flags = (int)WebBrowserDownloadControlFlags.DLIMAGES
         + (int)WebBrowserDownloadControlFlags.NOFRAMES
         + (int)WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD
         + (int)WebBrowserDownloadControlFlags.NO_JAVA
         + (int)WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
         + (int)WebBrowserDownloadControlFlags.NO_BEHAVIORS
         + (int)WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
         + (int)WebBrowserDownloadControlFlags.SILENT;

You can either use Enum.HasFlag by casting it back to your enum type:

Console.WriteLine(((WebBrowserDownloadControlFlags)flags).HasFlag(WebBrowserDownloadControlFlags.NOFRAMES)); // true
Console.WriteLine(((WebBrowserDownloadControlFlags)flags).HasFlag(WebBrowserDownloadControlFlags.VIDEOS)); // false

Or you can cast the enum flag you want to compare against into an int and then make a bit-wise comparison:

Console.WriteLine((flags & (int)WebBrowserDownloadControlFlags.NO_JAVA) != 0); // true
Console.WriteLine((flags & (int)WebBrowserDownloadControlFlags.VIDEOS) != 0); // false

But you should really consider whether you actually don’t want to store the flags internally as a WebBrowserDownloadControlFlags type. There is no reason to convert it into an int early. And you could just as well do the following:

WebBrowserDownloadControlFlags flags = WebBrowserDownloadControlFlags.DLIMAGES
         | WebBrowserDownloadControlFlags.NOFRAMES
         | WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD
         | WebBrowserDownloadControlFlags.NO_JAVA
         | WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS
         | WebBrowserDownloadControlFlags.NO_BEHAVIORS
         | WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS
         | WebBrowserDownloadControlFlags.SILENT;

Console.WriteLine(flags.HasFlag(WebBrowserDownloadControlFlags.NOFRAMES)); // true
Console.WriteLine(flags.HasFlag(WebBrowserDownloadControlFlags.VIDEOS)); // false

Console.WriteLine((flags & WebBrowserDownloadControlFlags.NO_JAVA) != 0); // true
Console.WriteLine((flags & WebBrowserDownloadControlFlags.VIDEOS) != 0); // false

And whenever you really need an int value, you can just convert the whole thing into an int:

Console.WriteLine((int)flags); // 1074304784

Upvotes: 3

Related Questions