corrade-vassal – Rev 1

Subversion Repositories:
Rev:
/*
 * Copyright (c) 2006-2014, openmetaverse.org
 * All rights reserved.
 *
 * - Redistribution and use in source and binary forms, with or without
 *   modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 * - Neither the name of the openmetaverse.org nor the names
 *   of its contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

using System;
using OpenMetaverse.StructuredData;

namespace OpenMetaverse
{
    /// <summary>
    /// 
    /// </summary>
    [Flags]
    public enum PermissionMask : uint
    {
        None = 0,
        Transfer = 1 << 13,
        Modify = 1 << 14,
        Copy = 1 << 15,
        Export = 1 << 16,
        Move = 1 << 19,
        Damage = 1 << 20,
        // All does not contain Export, which is special and must be
        // explicitly given
        All = (1 << 13) | (1 << 14) | (1 << 15) | (1 << 19)
    }

    /// <summary>
    /// 
    /// </summary>
    [Flags]
    public enum PermissionWho : byte
    {
        /// <summary></summary>
        Base = 0x01,
        /// <summary></summary>
        Owner = 0x02,
        /// <summary></summary>
        Group = 0x04,
        /// <summary></summary>
        Everyone = 0x08,
        /// <summary></summary>
        NextOwner = 0x10,
        /// <summary></summary>
        All = 0x1F
    }

    /// <summary>
    /// 
    /// </summary>
    [Serializable()]
    public struct Permissions
    {
        public PermissionMask BaseMask;
        public PermissionMask EveryoneMask;
        public PermissionMask GroupMask;
        public PermissionMask NextOwnerMask;
        public PermissionMask OwnerMask;

        public Permissions(uint baseMask, uint everyoneMask, uint groupMask, uint nextOwnerMask, uint ownerMask)
        {
            BaseMask = (PermissionMask)baseMask;
            EveryoneMask = (PermissionMask)everyoneMask;
            GroupMask = (PermissionMask)groupMask;
            NextOwnerMask = (PermissionMask)nextOwnerMask;
            OwnerMask = (PermissionMask)ownerMask;
        }

        public Permissions GetNextPermissions()
        {
            uint nextMask = (uint)NextOwnerMask;

            return new Permissions(
                (uint)BaseMask & nextMask,
                (uint)EveryoneMask & nextMask,
                (uint)GroupMask & nextMask,
                (uint)NextOwnerMask,
                (uint)OwnerMask & nextMask
                );
        }

        public OSD GetOSD()
        {
            OSDMap permissions = new OSDMap(5);
            permissions["base_mask"] = OSD.FromInteger((uint)BaseMask);
            permissions["everyone_mask"] = OSD.FromInteger((uint)EveryoneMask);
            permissions["group_mask"] = OSD.FromInteger((uint)GroupMask);
            permissions["next_owner_mask"] = OSD.FromInteger((uint)NextOwnerMask);
            permissions["owner_mask"] = OSD.FromInteger((uint)OwnerMask);
            return permissions;
        }

        public static Permissions FromOSD(OSD llsd)
        {
            Permissions permissions = new Permissions();
            OSDMap map = llsd as OSDMap;

            if (map != null)
            {
                permissions.BaseMask = (PermissionMask)map["base_mask"].AsUInteger();
                permissions.EveryoneMask = (PermissionMask)map["everyone_mask"].AsUInteger();
                permissions.GroupMask = (PermissionMask)map["group_mask"].AsUInteger();
                permissions.NextOwnerMask = (PermissionMask)map["next_owner_mask"].AsUInteger();
                permissions.OwnerMask = (PermissionMask)map["owner_mask"].AsUInteger();
            }

            return permissions;
        }

        public override string ToString()
        {
            return String.Format("Base: {0}, Everyone: {1}, Group: {2}, NextOwner: {3}, Owner: {4}",
                BaseMask, EveryoneMask, GroupMask, NextOwnerMask, OwnerMask);
        }

        public override int GetHashCode()
        {
            return BaseMask.GetHashCode() ^ EveryoneMask.GetHashCode() ^ GroupMask.GetHashCode() ^
                NextOwnerMask.GetHashCode() ^ OwnerMask.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            return (obj is Permissions) ? this == (Permissions)obj : false;
        }

        public bool Equals(Permissions other)
        {
            return this == other;
        }

        public static bool operator ==(Permissions lhs, Permissions rhs)
        {
            return (lhs.BaseMask == rhs.BaseMask) && (lhs.EveryoneMask == rhs.EveryoneMask) &&
                (lhs.GroupMask == rhs.GroupMask) && (lhs.NextOwnerMask == rhs.NextOwnerMask) &&
                (lhs.OwnerMask == rhs.OwnerMask);
        }

        public static bool operator !=(Permissions lhs, Permissions rhs)
        {
            return !(lhs == rhs);
        }

        public static bool HasPermissions(PermissionMask perms, PermissionMask checkPerms)
        {
            return (perms & checkPerms) == checkPerms;
        }

        public static readonly Permissions NoPermissions = new Permissions();
        public static readonly Permissions FullPermissions = new Permissions((uint)PermissionMask.All, (uint)PermissionMask.All,
            (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All);
    }
}