コード例 #1
0
ファイル: TestRoundTrips.cs プロジェクト: zicowarn/FileMeta
        public override bool RunBody(State state)
        {
            RequirePropertyHandlerRegistered();
            RequireExtHasHandler();

            const string cval         = "bcomment??";
            string       propertyName = "System.Comment";

            //Create a temp file to put metadata on
            string fileName = CreateFreshFile(1);

            var handler = new CPropertyHandler();

            handler.Initialize(fileName, 0);

            PropVariant value = new PropVariant(cval);

            handler.SetValue(new TestDriverCodePack.PropertyKey(new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9"), 6), value);
            handler.Commit();

            Marshal.ReleaseComObject(handler);  // preempt GC for CCW

            // Use API Code Pack to read the value
            IShellProperty prop = ShellObject.FromParsingName(fileName).Properties.GetProperty(propertyName);
            object         oval = prop.ValueAsObject;

            File.Delete(fileName);  // only works if all have let go of the file

            return((string)oval == cval);
        }
コード例 #2
0
ファイル: TestRoundTrips.cs プロジェクト: zicowarn/FileMeta
        public override bool RunBody(State state)
        {
            RequirePropertyHandlerRegistered();
            RequireExtHasHandler();

            const string cval1 = "할말있어";

            string[] cval2 = { "hello", "Приветствия" };

            //Create a temp file to put metadata on
            string fileName = CreateFreshFile(1);

            var handler = new CPropertyHandler();

            handler.Initialize(fileName, 0);

            PropVariant value1 = new PropVariant(cval1);
            PropVariant value2 = new PropVariant(cval2);

            // System.Comment
            handler.SetValue(new TestDriverCodePack.PropertyKey(new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9"), 6), value1);
            // System.Category
            handler.SetValue(new TestDriverCodePack.PropertyKey(new Guid("D5CDD502-2E9C-101B-9397-08002B2CF9AE"), 2), value2);
            handler.Commit();

            PropVariant getvalue1 = new PropVariant();
            PropVariant getvalue2 = new PropVariant();

            handler.GetValue(new TestDriverCodePack.PropertyKey(new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9"), 6), getvalue1);
            handler.GetValue(new TestDriverCodePack.PropertyKey(new Guid("D5CDD502-2E9C-101B-9397-08002B2CF9AE"), 2), getvalue2);
            string result1 = (string)getvalue1.Value;

            string[] result2 = (string[])getvalue2.Value;

            Marshal.ReleaseComObject(handler); // preempt GC for CCW

            File.Delete(fileName);             // only works if all have let go of the file

            return(result1 == cval1 && result2[0] == cval2[0] && result2[1] == cval2[1]);
        }
コード例 #3
0
ファイル: TestRoundTrips.cs プロジェクト: zicowarn/FileMeta
        public override bool RunBody(State state)
        {
            RequirePropertyHandlerRegistered();
            RequireExtHasHandler();

#if x86
            const string cval = "ccomment***";

            //Create a temp file to put metadata on
            string fileName = CreateFreshFile(1);

            // Use DSOFile to set the value
            var dso = new DSOFile.OleDocumentProperties();
            dso.Open(fileName);
            var sum = dso.SummaryProperties;
            sum.Comments = cval;
            dso.Save();
            dso.Close();
            Marshal.ReleaseComObject(dso);  // preempt GC for CCW

            string svalue = null;

            var handler = new CPropertyHandler();
            handler.Initialize(fileName, 0);

            PropVariant value = new PropVariant();
            handler.GetValue(new TestDriverCodePack.PropertyKey(new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9"), 6), value);
            svalue = (string)value.Value;

            Marshal.ReleaseComObject(handler); // preempt GC for CCW

            File.Delete(fileName);             // only works if all have let go of the file

            return(svalue == cval);
#else
            state.RecordEntry("Test skipped because DSOFile is 32-bit only");
            return(true);
#endif
        }
コード例 #4
0
        private void SetPropertyValue(string fileName, TestDriverCodePack.ShellPropertyDescription propDesc, IShellProperty prop)
        {
            Type   t = propDesc.ValueType;
            string s;

            try
            {
                if (t == typeof(string))
                {
                    object obj = GetEnumValueForProperty(propDesc);

                    if (obj != null)
                    {
                        s = (string)obj;
                    }
                    else
                    {
                        s = RandomString();
                    }

                    savedProps.Add(new SavedProp {
                        Name = prop.CanonicalName, Value = s
                    });
                    //(prop as ShellProperty<string>).Value = s;

                    // Workaround Code Pack bug with 1 char strings by using PropertyHandler
                    // Have to open and release each time to avoid lock problems - still, it ups the pounding
                    var handler = new CPropertyHandler();
                    handler.Initialize(fileName, 0);

                    PropVariant value = new PropVariant(s);
                    handler.SetValue(new TestDriverCodePack.PropertyKey(prop.PropertyKey.FormatId, prop.PropertyKey.PropertyId), value);
                    handler.Commit();

                    Marshal.ReleaseComObject(handler);  // preempt GC for CCW
                }
                else if (t == typeof(string[]))
                {
                    string[] ss = GetStringArrayValueForProperty(propDesc);

                    savedProps.Add(new SavedProp {
                        Name = prop.CanonicalName, Value = ss
                    });
                    //(prop as ShellProperty<string[]>).Value = ss;

                    // Workaround Code Pack bug with 1 char strings by using PropertyHandler
                    // Have to open and release each time to avoid lock problems - still, it ups the pounding
                    var handler = new CPropertyHandler();
                    handler.Initialize(fileName, 0);

                    PropVariant value = new PropVariant(ss);
                    handler.SetValue(new TestDriverCodePack.PropertyKey(prop.PropertyKey.FormatId, prop.PropertyKey.PropertyId), value);
                    handler.Commit();

                    Marshal.ReleaseComObject(handler);  // preempt GC for CCW
                }
                else if (t == typeof(Int16?) || t == typeof(Int32?) || t == typeof(UInt16?) || t == typeof(UInt32?))
                {
                    object obj = GetEnumValueForProperty(propDesc);

                    if (t == typeof(Int16?))
                    {
                        Int16?val = obj != null ? (Int16?)obj : (Int16?)NullableRandomNumber(-max16, max16);
                        savedProps.Add(new SavedProp {
                            Name = prop.CanonicalName, Value = val
                        });
                        (prop as ShellProperty <Int16?>).Value = val;
                    }
                    else if (t == typeof(Int32?))
                    {
                        Int32?val = obj != null ? (Int32?)obj : (Int32?)NullableRandomNumber(-max32, max32);
                        savedProps.Add(new SavedProp {
                            Name = prop.CanonicalName, Value = val
                        });
                        (prop as ShellProperty <Int32?>).Value = val;
                    }
                    else if (t == typeof(UInt16?))
                    {
                        UInt16?val = obj != null ? (UInt16?)obj : (UInt16?)NullableRandomNumber(max16);
                        savedProps.Add(new SavedProp {
                            Name = prop.CanonicalName, Value = val
                        });
                        (prop as ShellProperty <UInt16?>).Value = val;
                    }
                    else // UInt32?
                    {
                        UInt32?val = obj != null ? (UInt32?)obj : (UInt32?)NullableRandomNumber(max16);
                        savedProps.Add(new SavedProp {
                            Name = prop.CanonicalName, Value = val
                        });
                        (prop as ShellProperty <UInt32?>).Value = val;
                    }
                }
                else if (t == typeof(Int32[]))
                {
                    Int32[] vals = new Int32[4];
                    for (int i = 0; i < 4; i++)
                    {
                        vals[i] = RandomNumber(-max32, max32);
                    }
                    savedProps.Add(new SavedProp {
                        Name = prop.CanonicalName, Value = vals
                    });
                    (prop as ShellProperty <Int32[]>).Value = vals;
                }
                else if (t == typeof(UInt32[]))
                {
                    UInt32[] vals = new UInt32[4];
                    for (int i = 0; i < 4; i++)
                    {
                        vals[i] = (UInt32)RandomNumber(max32);
                    }
                    savedProps.Add(new SavedProp {
                        Name = prop.CanonicalName, Value = vals
                    });
                    (prop as ShellProperty <UInt32[]>).Value = vals;
                }
                else if (t == typeof(bool?))
                {
                    int? r     = NullableRandomNumber();
                    bool?value = (r == null) ? (bool?)null : (r % 2 == 0);
                    savedProps.Add(new SavedProp {
                        Name = prop.CanonicalName, Value = value
                    });
                    (prop as ShellProperty <bool?>).Value = value;
                }
                else if (t == typeof(DateTime?))
                {
                    DateTime dt = new DateTime((long)(random.NextDouble() * (maxTocks - minTicks) + minTicks));
                    savedProps.Add(new SavedProp {
                        Name = prop.CanonicalName, Value = dt
                    });
                    (prop as ShellProperty <DateTime?>).Value = dt;
                }
                else if (t == typeof(double?))
                {
                    // fails in Code Pack, so skip
                    //(prop as ShellProperty<double>).Value = (double)RandomNumber(max64);
                }
                else if (t == typeof(Int64?))
                {
                    // fails in Code Pack, so skip
                    //(prop as ShellProperty<Int64>).Value = RandomNumber(max64);
                }
                else if (t == typeof(UInt64?))
                {
                    // fails in Code Pack, so skip
                    // (prop as ShellProperty<UInt64>).Value = (UInt64) RandomNumber(max64);
                }
                else if (t == typeof(byte?))
                {
                    // The Code Pack does not support setting these, so skip for now
                    //(prop as ShellProperty<byte>).Value = (byte)RandomNumber(max8);
                }
                else if (t == typeof(byte[]))
                {
                    // The Code Pack does not support setting these, so skip for now
                    // Mostly 128 byte arrays e.g. System.Photo.MakerNote
                    //byte[] bs = new byte[128];
                    //random.NextBytes(bs);
                    //(prop as ShellProperty<byte[]>).Value = bs;
                }
                else if (t == typeof(object) || t == typeof(IntPtr?) || t == typeof(System.Runtime.InteropServices.ComTypes.IStream))
                {
                    // ignore these, they are system artefacts like group header props, and don't appear in settable lists
                }
                else
                {
                    throw new System.Exception("Need " + t.ToString() + " for " + propDesc.CanonicalName);
                }
            }
            catch (System.Exception e)
            {
                throw new System.Exception(String.Format("Error setting property {0} to '{1}'",
                                                         savedProps.Last().Name, ToDisplayString(savedProps.Last().Value)), e);
            }
        }
コード例 #5
0
        private int GetAndCheckValues(string fileName, State state, bool useCodePack = false)
        {
            int errors = 0;
            CPropertyHandler handler = null;

            if (!useCodePack)
            {
                handler = new CPropertyHandler();
                handler.Initialize(fileName, 0);
            }

            foreach (var saved in savedProps)
            {
                IShellProperty prop = ShellObject.FromParsingName(fileName).Properties.GetProperty(saved.Name);

                object objVal;
                if (useCodePack)
                {
                    objVal = prop.ValueAsObject;
                }
                else
                {
                    var value = new PropVariant();
                    handler.GetValue(new TestDriverCodePack.PropertyKey(prop.PropertyKey.FormatId, prop.PropertyKey.PropertyId), value);
                    objVal = value.Value;
                }

                bool bSame = false;
                Type t     = objVal != null?objVal.GetType() : null;

                if (t == typeof(Int16) || t == typeof(Int32) || t == typeof(UInt16) || t == typeof(UInt32) || t == typeof(bool))
                {
                    bSame = objVal.Equals(saved.Value);
                }
                else if (t == typeof(string))
                {
                    bSame = (string)objVal == (string)saved.Value;
                }
                else if (t == typeof(string[]))
                {
                    string[] oss = (string[])objVal;
                    string[] sss = (string[])saved.Value;
                    bSame = true;
                    if (oss.Length == sss.Length)
                    {
                        for (int i = 0; i < oss.Length; i++)
                        {
                            if (oss[i] != sss[i])
                            {
                                bSame = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        bSame = false;
                    }
                }
                else if (t == typeof(Int32[]) || t == typeof(UInt32[]))
                {
                    int[] os = (int[])objVal;
                    int[] ss = (int[])saved.Value;
                    bSame = true;
                    if (os.Length == ss.Length)
                    {
                        for (int i = 0; i < os.Length; i++)
                        {
                            if (!os[i].Equals(ss[i]))
                            {
                                bSame = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        bSame = false;
                    }
                }
                else if (t == typeof(DateTime))
                {
                    DateTime save = (DateTime)(saved.Value);
                    DateTime read = (DateTime)objVal;

                    // Compare this way because exact ticks don't survive a round trip to text, and legibility
                    // is more useful than serializing just a number of ticks
                    bSame = save.Year == read.Year && save.Month == read.Month && save.Day == read.Day &&
                            save.Hour == read.Hour && save.Minute == read.Minute && save.Second == read.Second &&
                            save.Millisecond == read.Millisecond;
                }
                else
                {
                    bSame = (saved.Value == null && objVal == null);
                }

                if (!bSame)
                {
                    state.RecordEntry(String.Format("Mismatch for property {0}: expected {1}, got {2}", saved.Name,
                                                    saved.Value != null ? ToDisplayString(saved.Value) : "Null", objVal != null ? ToDisplayString(objVal) : "Null"));
                    errors++;
                }
            }

            if (!useCodePack)
            {
                Marshal.ReleaseComObject(handler);  // preempt GC for CCW
            }
            return(errors);
        }
コード例 #6
0
ファイル: TestRoundTrips.cs プロジェクト: zicowarn/FileMeta
        public override bool RunBody(State state)
        {
            RequirePropertyHandlerRegistered();
            RequireExtHasHandler();

            string       propertyName1 = "System.Comment";
            const string cval1         = "comment";
            const string cval1a        = "commenta";
            Guid         format1       = new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9");
            int          id1           = 6;

            string       propertyName2 = "System.Title";
            const string cval2         = "title";
            const string cval2a        = "titlea";
            Guid         format2       = new Guid("F29F85E0-4FF9-1068-AB91-08002B27B3D9");
            int          id2           = 2;

            //Create a temp file to put metadata on
            string fileName = CreateFreshFile(1);

            // Use API Code Pack to set the values
            IShellProperty prop1 = ShellObject.FromParsingName(fileName).Properties.GetProperty(propertyName1);

            (prop1 as ShellProperty <string>).Value = cval1;
            IShellProperty prop2 = ShellObject.FromParsingName(fileName).Properties.GetProperty(propertyName2);

            (prop2 as ShellProperty <string>).Value = cval2;

            var handler = new CPropertyHandler();

            handler.Initialize(fileName, 0);

            // Read the values with the Property Handler
            PropVariant getvalue1 = new PropVariant();
            PropVariant getvalue2 = new PropVariant();

            handler.GetValue(new TestDriverCodePack.PropertyKey(format1, id1), getvalue1);
            handler.GetValue(new TestDriverCodePack.PropertyKey(format2, id2), getvalue2);
            string result1 = (string)getvalue1.Value;
            string result2 = (string)getvalue2.Value;

            if (result1 != cval1 || result2 != cval2)
            {
                return(false);
            }

            // Set the values with the Property Handler
            PropVariant value1 = new PropVariant(cval1a);
            PropVariant value2 = new PropVariant(cval2a);

            // System.Comment
            handler.SetValue(new TestDriverCodePack.PropertyKey(format1, id1), value1);
            // System.Category
            handler.SetValue(new TestDriverCodePack.PropertyKey(format2, id2), value2);
            handler.Commit();

            // Read the updated values with the Property Handler
            getvalue1 = new PropVariant();
            getvalue2 = new PropVariant();
            handler.GetValue(new TestDriverCodePack.PropertyKey(format1, id1), getvalue1);
            handler.GetValue(new TestDriverCodePack.PropertyKey(format2, id2), getvalue2);
            result1 = (string)getvalue1.Value;
            result2 = (string)getvalue2.Value;

            Marshal.ReleaseComObject(handler); // preempt GC for CCW

            File.Delete(fileName);             // only works if all have let go of the file

            return(result1 == cval1a && result2 == cval2a);
        }