Esempio n. 1
0
 //--------------------------------------------
 //set
 //-------------------------------------------
 public void set(int npc_id, Task_event evt,
                 int cvar1_index, int cvar1, VARTYPE cvar1_type,
                 int cvar2_index, int cvar2, VARTYPE cvar2_type,
                 int money, VARTYPE money_type,
                 int rcvar1_index, int rcvar1, VARRESULT rcvar1_type,
                 int rcvar2_index, int rcvar2, VARRESULT rcvar2_type,
                 int var1, int var2, int var3, int var4)
 {
     this.npc_id       = npc_id;
     this.evt         += evt;
     this.cvar1_index  = cvar1_index;
     this.cvar1        = cvar1;
     this.cvar1_type   = cvar1_type;
     this.cvar2_index  = cvar2_index;
     this.cvar2        = cvar2;
     this.cvar2_type   = cvar2_type;
     this.rcvar1_index = rcvar1_index;
     this.rcvar1       = rcvar1;
     this.rcvar1_type  = rcvar1_type;
     this.rcvar2_index = rcvar2_index;
     this.rcvar2       = rcvar2;
     this.rcvar2_type  = rcvar2_type;
     this.money        = money;
     this.money_type   = money_type;
     this.var1         = var1;
     this.var2         = var2;
     this.var3         = var3;
     this.var4         = var4;
 }
Esempio n. 2
0
        public void PROPVARIANTOtherPropsTest(VARTYPE vt, string prop)
        {
            object value;

            Assert.That(() =>
            {
                if ((value = GetSampleData(vt)) == null)
                {
                    return;
                }
                using (var pv = new PROPVARIANT(value, (VarEnum)vt))
                {
                    var isa = value.GetType().IsArray;
                    Assert.That(pv.vt, Is.EqualTo(vt));
                    if (isa)
                    {
                        Assert.That(pv.Value, Is.EquivalentTo((IEnumerable)value));
                    }
                    else
                    {
                        Assert.That(pv.Value, Is.EqualTo(value));
                    }
                    var pi = pv.GetType().GetProperty(prop);
                    Assert.That(pi, Is.Not.Null);
                    if (isa)
                    {
                        Assert.That(pi.GetValue(pv), Is.EquivalentTo((IEnumerable)value));
                    }
                    else
                    {
                        Assert.That(pi.GetValue(pv), Is.EqualTo(value));
                    }
                }
            }, Throws.Nothing);
        }
Esempio n. 3
0
 public void set(int npc_id, Task_event evt,
                 int cvar1_index, int cvar1, VARTYPE cvar1_type,
                 int rcvar1_index, int rcvar1, VARRESULT rcvar1_type
                 )
 {
     set(npc_id, evt,
         cvar1_index, cvar1, cvar1_type,
         rcvar1_index, rcvar1, rcvar1_type,
         0, 0, 0, 0);
 }
Esempio n. 4
0
 public void PROPVARIANTPropsTest(object value, VARTYPE vt, string prop)
 {
     using (var pv = new PROPVARIANT(value))
     {
         Assert.That(pv.vt, Is.EqualTo(vt));
         Assert.That(pv.Value, Is.EqualTo(value));
         var pi = pv.GetType().GetProperty(prop);
         Assert.That(pi, Is.Not.Null);
         Assert.That(pi.GetValue(pv), Is.EqualTo(value));
     }
 }
Esempio n. 5
0
        private static void PVRefTest <T>(T?nval, VARTYPE vt, string prop) where T : struct
        {
            var pi = typeof(PROPVARIANT).GetProperty(prop);

            Assert.That(pi, Is.Not.Null);
            using (var pv = new PROPVARIANT(null, (VarEnum)(VARTYPE.VT_BYREF | vt)))
            {
                Assert.That(pv.vt, Is.EqualTo(vt | VARTYPE.VT_BYREF));
                Assert.That(pv.Value, Is.Null);
                Assert.That(pi.GetValue(pv), Is.Null);
            }
        }
Esempio n. 6
0
        public static void Dispose(ref PROPVARIANT variant)
        {
            const VARTYPE        flagMask = VARTYPE.VT_ARRAY | VARTYPE.VT_VECTOR | VARTYPE.VT_BYREF;
            bool                 hasFlag  = (variant.Type & flagMask) != (VARTYPE)0;
            Action <PROPVARIANT> disposer;

            if (disposers.TryGetValue(variant.Type, out disposer) ||
                (hasFlag && disposers.TryGetValue(variant.Type & flagMask, out disposer)))
            {
                disposer.Invoke(variant);
            }
            variant = new PROPVARIANT();
        }
Esempio n. 7
0
 public void set(int npc_id, Task_event evt,
                 int cvar1_index, int cvar1, VARTYPE cvar1_type,
                 int rcvar1_index, int rcvar1, VARRESULT rcvar1_type,
                 int var1, int var2, int var3, int var4)
 {
     set(npc_id, evt,
         cvar1_index, cvar1, cvar1_type,
         0, 0, VARTYPE.ANY,
         0, VARTYPE.ANY,
         rcvar1_index, rcvar1, rcvar1_type,
         0, 0, VARRESULT.NOTHING,
         var1, var2, var3, var4);
 }
Esempio n. 8
0
        public static bool TryDecode <T>(ref PROPVARIANT variant, out T value)
        {
            const VARTYPE flagMask = VARTYPE.VT_ARRAY | VARTYPE.VT_VECTOR | VARTYPE.VT_BYREF;
            bool          hasFlag  = (variant.Type & flagMask) != (VARTYPE)0;
            Func <PROPVARIANT, object> decoder;

            if (decoders.TryGetValue(variant.Type, out decoder) ||
                (hasFlag && decoders.TryGetValue(variant.Type & flagMask, out decoder)))
            {
                value = (T)decoder.Invoke(variant);
                return(true);
            }
            else
            {
                value = default(T);
                return(false);
            }
        }
Esempio n. 9
0
        public void PROPVARIANTEnumPropsTest(object value, VARTYPE vt, string prop)
        {
            const int len = 5;
            var       arr = Array.CreateInstance(value.GetType(), len);

            for (var i = 0; i < len; i++)
            {
                arr.SetValue(value, i);
            }
            using (var pv = new PROPVARIANT(arr))
            {
                Assert.That(pv.vt, Is.EqualTo(vt | VARTYPE.VT_VECTOR));
                Assert.That(pv.Value, Is.EquivalentTo(arr));
                var pi = pv.GetType().GetProperty(prop);
                Assert.That(pi, Is.Not.Null);
                Assert.That(pi.GetValue(pv), Is.EquivalentTo(arr));
            }
        }
Esempio n. 10
0
        /// <summary>Gets the .NET runtime type which corresponds to the <see cref="VARTYPE"/>.</summary>
        /// <param name="vt">The <see cref="VARTYPE"/> enumeration value to evaluate.</param>
        /// <returns>
        /// <para>The corresponding .NET runtime type.</para>
        /// <para>
        /// If <paramref name="vt"/> specifies <see cref="VARTYPE.VT_VECTOR"/> or <see cref="VARTYPE.VT_ARRAY"/>, the return type is an
        /// array of the element type.
        /// </para>
        /// <para>
        /// If <paramref name="vt"/> specifies <see cref="VARTYPE.VT_BYREF"/> and the element type is a value type, the return type is a
        /// pointer to the element type.
        /// </para>
        /// </returns>
        public static Type GetCorrespondingType(this VARTYPE vt)
        {
            var elemVT = vt & ~(VARTYPE)0xF000;
            var specVT = vt & (VARTYPE)0xF000;
            var type   = CorrespondingTypeAttribute.GetCorrespondingTypes(elemVT).FirstOrDefault();

            if (type is null || elemVT == 0)
            {
                return(null);
            }
            // Change type if by reference
            if (specVT.IsFlagSet(VARTYPE.VT_BYREF) && type.IsValueType)
            {
                type = type.MakePointerType();
            }
            // Change type if vector
            if (specVT.IsFlagSet(VARTYPE.VT_VECTOR) || specVT.IsFlagSet(VARTYPE.VT_ARRAY))
            {
                type = type.MakeArrayType();
            }
            return(type);
        }
Esempio n. 11
0
        private static object GetSampleData(VARTYPE vt)
        {
            switch (vt)
            {
            case VARTYPE.VT_ARRAY | VARTYPE.VT_VARIANT:
                return(new object[] { 100, "100" });

            case VARTYPE.VT_BLOB:
                return(new BLOB {
                    cbSize = 200, pBlobData = Marshal.AllocCoTaskMem(200)
                });

            case VARTYPE.VT_CY:
            case VARTYPE.VT_BYREF | VARTYPE.VT_CY:
            case VARTYPE.VT_BYREF | VARTYPE.VT_DECIMAL:
                return(12345.6789M);

            case VARTYPE.VT_BYREF | VARTYPE.VT_VARIANT:
                return(null);

            case VARTYPE.VT_CF:
                return(new CLIPDATA("MYCUSTOMFMT"));

            case VARTYPE.VT_CLSID:
                return(Guid.NewGuid());

            case VARTYPE.VT_DATE:
            case VARTYPE.VT_BYREF | VARTYPE.VT_DATE:
                return(new DateTime(1999, 12, 31, 23, 59, 59));

            case VARTYPE.VT_DISPATCH:
                return(Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")));

            case VARTYPE.VT_ERROR:
            case VARTYPE.VT_BYREF | VARTYPE.VT_ERROR:
                return(new Win32Error(5));

            case VARTYPE.VT_FILETIME:
                return(new DateTime(1999, 12, 31, 23, 59, 59).ToFileTimeStruct());

            case VARTYPE.VT_BSTR:
            case VARTYPE.VT_BYREF | VARTYPE.VT_BSTR:
            case VARTYPE.VT_LPSTR:
            case VARTYPE.VT_LPWSTR:
                return("string");

            case VARTYPE.VT_STORAGE:
                StgCreateStorageEx(Path.GetTempFileName(), STGM.STGM_DELETEONRELEASE | STGM.STGM_CREATE | STGM.STGM_DIRECT | STGM.STGM_READWRITE | STGM.STGM_SHARE_EXCLUSIVE, STGFMT.STGFMT_DOCFILE, 0, IntPtr.Zero, IntPtr.Zero, typeof(IStorage).GUID, out object iptr);
                return((IStorage)iptr);

            case VARTYPE.VT_STREAM:
                SHCreateStreamOnFileEx(AdvApi32Tests.fn, STGM.STGM_READ | STGM.STGM_SHARE_EXCLUSIVE, 0, false, null, out IStream stm);
                return(stm);

            case VARTYPE.VT_UNKNOWN:
                return(new IShellLinkW());

            case VARTYPE.VT_VECTOR | VARTYPE.VT_BSTR:
            case VARTYPE.VT_VECTOR | VARTYPE.VT_LPSTR:
            case VARTYPE.VT_VECTOR | VARTYPE.VT_LPWSTR:
                return(new[] { "A", "B", "C" });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_CF:
                return(new[] { new CLIPDATA(), new CLIPDATA() });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_CLSID:
                return(new[] { Guid.NewGuid(), Guid.NewGuid() });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_CY:
                return(new[] { 12345.6789M, 98765.4321M });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_DATE:
                return(new[] { new DateTime(1999, 12, 31, 23, 59, 59), new DateTime(2000, 1, 1, 0, 0, 1) });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_ERROR:
                return(new[] { new Win32Error(1), new Win32Error(5) });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_FILETIME:
                return(new[] { new DateTime(1999, 12, 31, 23, 59, 59).ToFileTimeStruct(), new DateTime(2000, 1, 1, 0, 0, 1).ToFileTimeStruct() });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_VARIANT:
                return(new[] { new PROPVARIANT(100), new PROPVARIANT(200) });

            case VARTYPE.VT_VERSIONED_STREAM:
                return(null);

            default:
                return(null);
            }
        }
Esempio n. 12
0
        GetOleProperty(
            Guid fmtid,
            uint propId
            )
        {
            CheckDisposed();

            // fmtid is always either DocSum or Sum.
            IPropertyStorage ps =
                fmtid == FormatId.SummaryInformation ? _psSummInfo : _psDocSummInfo;

            if (ps == null)
            {
                // This file doesn't even contain the property storage that this
                // property belongs to, so it certainly doesn't contain the property.
                return(null);
            }

            object obj = null;

            PROPSPEC[]    propSpecs = new PROPSPEC[1];
            PROPVARIANT[] vals      = new PROPVARIANT[1];

            propSpecs[0].propType     = (uint)PropSpecType.Id;
            propSpecs[0].union.propId = propId;

            VARTYPE vtExpected = GetVtFromPropId(fmtid, propId);

            int hresult = ps.ReadMultiple(1, propSpecs, vals);

            if (hresult == SafeNativeCompoundFileConstants.S_OK)
            {
                try
                {
                    if (vals[0].vt != vtExpected)
                    {
                        throw new FileFormatException(
                                  SR.Get(
                                      SRID.WrongDocumentPropertyVariantType,
                                      propId,
                                      fmtid.ToString(),
                                      vals[0].vt,
                                      vtExpected
                                      )
                                  );
                    }

                    switch (vals[0].vt)
                    {
                    case VARTYPE.VT_LPSTR:
                        //
                        // We store string properties as CP_ACP or UTF-8.
                        // But no matter which format the string was encoded, we always use the UTF-8
                        // encoder/decoder to decode the byte array, because the UTF-8 code of an ASCII
                        // string is the same as the ASCII string.
                        //
                        IntPtr pszVal = vals[0].union.pszVal;
                        //
                        // Because both the ASCII string and UTF-8 encoded string (byte array) are
                        // stored in a memory block (pszVal) terminated by null, we can use
                        // Marshal.PtrToStringAnsi(pszVal) to convert the memory block pointed by
                        // pszVal to a string. Then from the string.Length, we can get the number of
                        // bytes in the memory block. Otherwise, we cannot easily tell how many bytes
                        // are stored in pszVal without an extra parameter.
                        //
                        string ansiString = Marshal.PtrToStringAnsi(pszVal);
                        int    nLen       = ansiString.Length;

                        byte[] byteArray = new byte[nLen];
                        Marshal.Copy(pszVal, byteArray, 0, nLen);

                        obj = UTF8Encoding.UTF8.GetString(byteArray);
                        break;

                    case VARTYPE.VT_FILETIME:
                        //
                        // DateTime doesn't have a conversion from FILETIME. It has a
                        // misleadingly named "FromFileTime" method that actually wants
                        // a long. So...
                        //
                        obj = new Nullable <DateTime>(DateTime.FromFileTime(vals[0].union.hVal));
                        break;

                    default:
                        throw new FileFormatException(
                                  SR.Get(SRID.InvalidDocumentPropertyVariantType, vals[0].vt));
                    }
                }
                finally
                {
#pragma warning suppress 6031 // suppressing a "by design" ignored return value
                    SafeNativeCompoundFileMethods.SafePropVariantClear(ref vals[0]);
                }
            }
            else if (hresult == SafeNativeCompoundFileConstants.S_FALSE)
            {
                // Do nothing -- return the null object reference.
            }
            else
            {
                SecurityHelper.ThrowExceptionForHR(hresult);
            }

            return(obj);
        }
Esempio n. 13
0
        /*public void GetCF()
         * {
         *      foreach (var f in Directory.EnumerateFiles(TestCaseSources.TempDir, "*.*", SearchOption.AllDirectories))
         *      {
         *              try
         *              {
         *                      SHGetPropertyStoreFromParsingName(f, null, GETPROPERTYSTOREFLAGS.GPS_READWRITE,
         *                              Marshal.GenerateGuidForType(typeof(IPropertyStore)), out var ps);
         *                      if (ps == null) continue;
         *                      using (var pv = new PROPVARIANT())
         *                      {
         *                              ps.GetValue(PROPERTYKEY.System.Thumbnail, pv);
         *                              if (pv.IsNullOrEmpty) continue;
         *                              if (pv.vt == VARTYPE.VT_CF)
         *                                      TestContext.WriteLine(f);
         *                      }
         *                      ps = null;
         *              }
         *              catch
         *              {
         *              }
         *      }
         * }*/

        private static object GetSampleData(VARTYPE vt)
        {
            switch (vt)
            {
            case VARTYPE.VT_ARRAY | VARTYPE.VT_VARIANT:
                return(new object[] { 100, "100" });

            case VARTYPE.VT_ARRAY | VARTYPE.VT_I4:
                var sa = SafeArrayCreateVector(VARTYPE.VT_I4, 0, 4U);
                for (int i = 0; i < 4U; i++)
                {
                    using var p = new PinnedObject(i);
                    SafeArrayPutElement(sa, i, p);
                }
                return(sa);

            case VARTYPE.VT_BLOB:
                return(new BLOB {
                    cbSize = 200, pBlobData = Marshal.AllocCoTaskMem(200)
                });

            case VARTYPE.VT_CY:
            case VARTYPE.VT_BYREF | VARTYPE.VT_CY:
            case VARTYPE.VT_BYREF | VARTYPE.VT_DECIMAL:
                return(12345.6789M);

            case VARTYPE.VT_BYREF | VARTYPE.VT_VARIANT:
                return(null);

            case VARTYPE.VT_CF:
                return(new CLIPDATA("MYCUSTOMFMT"));

            case VARTYPE.VT_CLSID:
                return(Guid.NewGuid());

            case VARTYPE.VT_DATE:
            case VARTYPE.VT_BYREF | VARTYPE.VT_DATE:
                return(new DateTime(1999, 12, 31, 23, 59, 59));

            case VARTYPE.VT_DISPATCH:
                return(Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")));

            case VARTYPE.VT_ERROR:
            case VARTYPE.VT_BYREF | VARTYPE.VT_ERROR:
                return(new Win32Error(5));

            case VARTYPE.VT_FILETIME:
                return(new DateTime(1999, 12, 31, 23, 59, 59).ToFileTimeStruct());

            case VARTYPE.VT_BYREF | VARTYPE.VT_BSTR:
                return(Marshal.StringToBSTR("string"));

            case VARTYPE.VT_BSTR:
            case VARTYPE.VT_LPSTR:
            case VARTYPE.VT_LPWSTR:
                return("string");

            case VARTYPE.VT_STORAGE:
                StgCreateStorageEx(Path.GetTempFileName(), STGM.STGM_DELETEONRELEASE | STGM.STGM_CREATE | STGM.STGM_DIRECT | STGM.STGM_READWRITE | STGM.STGM_SHARE_EXCLUSIVE, STGFMT.STGFMT_DOCFILE, 0, IntPtr.Zero, IntPtr.Zero, typeof(IStorage).GUID, out var iptr);
                return((IStorage)iptr);

            case VARTYPE.VT_STREAM:
                SHCreateStreamOnFileEx(TestCaseSources.SmallFile, STGM.STGM_READ | STGM.STGM_SHARE_EXCLUSIVE, 0, false, null, out var stm);
                return(stm);

            case VARTYPE.VT_UNKNOWN:
                return(Activator.CreateInstance(Type.GetTypeFromProgID("ADODB.Error")));

            case VARTYPE.VT_VECTOR | VARTYPE.VT_BSTR:
            case VARTYPE.VT_VECTOR | VARTYPE.VT_LPSTR:
            case VARTYPE.VT_VECTOR | VARTYPE.VT_LPWSTR:
                return(new[] { "A", "B", "C" });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_CF:
                return(new[] { new CLIPDATA(), new CLIPDATA() });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_CLSID:
                return(new[] { Guid.NewGuid(), Guid.NewGuid() });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_CY:
                return(new[] { 12345.6789M, 98765.4321M });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_DATE:
                return(new[] { new DateTime(1999, 12, 31, 23, 59, 59), new DateTime(2000, 1, 1, 0, 0, 1) });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_ERROR:
                return(new[] { new Win32Error(1), new Win32Error(5) });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_FILETIME:
                return(new[] { new DateTime(1999, 12, 31, 23, 59, 59).ToFileTimeStruct(), new DateTime(2000, 1, 1, 0, 0, 1).ToFileTimeStruct() });

            case VARTYPE.VT_VECTOR | VARTYPE.VT_VARIANT:
                return(new[] { new PROPVARIANT(100), new PROPVARIANT(200) });

            case VARTYPE.VT_VERSIONED_STREAM:
                return(null);

            default:
                return(null);
            }
        }
Esempio n. 14
0
 public static extern IntPtr SafeArrayCreateEx(VARTYPE vt, uint cDims, ref SAFEARRAYBOUND rgsabound, IntPtr pvExtra);
Esempio n. 15
0
 public static extern IntPtr SafeArrayCreateVector(VARTYPE vt, int lowerBound, uint cElems);
Esempio n. 16
0
 public static extern HRESULT PropVariantChangeType([Out] PROPVARIANT ppropvarDest, [In] PROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt);
Esempio n. 17
0
 public PROPVARIANT(string value)
 {
     vt = VARTYPE.VT_LPWSTR;
     p  = Marshal.StringToCoTaskMemUni(value);
 }