//---------------------------------------------------------------------
//  This file is part of the CLR Managed Debugger (mdbg) Sample.
// 
//  Copyright (C) Microsoft Corporation.  All rights reserved.
//---------------------------------------------------------------------
using System;

using Microsoft.Samples.Debugging.CorDebug.NativeApi;

namespace Microsoft.Samples.Debugging.CorDebug
{
    public sealed  class CorClass : WrapperBase
    {
        internal ICorDebugClass m_class;
        
        internal CorClass (ICorDebugClass managedClass)
            : base(managedClass)
        {
            m_class = managedClass;
        }


#if CORAPI_EXPOSE_RAW_INTERFACES
        [CLSCompliant(false)]
        public ICorDebugClass Raw
        {
            get 
            { 
                return m_class;
            }
        }
#endif

        /** The module containing the class */
        public CorModule Module
        {
            get 
            {
                ICorDebugModule m = null;
                m_class.GetModule (out m);
                return new CorModule (m);
            }
        }

        /** The metadata typedef token of the class. */
        public int Token
        {
            get 
            {
                uint td = 0;
                m_class.GetToken (out td);
                return (int) td;
            }
        }

        public bool JMCStatus
        {
            set
            {
                (m_class as ICorDebugClass2).SetJMCStatus(value?1:0);
            }
        }

        public CorType GetParameterizedType(CorElementType elementType, CorType[] typeArguments)
        {
            ICorDebugType[] types = null;
            uint length = 0;
            if (typeArguments != null)
            {
                types = new ICorDebugType[typeArguments.Length];
                for (int i = 0; i < typeArguments.Length; i++)
                    types[i] = typeArguments[i].m_type;
                length = (uint)typeArguments.Length;
            }

            ICorDebugType pType;
            (m_class as ICorDebugClass2).GetParameterizedType(elementType, length, types, out pType);
            return pType==null?null:new CorType (pType);
        }

        public CorValue GetStaticFieldValue(int fieldToken, CorFrame managedFrame)
        {
            ICorDebugValue pValue;
            m_class.GetStaticFieldValue((uint)fieldToken, (managedFrame==null)?null:managedFrame.m_frame, out pValue);
            return pValue==null?null:new CorValue(pValue);
        }

    } /* class Class */

} /* namespace */
