From e9c9b6041bc7bcd37c71f74c1c0d2e9496af039f Mon Sep 17 00:00:00 2001 From: Max Mommersteeg Date: Mon, 24 Dec 2018 11:11:29 +0100 Subject: [PATCH] Added StyleCop with a ruleset. Formatted code according to rules. --- StyleCop.ruleset | 115 ++++++++++++++++++ src/net/Qml.Net.Benchmarks/Config.cs | 2 +- .../Qml.Net.Benchmarks.csproj | 5 + .../Qml.Net.Benchmarks/ReferenceBenchmarks.cs | 11 +- src/net/Qml.Net.Sandbox/Program.UI.cs | 8 +- .../Qml.Net.Sandbox/Qml.Net.Sandbox.csproj | 5 + src/net/Qml.Net.Tests/BaseTests.cs | 2 +- .../Internal/ObjectTaggerTests.cs | 20 ++- src/net/Qml.Net.Tests/MockTypeCreator.cs | 2 +- src/net/Qml.Net.Tests/Qml.Net.Tests.csproj | 5 + src/net/Qml.Net.Tests/Qml/AwaitTests.cs | 8 +- src/net/Qml.Net.Tests/Qml/BaseQmlTests.cs | 41 ++++--- src/net/Qml.Net.Tests/Qml/BoolTests.cs | 10 +- src/net/Qml.Net.Tests/Qml/CharTests.cs | 12 +- .../Qml.Net.Tests/Qml/DateTimeOffsetTests.cs | 10 +- src/net/Qml.Net.Tests/Qml/DateTimeTests.cs | 7 +- src/net/Qml.Net.Tests/Qml/DoubleTests.cs | 5 +- src/net/Qml.Net.Tests/Qml/IntTests.cs | 5 +- src/net/Qml.Net.Tests/Qml/JsValueTests.cs | 71 +++++------ src/net/Qml.Net.Tests/Qml/LifetimeTests.cs | 7 +- src/net/Qml.Net.Tests/Qml/ListModelTests.cs | 20 +-- .../Qml/MvvmInteropBehaviorTests.cs | 34 ++++-- src/net/Qml.Net.Tests/Qml/NetVariantTests.cs | 27 ++-- src/net/Qml.Net.Tests/Qml/ObjectTests.cs | 20 ++- .../Qml/QQmlApplicationEngineTests.cs | 2 +- .../Qml.Net.Tests/Qml/SerializationTests.cs | 10 +- src/net/Qml.Net.Tests/Qml/SignalTests.cs | 83 +++++++------ src/net/Qml.Net.Tests/Qml/SingletonTests.cs | 3 +- src/net/Qml.Net.Tests/Qml/StringTests.cs | 1 - src/net/Qml.Net.Tests/Qml/UIntTests.cs | 1 - src/net/Qml.Net.Tests/Types/CallbacksTests.cs | 44 +++---- .../Qml.Net.Tests/Types/NetReferenceTests.cs | 3 +- .../Types/NetTypeManagerTests.cs | 38 +++--- .../Types/NetVariantListTests.cs | 12 +- src/net/Qml.Net/BaseDisposable.cs | 11 +- .../Extensions/INetJsValueExtensions.cs | 4 +- src/net/Qml.Net/Host.cs | 8 +- src/net/Qml.Net/INetJsValue.cs | 2 +- .../Behaviors/MvvmQmlInteropBehavior.cs | 36 +++--- src/net/Qml.Net/Internal/DefaultCallbacks.cs | 80 ++++++------ src/net/Qml.Net/Internal/Helpers.cs | 24 ++-- .../Qml.Net/Internal/IQmlInteropBehavior.cs | 6 +- src/net/Qml.Net/Internal/Interop.cs | 50 ++++---- src/net/Qml.Net/Internal/InteropBehaviors.cs | 11 +- .../LinuxDllImportLibraryPathResolver.cs | 4 +- .../MacDllImportLibraryPathResolver.cs | 16 +-- .../Qml.Net/Internal/NativeSymbolAttribute.cs | 2 +- src/net/Qml.Net/Internal/ObjectSignals.cs | 11 +- src/net/Qml.Net/Internal/ObjectTagger.cs | 2 +- src/net/Qml.Net/Internal/Qml/NetJsValue.cs | 38 +++--- src/net/Qml.Net/Internal/Qml/NetTestHelper.cs | 3 +- src/net/Qml.Net/Internal/Qml/NetVariant.cs | 85 +++++++++---- .../Qml.Net/Internal/Qml/NetVariantList.cs | 21 +++- src/net/Qml.Net/Internal/Types/Callbacks.cs | 53 ++++---- src/net/Qml.Net/Internal/Types/NetDelegate.cs | 10 +- .../Qml.Net/Internal/Types/NetMethodInfo.cs | 50 +++++--- .../Qml.Net/Internal/Types/NetPropertyInfo.cs | 34 ++++-- .../Qml.Net/Internal/Types/NetReference.cs | 48 +++++--- .../Qml.Net/Internal/Types/NetSignalInfo.cs | 17 ++- src/net/Qml.Net/Internal/Types/NetTypeInfo.cs | 94 ++++++++------ .../Qml.Net/Internal/Types/NetTypeManager.cs | 5 +- .../WindowsDllImportLibraryPathResolver.cs | 4 +- src/net/Qml.Net/NotifySignalAttribute.cs | 5 +- src/net/Qml.Net/QGuiApplication.cs | 43 ++++--- src/net/Qml.Net/QQmlApplicationEngine.cs | 37 +++--- src/net/Qml.Net/QQuickStyle.cs | 4 +- src/net/Qml.Net/QResource.cs | 5 +- src/net/Qml.Net/Qml.Net.csproj | 2 + src/net/Qml.Net/Qml.cs | 2 +- src/net/Qml.Net/Qt.cs | 9 +- src/net/Qml.Net/QtWebEngine.cs | 3 +- .../Qml.Net/Serialization/NewtonSerializer.cs | 2 +- src/net/Qml.Net/SignalAttribute.cs | 5 +- src/net/Qml.Net/Signals.cs | 6 +- src/net/Qml.Net/TypeCreator.cs | 2 +- src/net/Qml.Net/Utilities.cs | 5 +- 76 files changed, 896 insertions(+), 612 deletions(-) create mode 100644 StyleCop.ruleset diff --git a/StyleCop.ruleset b/StyleCop.ruleset new file mode 100644 index 00000000..d851a79a --- /dev/null +++ b/StyleCop.ruleset @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/net/Qml.Net.Benchmarks/Config.cs b/src/net/Qml.Net.Benchmarks/Config.cs index db993792..80f3a0bf 100644 --- a/src/net/Qml.Net.Benchmarks/Config.cs +++ b/src/net/Qml.Net.Benchmarks/Config.cs @@ -4,7 +4,7 @@ using BenchmarkDotNet.Jobs; namespace Qml.Net.Benchmarks { - public class Config: ManualConfig + public class Config : ManualConfig { public Config() { diff --git a/src/net/Qml.Net.Benchmarks/Qml.Net.Benchmarks.csproj b/src/net/Qml.Net.Benchmarks/Qml.Net.Benchmarks.csproj index b93a7e07..afc9d3b2 100644 --- a/src/net/Qml.Net.Benchmarks/Qml.Net.Benchmarks.csproj +++ b/src/net/Qml.Net.Benchmarks/Qml.Net.Benchmarks.csproj @@ -2,6 +2,7 @@ Exe netcoreapp2.1 + ../../../StyleCop.ruleset false @@ -9,5 +10,9 @@ + + all + runtime; build; native; contentfiles; analyzers + \ No newline at end of file diff --git a/src/net/Qml.Net.Benchmarks/ReferenceBenchmarks.cs b/src/net/Qml.Net.Benchmarks/ReferenceBenchmarks.cs index a0a43c0e..7da066ac 100644 --- a/src/net/Qml.Net.Benchmarks/ReferenceBenchmarks.cs +++ b/src/net/Qml.Net.Benchmarks/ReferenceBenchmarks.cs @@ -18,11 +18,11 @@ namespace Qml.Net.Benchmarks _initialized = true; } } - + [IterationSetup] public void Setup() { - _guiApplication = new QGuiApplication(new[]{"-platform", "offscreen"}); + _guiApplication = new QGuiApplication(new[] { "-platform", "offscreen" }); _qmlApplicationEngine = new QQmlApplicationEngine(); } @@ -32,7 +32,7 @@ namespace Qml.Net.Benchmarks _qmlApplicationEngine.Dispose(); _guiApplication.Dispose(); } - + [Benchmark] public void Run() { @@ -73,7 +73,7 @@ namespace Qml.Net.Benchmarks public class QmlType { private readonly InnerType _object = new InnerType(); - + public object GetObject() { return _object; @@ -83,10 +83,9 @@ namespace Qml.Net.Benchmarks { _guiApplication.Exit(); } - + public class InnerType { - } } } diff --git a/src/net/Qml.Net.Sandbox/Program.UI.cs b/src/net/Qml.Net.Sandbox/Program.UI.cs index e981d223..51bd8f75 100644 --- a/src/net/Qml.Net.Sandbox/Program.UI.cs +++ b/src/net/Qml.Net.Sandbox/Program.UI.cs @@ -12,7 +12,7 @@ namespace Qml.Net.Sandbox public class TestQmlImport { public static TestObject ts = new TestObject(); - + public TestObject GetObject() { return ts; @@ -30,17 +30,17 @@ namespace Qml.Net.Sandbox static int Main(string[] args) { Qt.PutEnv("QV4_MM_AGGRESSIVE_GC", "1"); - + using (var app = new QGuiApplication(args)) { using (var engine = new QQmlApplicationEngine()) { engine.AddImportPath(Path.Combine(Directory.GetCurrentDirectory(), "Qml")); - + Qml.RegisterType("test"); engine.Load("main.qml"); - + return app.Exec(); } } diff --git a/src/net/Qml.Net.Sandbox/Qml.Net.Sandbox.csproj b/src/net/Qml.Net.Sandbox/Qml.Net.Sandbox.csproj index a1b6365c..33a6a349 100644 --- a/src/net/Qml.Net.Sandbox/Qml.Net.Sandbox.csproj +++ b/src/net/Qml.Net.Sandbox/Qml.Net.Sandbox.csproj @@ -2,6 +2,7 @@ Exe netcoreapp2.1 + ../../../StyleCop.ruleset 7.1 false $(MSBuildProjectDirectory) @@ -15,6 +16,10 @@ + + all + runtime; build; native; contentfiles; analyzers + diff --git a/src/net/Qml.Net.Tests/BaseTests.cs b/src/net/Qml.Net.Tests/BaseTests.cs index 3aeb9b7f..1e060f36 100644 --- a/src/net/Qml.Net.Tests/BaseTests.cs +++ b/src/net/Qml.Net.Tests/BaseTests.cs @@ -11,7 +11,7 @@ namespace Qml.Net.Tests { Monitor.Enter(LockObject); } - + public virtual void Dispose() { Monitor.Exit(LockObject); diff --git a/src/net/Qml.Net.Tests/Internal/ObjectTaggerTests.cs b/src/net/Qml.Net.Tests/Internal/ObjectTaggerTests.cs index cd8657ff..6a10d4d1 100644 --- a/src/net/Qml.Net.Tests/Internal/ObjectTaggerTests.cs +++ b/src/net/Qml.Net.Tests/Internal/ObjectTaggerTests.cs @@ -1,12 +1,9 @@ -using Qml.Net.Internal; -using System; +using System; using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using Xunit; -using FluentAssertions; using System.Threading; +using FluentAssertions; +using Qml.Net.Internal; +using Xunit; namespace Qml.Net.Tests.Internal { @@ -21,7 +18,7 @@ namespace Qml.Net.Tests.Internal { ObjectTagger tagger = new ObjectTagger(10); List handledObjects = new List(); - for(int i=0; i < 9; i++) + for (int i = 0; i < 9; i++) { var obj = new object(); tagger.GetOrCreateTag(obj); @@ -42,15 +39,16 @@ namespace Qml.Net.Tests.Internal tagger.GetOrCreateTag(obj); handledObjects.Add(obj); } - //Ids are all used + + // Ids are all used. handledObjects.Clear(); GC.Collect(2, GCCollectionMode.Forced, true); Thread.Sleep(100); - //the next one is the already prepared next id + // The next one is the already prepared next id. var obj10 = new object(); var tag10 = tagger.GetOrCreateTag(obj10); tag10.Should().Be(10ul); - //the next after that will overflow + // The next after that will overflow. var obj1 = new object(); var tag1 = tagger.GetOrCreateTag(obj1); tag1.Should().Be(1ul); diff --git a/src/net/Qml.Net.Tests/MockTypeCreator.cs b/src/net/Qml.Net.Tests/MockTypeCreator.cs index 6a58b5b8..0a336b00 100644 --- a/src/net/Qml.Net.Tests/MockTypeCreator.cs +++ b/src/net/Qml.Net.Tests/MockTypeCreator.cs @@ -10,7 +10,7 @@ namespace Qml.Net.Tests public MockTypeCreator(params Tuple[] instances) { _instances = new Dictionary(); - foreach(var tuple in instances) + foreach (var tuple in instances) { _instances[tuple.Item1] = tuple.Item2; } diff --git a/src/net/Qml.Net.Tests/Qml.Net.Tests.csproj b/src/net/Qml.Net.Tests/Qml.Net.Tests.csproj index 4e2753a5..2ded14a2 100644 --- a/src/net/Qml.Net.Tests/Qml.Net.Tests.csproj +++ b/src/net/Qml.Net.Tests/Qml.Net.Tests.csproj @@ -1,12 +1,17 @@  netcoreapp2.1 + ../../../StyleCop.ruleset false + + all + runtime; build; native; contentfiles; analyzers + diff --git a/src/net/Qml.Net.Tests/Qml/AwaitTests.cs b/src/net/Qml.Net.Tests/Qml/AwaitTests.cs index 1990dbd4..14245a40 100644 --- a/src/net/Qml.Net.Tests/Qml/AwaitTests.cs +++ b/src/net/Qml.Net.Tests/Qml/AwaitTests.cs @@ -15,20 +15,18 @@ namespace Qml.Net.Tests.Qml { return Task.CompletedTask; } - + public virtual Task TestAsyncWithResult() { - return Task.FromResult(""); + return Task.FromResult(string.Empty); } public virtual void TestMethod() { - } public virtual void TestMethodWithArg(string arg) { - } } @@ -59,7 +57,7 @@ namespace Qml.Net.Tests.Qml SynchronizationContext.SetSynchronizationContext(oldContext); } } - + [Fact] public void Can_await_on_task_with_result() { diff --git a/src/net/Qml.Net.Tests/Qml/BaseQmlTests.cs b/src/net/Qml.Net.Tests/Qml/BaseQmlTests.cs index ac5235b6..fec3ccbc 100644 --- a/src/net/Qml.Net.Tests/Qml/BaseQmlTests.cs +++ b/src/net/Qml.Net.Tests/Qml/BaseQmlTests.cs @@ -31,6 +31,7 @@ namespace Qml.Net.Tests.Qml { private readonly QGuiApplication _coreApplication; protected readonly QQmlApplicationEngine qmlApplicationEngine; + protected MockTypeCreator TypeCreator { get; private set; } readonly List _registeredTypes = new List(); @@ -38,7 +39,7 @@ namespace Qml.Net.Tests.Qml protected AbstractBaseQmlTests() { - _coreApplication = new QGuiApplication(new []{ "-platform", "offscreen" }); + _coreApplication = new QGuiApplication(new[] { "-platform", "offscreen" }); qmlApplicationEngine = new QQmlApplicationEngine(); TypeCreator = new MockTypeCreator(); Net.TypeCreator.Current = TypeCreator; @@ -61,10 +62,11 @@ namespace Qml.Net.Tests.Qml { CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken ct = cts.Token; - Task.Factory.StartNew(() => + Task.Factory.StartNew( + () => { Thread.Sleep(timeoutMs); - if(!ct.IsCancellationRequested) + if (!ct.IsCancellationRequested) { _coreApplication.Exit(-1); } @@ -77,18 +79,20 @@ namespace Qml.Net.Tests.Qml protected void RunQmlTest(string instanceId, string componentOnCompletedCode) { - NetTestHelper.RunQml(qmlApplicationEngine, - string.Format(@" - import QtQuick 2.0 - import tests 1.0 - {0} {{ - id: {1} - Component.onCompleted: function() {{ - {2} + NetTestHelper.RunQml( + qmlApplicationEngine, + string.Format( + @" + import QtQuick 2.0 + import tests 1.0 + {0} {{ + id: {1} + Component.onCompleted: function() {{ + {2} + }} }} - }} - ", - typeof(TTypeToRegister).Name, + ", + typeof(TTypeToRegister).Name, instanceId, componentOnCompletedCode)); } @@ -104,7 +108,8 @@ namespace Qml.Net.Tests.Qml } } - public abstract class BaseQmlTests : AbstractBaseQmlTests where T:class + public abstract class BaseQmlTests : AbstractBaseQmlTests + where T : class { protected readonly Mock Mock; @@ -116,7 +121,8 @@ namespace Qml.Net.Tests.Qml } } - public abstract class BaseQmlTestsWithInstance : AbstractBaseQmlTests where T : class, new() + public abstract class BaseQmlTestsWithInstance : AbstractBaseQmlTests + where T : class, new() { protected readonly T Instance; @@ -128,7 +134,8 @@ namespace Qml.Net.Tests.Qml } } - public abstract class BaseQmlMvvmTestsWithInstance : AbstractBaseQmlTests where T : class, new() + public abstract class BaseQmlMvvmTestsWithInstance : AbstractBaseQmlTests + where T : class, new() { protected readonly T Instance; diff --git a/src/net/Qml.Net.Tests/Qml/BoolTests.cs b/src/net/Qml.Net.Tests/Qml/BoolTests.cs index a7b2ba6a..b8dc630c 100644 --- a/src/net/Qml.Net.Tests/Qml/BoolTests.cs +++ b/src/net/Qml.Net.Tests/Qml/BoolTests.cs @@ -11,15 +11,13 @@ namespace Qml.Net.Tests.Qml public virtual bool Property { get; set; } public virtual bool? Nullable { get; set; } - + public virtual void MethodParameter(bool value) { - } public virtual void MethodParameterNullable(bool? value) { - } public virtual bool MethodReturn() @@ -36,7 +34,7 @@ namespace Qml.Net.Tests.Qml @" test.property = true "); - + Mock.VerifySet(x => x.Property = true, Times.Once); } @@ -81,7 +79,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Property, Times.Once); Mock.Verify(x => x.MethodParameter(It.Is(y => y))); } - + [Fact] public void Can_read_nullable_bool_no_value() { @@ -97,7 +95,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Nullable, Times.Once); Mock.Verify(x => x.MethodParameterNullable(It.Is(y => y == null)), Times.Once); } - + [Fact] public void Can_read_nullable_bool_with_value() { diff --git a/src/net/Qml.Net.Tests/Qml/CharTests.cs b/src/net/Qml.Net.Tests/Qml/CharTests.cs index 30cbef45..282958a9 100644 --- a/src/net/Qml.Net.Tests/Qml/CharTests.cs +++ b/src/net/Qml.Net.Tests/Qml/CharTests.cs @@ -11,15 +11,13 @@ namespace Qml.Net.Tests.Qml public virtual char Property { get; set; } public virtual char? Nullable { get; set; } - + public virtual void MethodParameter(char value) { - } public virtual void MethodParameterNullable(char? value) { - } public virtual char MethodReturn() @@ -27,12 +25,12 @@ namespace Qml.Net.Tests.Qml return char.MinValue; } } - + [Fact] public void Can_read_write_char_null() { Mock.Setup(x => x.Property).Returns((char)0); - + RunQmlTest( "test", @" @@ -98,7 +96,7 @@ namespace Qml.Net.Tests.Qml Mock.Verify(x => x.MethodParameter(It.IsIn('Ώ')), Times.Once); } - + [Fact] public void Can_read_nullable_char_no_value() { @@ -114,7 +112,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Nullable, Times.Once); Mock.Verify(x => x.MethodParameterNullable(It.Is(y => y == null)), Times.Once); } - + [Fact] public void Can_read_nullable_char_with_value() { diff --git a/src/net/Qml.Net.Tests/Qml/DateTimeOffsetTests.cs b/src/net/Qml.Net.Tests/Qml/DateTimeOffsetTests.cs index 5ebc0613..3e152b77 100644 --- a/src/net/Qml.Net.Tests/Qml/DateTimeOffsetTests.cs +++ b/src/net/Qml.Net.Tests/Qml/DateTimeOffsetTests.cs @@ -15,12 +15,10 @@ namespace Qml.Net.Tests.Qml public virtual void Method(DateTimeOffset value) { - } - + public virtual void MethodNullable(DateTimeOffset? value) { - } } @@ -28,7 +26,7 @@ namespace Qml.Net.Tests.Qml public void Can_read_write_property() { var value = DateTimeOffset.Now; - // This trims some percision off of the milliseconds, makes the comparison accurate. + // This trims some precision off of the milliseconds, makes the comparison accurate. value = new DateTimeOffset(value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second, value.Millisecond, value.Offset); Mock.SetupGet(x => x.Property).Returns(value); Mock.SetupSet(x => x.Property = value); @@ -42,7 +40,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Property, Times.Once); Mock.VerifySet(x => x.Property = value, Times.Once); } - + [Fact] public void Can_read_write_property_nullable_with_value() { @@ -62,7 +60,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Nullable, Times.Once); Mock.VerifySet(x => x.Nullable = value); } - + [Fact] public void Can_read_write_property_nullable_without_value() { diff --git a/src/net/Qml.Net.Tests/Qml/DateTimeTests.cs b/src/net/Qml.Net.Tests/Qml/DateTimeTests.cs index b6796d09..35ae3dac 100644 --- a/src/net/Qml.Net.Tests/Qml/DateTimeTests.cs +++ b/src/net/Qml.Net.Tests/Qml/DateTimeTests.cs @@ -1,5 +1,4 @@ -using Qml.Net.Internal.Qml; -using System; +using System; using Moq; using Xunit; @@ -30,7 +29,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Property, Times.Once); Mock.VerifySet(x => x.Property = value, Times.Once); } - + [Fact] public void Can_read_write_property_nullable_with_value() { @@ -48,7 +47,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifyGet(x => x.Nullable, Times.Once); Mock.VerifySet(x => x.Nullable = value); } - + [Fact] public void Can_read_write_property_nullable_without_value() { diff --git a/src/net/Qml.Net.Tests/Qml/DoubleTests.cs b/src/net/Qml.Net.Tests/Qml/DoubleTests.cs index 104327ae..8145c5ee 100644 --- a/src/net/Qml.Net.Tests/Qml/DoubleTests.cs +++ b/src/net/Qml.Net.Tests/Qml/DoubleTests.cs @@ -12,7 +12,6 @@ namespace Qml.Net.Tests.Qml public virtual void MethodParameter(double value) { - } public virtual double MethodReturn() @@ -20,12 +19,12 @@ namespace Qml.Net.Tests.Qml return 0; } } - + [Fact] public void Can_read_write_int_min_value() { Mock.Setup(x => x.Property).Returns(double.MinValue); - + RunQmlTest( "test", @" diff --git a/src/net/Qml.Net.Tests/Qml/IntTests.cs b/src/net/Qml.Net.Tests/Qml/IntTests.cs index ef3db337..5baf3f07 100644 --- a/src/net/Qml.Net.Tests/Qml/IntTests.cs +++ b/src/net/Qml.Net.Tests/Qml/IntTests.cs @@ -12,7 +12,6 @@ namespace Qml.Net.Tests.Qml public virtual void MethodParameter(int value) { - } public virtual int MethodReturn() @@ -20,12 +19,12 @@ namespace Qml.Net.Tests.Qml return 0; } } - + [Fact] public void Can_read_write_int_min_value() { Mock.Setup(x => x.Property).Returns(int.MinValue); - + RunQmlTest( "test", @" diff --git a/src/net/Qml.Net.Tests/Qml/JsValueTests.cs b/src/net/Qml.Net.Tests/Qml/JsValueTests.cs index 0ff04efc..945c498b 100644 --- a/src/net/Qml.Net.Tests/Qml/JsValueTests.cs +++ b/src/net/Qml.Net.Tests/Qml/JsValueTests.cs @@ -1,12 +1,9 @@ using System; using System.Collections.Generic; using FluentAssertions; -using FluentAssertions.Common; -using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Moq; -using Qml.Net.Internal.Qml; -using Xunit; using Qml.Net.Extensions; +using Xunit; namespace Qml.Net.Tests.Qml { @@ -16,24 +13,20 @@ namespace Qml.Net.Tests.Qml { public virtual void Method(dynamic value) { - } public virtual void Method(dynamic value1, dynamic value2) { - } public virtual void MethodWithoutParams() { - } - + public virtual void MethodWithParameters(string param1, int param2) { - } - + public virtual void CallMethodWithJsValue(INetJsValue value, INetJsValue method) { method.Call(value); @@ -43,11 +36,11 @@ namespace Qml.Net.Tests.Qml { return null; } - + public class TestObject { public int CalledCount { get; set; } - + public void TestMethod() { CalledCount++; @@ -61,7 +54,7 @@ namespace Qml.Net.Tests.Qml INetJsValue jsValue = null; Mock.Setup(x => x.Method(It.IsAny())) .Callback(new Action(x => jsValue = x)); - + RunQmlTest( "test", @" @@ -72,7 +65,7 @@ namespace Qml.Net.Tests.Qml jsValue.Should().NotBeNull(); jsValue.IsCallable.Should().BeTrue(); } - + [Fact] public void Can_send_non_function() { @@ -82,7 +75,7 @@ namespace Qml.Net.Tests.Qml { jsValue = x; })); - + RunQmlTest( "test", @" @@ -104,7 +97,7 @@ namespace Qml.Net.Tests.Qml result = x(); })); Mock.Setup(x => x.MethodWithoutParams()); - + RunQmlTest( "test", @" @@ -128,7 +121,7 @@ namespace Qml.Net.Tests.Qml result = x("test1", 4); })); Mock.Setup(x => x.MethodWithParameters("test1", 4)); - + RunQmlTest( "test", @" @@ -151,7 +144,7 @@ namespace Qml.Net.Tests.Qml { x(testObject); })); - + RunQmlTest( "test", @" @@ -164,13 +157,13 @@ namespace Qml.Net.Tests.Qml Mock.Verify(x => x.Method(It.IsAny()), Times.Once); testObject.CalledCount.Should().Be(2); } - + [Fact] public void Can_pass_js_value_to_callback() { Mock.CallBase = true; Mock.Setup(x => x.MethodWithParameters("test1", 4)); - + RunQmlTest( "test", @" @@ -198,7 +191,7 @@ namespace Qml.Net.Tests.Qml { results.Add((object)jsValue()); })); - + RunQmlTest( "test", @" @@ -242,7 +235,7 @@ namespace Qml.Net.Tests.Qml result = jsValue; })); Mock.Setup(x => x.GetTestObject()).Returns(testObject); - + RunQmlTest( "test", @" @@ -259,11 +252,11 @@ namespace Qml.Net.Tests.Qml Mock.Verify(x => x.Method(It.IsAny()), Times.Exactly(1)); Mock.Verify(x => x.GetTestObject(), Times.Exactly(1)); - ((object) result.nonExistant).Should().BeNull(); - ((int) result.test1).Should().Be(34); - ((string) result.test2).Should().Be("test3"); + ((object)result.nonExistant).Should().BeNull(); + ((int)result.test1).Should().Be(34); + ((string)result.test2).Should().Be("test3"); ((object)result.test3).Should().BeSameAs(testObject); - ((string) result.test4.test5).Should().Be("test5"); + ((string)result.test4.test5).Should().Be("test5"); } [Fact] @@ -282,7 +275,7 @@ namespace Qml.Net.Tests.Qml })); Mock.Setup(x => x.Method(It.IsAny())) .Callback(new Action(value => { result = value; })); - + RunQmlTest( "test", @" @@ -303,11 +296,11 @@ namespace Qml.Net.Tests.Qml Mock.Verify(x => x.Method(It.IsAny()), Times.Exactly(1)); Mock.Verify(x => x.Method(It.IsAny(), It.IsAny()), Times.Exactly(1)); Mock.Verify(x => x.GetTestObject(), Times.Exactly(1)); - ((object) result).Should().NotBeNull(); - ((int) result.dest1).Should().Be(123); - ((string) result.dest2).Should().Be("value"); - ((object) result.dest3).Should().BeSameAs(testObject); - ((object) result.dest4).Should().BeAssignableTo(); + ((object)result).Should().NotBeNull(); + ((int)result.dest1).Should().Be(123); + ((string)result.dest2).Should().Be("value"); + ((object)result.dest3).Should().BeSameAs(testObject); + ((object)result.dest4).Should().BeAssignableTo(); } [Fact] @@ -316,9 +309,9 @@ namespace Qml.Net.Tests.Qml List result = null; Mock.Setup(x => x.Method(It.IsAny())).Callback(new Action(param => { - result = ((INetJsValue) param).AsList(); + result = ((INetJsValue)param).AsList(); })); - + RunQmlTest( "test", @" @@ -327,23 +320,23 @@ namespace Qml.Net.Tests.Qml p.push(""test2"") test.method(p) "); - + Mock.Verify(x => x.Method(It.IsAny()), Times.Once); result.Should().NotBeNull(); result.Count.Should().Be(2); result[0].Should().Be("test1"); result[1].Should().Be("test2"); } - + [Fact] public void Can_convert_array_to_list_int() { List result = null; Mock.Setup(x => x.Method(It.IsAny())).Callback(new Action(param => { - result = ((INetJsValue) param).AsList(); + result = ((INetJsValue)param).AsList(); })); - + RunQmlTest( "test", @" @@ -352,7 +345,7 @@ namespace Qml.Net.Tests.Qml p.push(1) test.method(p) "); - + Mock.Verify(x => x.Method(It.IsAny()), Times.Once); result.Should().NotBeNull(); result.Count.Should().Be(2); diff --git a/src/net/Qml.Net.Tests/Qml/LifetimeTests.cs b/src/net/Qml.Net.Tests/Qml/LifetimeTests.cs index 00712a0d..3a00ed50 100644 --- a/src/net/Qml.Net.Tests/Qml/LifetimeTests.cs +++ b/src/net/Qml.Net.Tests/Qml/LifetimeTests.cs @@ -6,7 +6,6 @@ using Xunit; // ReSharper disable AutoPropertyCanBeMadeGetOnly.Global // ReSharper disable UnusedMember.Global // ReSharper disable UnusedAutoPropertyAccessor.Global - namespace Qml.Net.Tests.Qml { public class LifetimeTests : BaseQmlTestsWithInstance @@ -29,7 +28,7 @@ namespace Qml.Net.Tests.Qml } public SecondLevelType Parameter { get; set; } - + public SecondLevelType Parameter2 { get; set; } private readonly WeakReference _parameterWeakRef; @@ -39,7 +38,7 @@ namespace Qml.Net.Tests.Qml Parameter = null; Parameter2 = null; } - + public bool CheckIsParameterAlive() { GC.Collect(GC.MaxGeneration); @@ -187,7 +186,7 @@ namespace Qml.Net.Tests.Qml Assert.True(Instance.TestResult); } - [Fact()] + [Fact] public void Can_handle_instance_deref_of_all_refs_in_qml_and_net() { qmlApplicationEngine.LoadData(@" diff --git a/src/net/Qml.Net.Tests/Qml/ListModelTests.cs b/src/net/Qml.Net.Tests/Qml/ListModelTests.cs index 5e0f4f6e..76656f40 100644 --- a/src/net/Qml.Net.Tests/Qml/ListModelTests.cs +++ b/src/net/Qml.Net.Tests/Qml/ListModelTests.cs @@ -18,7 +18,6 @@ namespace Qml.Net.Tests.Qml public virtual void Test(object param) { - } } @@ -28,7 +27,7 @@ namespace Qml.Net.Tests.Qml { Prop = Guid.NewGuid().ToString(); } - + public string Prop { get; set; } } @@ -43,7 +42,8 @@ namespace Qml.Net.Tests.Qml Mock.Setup(x => x.GetNetObjectList()).Returns(list); Mock.Setup(x => x.Test(It.IsAny())).Callback(new Action(o => result.Add((TestNetObject)o))); - NetTestHelper.RunQml(qmlApplicationEngine, + NetTestHelper.RunQml( + qmlApplicationEngine, @" import QtQuick 2.0 import tests 1.0 @@ -66,8 +66,8 @@ namespace Qml.Net.Tests.Qml } } "); - - Mock.Verify(x => x.GetNetObjectList(),Times.Once); + + Mock.Verify(x => x.GetNetObjectList(), Times.Once); Mock.Verify(x => x.Test(It.IsAny()), Times.Exactly(3)); list.Count.Should().Be(result.Count); list[0].Prop.Should().Be(result[0].Prop); @@ -81,7 +81,7 @@ namespace Qml.Net.Tests.Qml var list = new List(); list.Add(new TestNetObject()); Mock.Setup(x => x.GetNetObjectList()).Returns(list); - + RunQmlTest( "test", @" @@ -92,14 +92,14 @@ namespace Qml.Net.Tests.Qml Mock.Verify(x => x.Test(1), Times.Once); } - + [Fact] public void Can_get_at() { var list = new List(); list.Add(new TestNetObject()); Mock.Setup(x => x.GetNetObjectList()).Returns(list); - + RunQmlTest( "test", @" @@ -110,14 +110,14 @@ namespace Qml.Net.Tests.Qml Mock.Verify(x => x.Test(list[0]), Times.Once); } - + [Fact] public void Can_get_at_invalid() { var list = new List(); list.Add(new TestNetObject()); Mock.Setup(x => x.GetNetObjectList()).Returns(list); - + RunQmlTest( "test", @" diff --git a/src/net/Qml.Net.Tests/Qml/MvvmInteropBehaviorTests.cs b/src/net/Qml.Net.Tests/Qml/MvvmInteropBehaviorTests.cs index 8fb6d13e..791c49a6 100644 --- a/src/net/Qml.Net.Tests/Qml/MvvmInteropBehaviorTests.cs +++ b/src/net/Qml.Net.Tests/Qml/MvvmInteropBehaviorTests.cs @@ -1,8 +1,7 @@ using System.ComponentModel; using System.Runtime.CompilerServices; -using Xunit; using FluentAssertions; -using Qml.Net.Internal.Qml; +using Xunit; namespace Qml.Net.Tests.Qml { @@ -34,7 +33,7 @@ namespace Qml.Net.Tests.Qml { ViewModel.NotifyOnlyIntProperty = newValue; } - + public void ChangeCustomNotifyOnlyIntPropertyTo(int newValue) { ViewModel.CustomNotifyOnlyIntProperty = newValue; @@ -47,13 +46,15 @@ namespace Qml.Net.Tests.Qml { public event PropertyChangedEventHandler PropertyChanged; - private string _stringProperty = ""; + private string _stringProperty = string.Empty; + public string StringProperty { get { return _stringProperty; } + set { if (!Equals(value, _stringProperty)) @@ -65,6 +66,7 @@ namespace Qml.Net.Tests.Qml } private int _intProperty; + public int IntProperty { get => _intProperty; @@ -77,8 +79,9 @@ namespace Qml.Net.Tests.Qml } } } - + private int _customIntProperty; + [NotifySignal("customIntPropertyChangedSignal")] public int CustomIntProperty { @@ -86,6 +89,7 @@ namespace Qml.Net.Tests.Qml { return _customIntProperty; } + set { if (!Equals(value, _customIntProperty)) @@ -95,8 +99,9 @@ namespace Qml.Net.Tests.Qml } } } - + private int _customMvvmStyleIntProperty; + [NotifySignal] public int CustomMvvmStyleIntProperty { @@ -104,6 +109,7 @@ namespace Qml.Net.Tests.Qml { return _customMvvmStyleIntProperty; } + set { if (!Equals(value, _customMvvmStyleIntProperty)) @@ -113,8 +119,9 @@ namespace Qml.Net.Tests.Qml } } } - + private int _notifyOnlyIntProperty; + [NotifySignal] public int NotifyOnlyIntProperty { @@ -122,6 +129,7 @@ namespace Qml.Net.Tests.Qml { return _notifyOnlyIntProperty; } + set { if (!Equals(value, _notifyOnlyIntProperty)) @@ -131,8 +139,9 @@ namespace Qml.Net.Tests.Qml } } } - + private int _customNotifyOnlyIntProperty; + [NotifySignal("customNotifyIntPropertyChangedSignal")] public int CustomNotifyOnlyIntProperty { @@ -140,6 +149,7 @@ namespace Qml.Net.Tests.Qml { return _customNotifyOnlyIntProperty; } + set { if (!Equals(value, _customNotifyOnlyIntProperty)) @@ -218,7 +228,7 @@ namespace Qml.Net.Tests.Qml Instance.TestResult.Should().Be(true); } - + [Fact] public void Does_play_nicely_with_completely_custom_notify_signals() { @@ -234,7 +244,7 @@ namespace Qml.Net.Tests.Qml Instance.TestResult.Should().Be(true); } - + [Fact] public void Does_play_nicely_with_custom_notify_signals() { @@ -250,7 +260,7 @@ namespace Qml.Net.Tests.Qml Instance.TestResult.Should().Be(true); } - + [Fact] public void Does_not_interfer_with_properties_only_using_notify_signals() { @@ -266,7 +276,7 @@ namespace Qml.Net.Tests.Qml Instance.TestResult.Should().Be(true); } - + [Fact] public void Does_not_interfer_with_properties_only_using_custom_notify_signals() { diff --git a/src/net/Qml.Net.Tests/Qml/NetVariantTests.cs b/src/net/Qml.Net.Tests/Qml/NetVariantTests.cs index a47e60e4..0a1b5d90 100644 --- a/src/net/Qml.Net.Tests/Qml/NetVariantTests.cs +++ b/src/net/Qml.Net.Tests/Qml/NetVariantTests.cs @@ -10,16 +10,15 @@ namespace Qml.Net.Tests.Qml { public class TestObject { - } - + [Fact] public void Variant_is_invalid_by_default() { var variant = new NetVariant(); variant.VariantType.Should().Be(NetVariantType.Invalid); } - + [Fact] public void Can_store_net_instance() { @@ -31,7 +30,7 @@ namespace Qml.Net.Tests.Qml variant.Instance.Instance.Should().Be(testObject); variant.VariantType.Should().Be(NetVariantType.Object); } - + [Fact] public void Can_store_bool() { @@ -42,7 +41,7 @@ namespace Qml.Net.Tests.Qml variant.Bool = false; variant.Bool.Should().BeFalse(); } - + [Fact] public void Can_store_char() { @@ -53,7 +52,7 @@ namespace Qml.Net.Tests.Qml variant.Char = ' '; variant.Char.Should().Be(' '); } - + [Fact] public void Can_store_int() { @@ -64,7 +63,7 @@ namespace Qml.Net.Tests.Qml variant.Int = int.MaxValue; variant.Int.Should().Be(int.MaxValue); } - + [Fact] public void Can_store_uint() { @@ -75,7 +74,7 @@ namespace Qml.Net.Tests.Qml variant.UInt = uint.MaxValue; variant.UInt.Should().Be(uint.MaxValue); } - + [Fact] public void Can_store_long() { @@ -86,7 +85,7 @@ namespace Qml.Net.Tests.Qml variant.Long = long.MaxValue; variant.Long.Should().Be(long.MaxValue); } - + [Fact] public void Can_store_ulong() { @@ -97,7 +96,7 @@ namespace Qml.Net.Tests.Qml variant.ULong = ulong.MaxValue; variant.ULong.Should().Be(ulong.MaxValue); } - + [Fact] public void Can_store_float() { @@ -108,7 +107,7 @@ namespace Qml.Net.Tests.Qml variant.Float = float.MaxValue; variant.Float.Should().Be(float.MaxValue); } - + [Fact] public void Can_store_double() { @@ -119,7 +118,7 @@ namespace Qml.Net.Tests.Qml variant.Double = double.MaxValue; variant.Double.Should().Be(double.MaxValue); } - + [Fact] public void Can_store_string() { @@ -133,7 +132,7 @@ namespace Qml.Net.Tests.Qml variant.String = null; variant.String.Should().BeNull(); } - + [Fact] public void Can_store_date() { @@ -152,7 +151,7 @@ namespace Qml.Net.Tests.Qml value.Value.Millisecond.Should().Be(0); value.Value.Offset.Should().Be(TimeSpan.FromHours(5)); } - + [Fact] public void Can_clear_value() { diff --git a/src/net/Qml.Net.Tests/Qml/ObjectTests.cs b/src/net/Qml.Net.Tests/Qml/ObjectTests.cs index cc8b3176..264c0104 100644 --- a/src/net/Qml.Net.Tests/Qml/ObjectTests.cs +++ b/src/net/Qml.Net.Tests/Qml/ObjectTests.cs @@ -15,25 +15,20 @@ namespace Qml.Net.Tests.Qml public virtual void TestMethodParameter(ObjectTestsQmlReturnType parameter) { - } public virtual void Overload() { - } - - + public virtual void Overload(string param) { - } - + public object TestObjectProperty { get; set; } public virtual void TestObjectPropertyTest(string result) { - } } @@ -41,7 +36,6 @@ namespace Qml.Net.Tests.Qml { public virtual void TestMethod() { - } } @@ -90,16 +84,16 @@ namespace Qml.Net.Tests.Qml @" test.overload() "); - + Mock.Verify(x => x.Overload(), Times.Once); Mock.Verify(x => x.Overload(It.IsAny()), Times.Never); - + RunQmlTest( "test", @" test.overload('test') "); - + Mock.Verify(x => x.Overload(), Times.Once); Mock.Verify(x => x.Overload(It.IsAny()), Times.Once); } @@ -108,13 +102,13 @@ namespace Qml.Net.Tests.Qml public void Can_get_null() { Mock.Setup(x => x.TestObjectPropertyTest(It.IsAny())); - + RunQmlTest( "test", @" test.testObjectPropertyTest(typeof test.testObjectProperty) "); - + Mock.Verify(x => x.TestObjectPropertyTest("object"), Times.Once); } } diff --git a/src/net/Qml.Net.Tests/Qml/QQmlApplicationEngineTests.cs b/src/net/Qml.Net.Tests/Qml/QQmlApplicationEngineTests.cs index 4748d384..e01b58df 100644 --- a/src/net/Qml.Net.Tests/Qml/QQmlApplicationEngineTests.cs +++ b/src/net/Qml.Net.Tests/Qml/QQmlApplicationEngineTests.cs @@ -23,7 +23,7 @@ namespace Qml.Net.Tests.Qml var o = new QQmlApplicationEngineQml(); o.Guid = Guid.NewGuid(); qmlApplicationEngine.SetContextProperty(propName, o); - ((QQmlApplicationEngineQml) qmlApplicationEngine.GetContextProperty(propName)).Guid.Should().Be(o.Guid); + ((QQmlApplicationEngineQml)qmlApplicationEngine.GetContextProperty(propName)).Guid.Should().Be(o.Guid); } } } \ No newline at end of file diff --git a/src/net/Qml.Net.Tests/Qml/SerializationTests.cs b/src/net/Qml.Net.Tests/Qml/SerializationTests.cs index 6abf9a7d..7bf2a13b 100644 --- a/src/net/Qml.Net.Tests/Qml/SerializationTests.cs +++ b/src/net/Qml.Net.Tests/Qml/SerializationTests.cs @@ -11,17 +11,17 @@ namespace Qml.Net.Tests.Qml { return null; } - + public virtual string Result { get; set; } } public class JsonObject { public string Prop1 { get; set; } - + public int Prop2 { get; set; } } - + [Fact] public void Can_serialize_object() { @@ -31,14 +31,14 @@ namespace Qml.Net.Tests.Qml var jsonObjectSerialized = Serializer.Current.Serialize(jsonObject); Mock.Setup(x => x.GetJsonObject()).Returns(jsonObject); Mock.SetupSet(x => x.Result = jsonObjectSerialized); - + RunQmlTest( "test", @" var jsonObject = test.getJsonObject() test.result = Net.serialize(jsonObject) "); - + Mock.Verify(x => x.GetJsonObject(), Times.Once); Mock.VerifySet(x => x.Result = jsonObjectSerialized, Times.Once); } diff --git a/src/net/Qml.Net.Tests/Qml/SignalTests.cs b/src/net/Qml.Net.Tests/Qml/SignalTests.cs index 739b991b..de5fff23 100644 --- a/src/net/Qml.Net.Tests/Qml/SignalTests.cs +++ b/src/net/Qml.Net.Tests/Qml/SignalTests.cs @@ -19,17 +19,14 @@ namespace Qml.Net.Tests.Qml public virtual void MethodWithArgs(string arg1, int arg2) { - } public virtual void TestMethod() { - } public virtual void TestMethodWithArgs(string arg1, int arg2) { - } private string _someStringPropertyValue = ""; @@ -38,8 +35,9 @@ namespace Qml.Net.Tests.Qml public string SomeStringProperty { get => _someStringPropertyValue; - set { - if (_someStringPropertyValue == value) + set + { + if (_someStringPropertyValue == value) return; _someStringPropertyValue = value; this.ActivateNotifySignal(); @@ -47,26 +45,32 @@ namespace Qml.Net.Tests.Qml } private int _someIntPropertyValue = 0; - + [NotifySignal("someWeirdSignalName")] public int SomeIntProperty { get => _someIntPropertyValue; - set { - if (_someIntPropertyValue == value) + set + { + if (_someIntPropertyValue == value) return; _someIntPropertyValue = value; this.ActivateNotifySignal(); } } - + private bool _someBoolPropertyValue = false; - + public bool SomeBoolProperty { - get => _someBoolPropertyValue; - set { - if (_someBoolPropertyValue == value) + get + { + return _someBoolPropertyValue; + } + + set + { + if (_someBoolPropertyValue == value) return; _someBoolPropertyValue = value; this.ActivateNotifySignal(); @@ -85,7 +89,6 @@ namespace Qml.Net.Tests.Qml [Signal("testSignalWithNetArg", NetVariantType.Object)] public class SignalObject { - } [Fact] @@ -94,7 +97,7 @@ namespace Qml.Net.Tests.Qml var signalObject = new SignalObject(); Mock.Setup(x => x.GetSignalObject()).Returns(signalObject); Mock.Setup(x => x.SignalRaised).Returns(false); - + RunQmlTest( "test", @" @@ -107,7 +110,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifySet(x => x.SignalRaised = true, Times.Once); } - + [Fact] public void Can_raise_signal_from_qml_with_args() { @@ -115,7 +118,7 @@ namespace Qml.Net.Tests.Qml Mock.Setup(x => x.GetSignalObject()).Returns(signalObject); Mock.Setup(x => x.SignalRaised).Returns(false); Mock.Setup(x => x.MethodWithArgs("arg1", 3)); - + RunQmlTest( "test", @" @@ -130,14 +133,14 @@ namespace Qml.Net.Tests.Qml Mock.VerifySet(x => x.SignalRaised = true, Times.Once); Mock.Verify(x => x.MethodWithArgs("arg1", 3), Times.Once); } - + [Fact(Skip = "This was broken when issue #71 was resolved. If you need this, file an issue.")] public void Can_raise_signal_from_qml_different_retrieval_of_net_instance() { var signalObject = new SignalObject(); Mock.Setup(x => x.GetSignalObject()).Returns(signalObject); Mock.Setup(x => x.SignalRaised).Returns(false); - + RunQmlTest( "test", @" @@ -162,7 +165,7 @@ namespace Qml.Net.Tests.Qml signalObject.ActivateSignal("testSignal"); }); Mock.Setup(x => x.SignalRaised).Returns(false); - + RunQmlTest( "test", @" @@ -175,12 +178,12 @@ namespace Qml.Net.Tests.Qml Mock.VerifySet(x => x.SignalRaised = true, Times.Once); } - + [Fact] public void Can_raise_changed_default_signal_from_net() { Mock.Setup(x => x.SignalRaised).Returns(false); - + RunQmlTest( "test", @" @@ -192,12 +195,12 @@ namespace Qml.Net.Tests.Qml Mock.VerifySet(x => x.SignalRaised = true, Times.Once); } - + [Fact] public void Can_raise_changed_custom_signal_from_net() { Mock.Setup(x => x.SignalRaised).Returns(false); - + RunQmlTest( "test", @" @@ -214,7 +217,7 @@ namespace Qml.Net.Tests.Qml public void Can_not_raise_invalid_changed_signal_from_net() { Mock.Setup(x => x.SignalRaised).Returns(false); - + RunQmlTest( "test", @" @@ -226,7 +229,7 @@ namespace Qml.Net.Tests.Qml Mock.VerifySet(x => x.SignalRaised = true, Times.Never); } - + [Fact] public void Can_raise_signal_from_net_with_args() { @@ -238,7 +241,7 @@ namespace Qml.Net.Tests.Qml }); Mock.Setup(x => x.SignalRaised).Returns(false); Mock.Setup(x => x.MethodWithArgs("arg1", 3)); - + RunQmlTest( "test", @" @@ -253,27 +256,27 @@ namespace Qml.Net.Tests.Qml Mock.VerifySet(x => x.SignalRaised = true, Times.Once); Mock.Verify(x => x.MethodWithArgs("arg1", 3), Times.Once); } - + [Fact] public void Can_attach_delegate_to_signal_when_object_not_in_qml() { var o = new SignalObject(); string message1 = null; string message2 = null; - + o.AttachToSignal("testSignalWithArgs1", new Action((m, _) => { message1 = m; })); - o.AttachToSignal("testSignalWithArgs2", new Action((m, _) => { message2 = m; })); - + o.AttachToSignal("testSignalWithArgs2", new Action((m, _) => { message2 = m; })); + o.ActivateSignal("testSignalWithArgs1", "message1", 3); message1.Should().Be("message1"); message2.Should().BeNull(); message1 = null; - + o.ActivateSignal("testSignalWithArgs2", "message2", 4); message1.Should().BeNull(); message2.Should().Be("message2"); } - + [Fact] public void Can_raise_net_signal_from_qml_when_added_before_qml() { @@ -281,7 +284,7 @@ namespace Qml.Net.Tests.Qml string message = null; o.AttachToSignal("testSignalWithArgs1", new Action((m, _) => message = m)); Mock.Setup(x => x.GetSignalObject()).Returns(o); - + RunQmlTest( "test", @" @@ -291,7 +294,7 @@ namespace Qml.Net.Tests.Qml message.Should().Be("from qml"); } - + [Fact] public void Can_raise_net_signal_from_qml_when_added_after_qml() { @@ -302,7 +305,7 @@ namespace Qml.Net.Tests.Qml { o.AttachToSignal("testSignalWithArgs1", new Action((m, _) => message = m)); }); - + RunQmlTest( "test", @" @@ -327,7 +330,7 @@ namespace Qml.Net.Tests.Qml { paramResult = p; })); - + RunQmlTest( "test", @" @@ -335,7 +338,7 @@ namespace Qml.Net.Tests.Qml var param = test.getTestObject() instance.testSignalWithNetArg(param) "); - + paramResult.Should().NotBeNull(); paramResult.SomeStringProperty.Should().NotBeNull(param.SomeStringProperty); } @@ -358,14 +361,14 @@ namespace Qml.Net.Tests.Qml { paramResult = p; })); - + RunQmlTest( "test", @" var instance = test.getSignalObject() test.testMethod() "); - + paramResult.Should().NotBeNull(); paramResult.SomeStringProperty.Should().NotBeNull(param.SomeStringProperty); } diff --git a/src/net/Qml.Net.Tests/Qml/SingletonTests.cs b/src/net/Qml.Net.Tests/Qml/SingletonTests.cs index ddef5a5d..1deca8a3 100644 --- a/src/net/Qml.Net.Tests/Qml/SingletonTests.cs +++ b/src/net/Qml.Net.Tests/Qml/SingletonTests.cs @@ -15,7 +15,8 @@ namespace Qml.Net.Tests.Qml [Fact] public void Can_register_singleton() { - NetTestHelper.RunQml(qmlApplicationEngine, + NetTestHelper.RunQml( + qmlApplicationEngine, @" import QtQuick 2.0 import tests 1.0 diff --git a/src/net/Qml.Net.Tests/Qml/StringTests.cs b/src/net/Qml.Net.Tests/Qml/StringTests.cs index 414b7583..7cefa114 100644 --- a/src/net/Qml.Net.Tests/Qml/StringTests.cs +++ b/src/net/Qml.Net.Tests/Qml/StringTests.cs @@ -12,7 +12,6 @@ namespace Qml.Net.Tests.Qml public virtual void MethodParameter(string value) { - } public virtual string MethodReturn() diff --git a/src/net/Qml.Net.Tests/Qml/UIntTests.cs b/src/net/Qml.Net.Tests/Qml/UIntTests.cs index 090b395e..5bf57ea8 100644 --- a/src/net/Qml.Net.Tests/Qml/UIntTests.cs +++ b/src/net/Qml.Net.Tests/Qml/UIntTests.cs @@ -12,7 +12,6 @@ namespace Qml.Net.Tests.Qml public virtual void MethodParameter(uint value) { - } public virtual uint MethodReturn() diff --git a/src/net/Qml.Net.Tests/Types/CallbacksTests.cs b/src/net/Qml.Net.Tests/Types/CallbacksTests.cs index 348e887f..e25722e4 100644 --- a/src/net/Qml.Net.Tests/Types/CallbacksTests.cs +++ b/src/net/Qml.Net.Tests/Types/CallbacksTests.cs @@ -10,16 +10,16 @@ namespace Qml.Net.Tests.Types { public class CallbacksTests : BaseTests { - class TestObject - { - public void Method(TestObject o) - { - Object = o; - } - - public TestObject Object { get; set; } + class TestObject + { + public void Method(TestObject o) + { + Object = o; + } + + public TestObject Object { get; set; } } - + [Fact] public void Can_call_is_type_valid() { @@ -42,35 +42,35 @@ namespace Qml.Net.Tests.Types // NetReference is still alive, so the weak reference must be alive as well. GC.Collect(GC.MaxGeneration); reference.IsAlive.Should().BeTrue(); - + instance.Dispose(); - + // NetReference has been destroyed, so the handle should have been released. GC.Collect(GC.MaxGeneration); reference.IsAlive.Should().BeFalse(); } - + [Fact] public void Can_instantiate_type() { var type = NetTypeManager.GetTypeInfo(); - using(var instance = new NetReference(Interop.Callbacks.InstantiateType(type.Handle), false)) + using (var instance = new NetReference(Interop.Callbacks.InstantiateType(type.Handle), false)) { instance.Instance.Should().NotBeNull(); instance.Instance.Should().BeOfType(); } } - - [Fact] - public void Can_invoke_method() - { - var o = new TestObject(); - var type = NetTypeManager.GetTypeInfo(); + + [Fact] + public void Can_invoke_method() + { + var o = new TestObject(); + var type = NetTypeManager.GetTypeInfo(); type.EnsureLoaded(); - var method = type.GetMethod(0); - var instance = NetReference.CreateForObject(o); - + var method = type.GetMethod(0); + var instance = NetReference.CreateForObject(o); + // This will jump to native, to then call the .NET delegate (round trip). // The purpose is to simulate Qml invoking a method, sending .NET instance back. // We will inspect the returned instance that it got back to verify that it diff --git a/src/net/Qml.Net.Tests/Types/NetReferenceTests.cs b/src/net/Qml.Net.Tests/Types/NetReferenceTests.cs index f139025b..226acba3 100644 --- a/src/net/Qml.Net.Tests/Types/NetReferenceTests.cs +++ b/src/net/Qml.Net.Tests/Types/NetReferenceTests.cs @@ -8,9 +8,8 @@ namespace Qml.Net.Tests.Types { class TestObject { - } - + [Fact] public void Can_create_net_instance() { diff --git a/src/net/Qml.Net.Tests/Types/NetTypeManagerTests.cs b/src/net/Qml.Net.Tests/Types/NetTypeManagerTests.cs index cebfb210..1c2f4cc5 100644 --- a/src/net/Qml.Net.Tests/Types/NetTypeManagerTests.cs +++ b/src/net/Qml.Net.Tests/Types/NetTypeManagerTests.cs @@ -12,12 +12,11 @@ namespace Qml.Net.Tests.Types { public void TestMethod() { - } - + public int TestProperty { get; set; } } - + [Fact] public void Can_get_net_type() { @@ -35,29 +34,28 @@ namespace Qml.Net.Tests.Types { public void TestMethod(int parameter1, TestType1 parameter2) { - } } - + [Fact] public void Can_get_method_parameters() { var typeInfo = NetTypeManager.GetTypeInfo(); typeInfo.EnsureLoaded(); - + typeInfo.MethodCount.Should().Be(1); - + var method = typeInfo.GetMethod(0); method.Should().NotBeNull(); method.ParameterCount.Should().Be(2); - + var parameter1 = method.GetParameter(0); parameter1.Should().NotBeNull(); parameter1.Name.Should().Be("parameter1"); var parameter1Type = parameter1.Type; parameter1Type.Should().NotBeNull(); parameter1Type.ClassName.Should().Be("Int32"); - + var parameter2 = method.GetParameter(1); parameter2.Should().NotBeNull(); parameter2.Name.Should().Be("parameter2"); @@ -88,10 +86,9 @@ namespace Qml.Net.Tests.Types { public void TestMethod() { - } } - + [Fact] public void Can_get_method_without_return_type() { @@ -105,7 +102,6 @@ namespace Qml.Net.Tests.Types { public void ThisIsMethodName() { - } } @@ -122,7 +118,7 @@ namespace Qml.Net.Tests.Types { public string Property { get; set; } } - + [Fact] public void Can_get_property() { @@ -142,9 +138,8 @@ namespace Qml.Net.Tests.Types [Signal("testSignal", NetVariantType.DateTime, NetVariantType.Object)] public class TestType7 { - } - + [Fact] public void Can_get_signal() { @@ -164,7 +159,7 @@ namespace Qml.Net.Tests.Types [NotifySignal("signalName")] public string Property { get; set; } } - + [Fact] public void Can_get_notifiy_signal_for_property() { @@ -219,13 +214,12 @@ namespace Qml.Net.Tests.Types { return null; } - + public class InnerType { - } } - + [Fact] public void Can_lazy_load_types() { @@ -246,12 +240,10 @@ namespace Qml.Net.Tests.Types { public void LocalMethod() { - } public static void StaticMethod() { - } } @@ -270,7 +262,7 @@ namespace Qml.Net.Tests.Types { public string[] Property { get; set; } } - + [Fact] public void Can_detect_array_type() { @@ -286,7 +278,7 @@ namespace Qml.Net.Tests.Types public class TestType14 { public List Prop1 { get; set; } - + public System.Collections.ArrayList Prop2 { get; set; } } diff --git a/src/net/Qml.Net.Tests/Types/NetVariantListTests.cs b/src/net/Qml.Net.Tests/Types/NetVariantListTests.cs index afa6fd75..69ff79af 100644 --- a/src/net/Qml.Net.Tests/Types/NetVariantListTests.cs +++ b/src/net/Qml.Net.Tests/Types/NetVariantListTests.cs @@ -40,12 +40,12 @@ namespace Qml.Net.Tests.Types { variant1.String = "test1"; variant2.String = "test2"; - + list.Add(variant1); list.Add(variant2); - + list.Count.Should().Be(2); - + list.Remove(0); list.Count.Should().Be(1); @@ -64,12 +64,12 @@ namespace Qml.Net.Tests.Types { variant1.String = "test1"; variant2.String = "test2"; - + list.Add(variant1); list.Add(variant2); - + list.Count.Should().Be(2); - + list.Clear(); list.Count.Should().Be(0); diff --git a/src/net/Qml.Net/BaseDisposable.cs b/src/net/Qml.Net/BaseDisposable.cs index 4f36a23f..04a5be21 100644 --- a/src/net/Qml.Net/BaseDisposable.cs +++ b/src/net/Qml.Net/BaseDisposable.cs @@ -13,7 +13,7 @@ namespace Qml.Net _handle = handle; _ownesHandle = ownsHandle; } - + ~BaseDisposable() { Dispose(false); @@ -27,21 +27,21 @@ namespace Qml.Net { throw new ObjectDisposedException($"Type {GetType().Name} is disposed."); } - + return _handle; } } - public void Dispose() + public void Dispose() { Dispose(true); - GC.SuppressFinalize(this); + GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (_disposed) return; - + if (disposing) { DisposeManaged(); @@ -59,7 +59,6 @@ namespace Qml.Net protected virtual void DisposeManaged() { - } protected abstract void DisposeUnmanaged(IntPtr ptr); diff --git a/src/net/Qml.Net/Extensions/INetJsValueExtensions.cs b/src/net/Qml.Net/Extensions/INetJsValueExtensions.cs index 1f33a3f6..3d15ce41 100644 --- a/src/net/Qml.Net/Extensions/INetJsValueExtensions.cs +++ b/src/net/Qml.Net/Extensions/INetJsValueExtensions.cs @@ -10,7 +10,7 @@ namespace Qml.Net.Extensions { return null; } - + if (typeof(T) != typeof(int) && typeof(T) != typeof(string)) { // Only enumerables of int and string are currently supported @@ -21,7 +21,7 @@ namespace Qml.Net.Extensions try { var length = (int)value.GetProperty("length"); - + for (var i = 0; i < length; i++) { var item = value.GetItemAtIndex(i); diff --git a/src/net/Qml.Net/Host.cs b/src/net/Qml.Net/Host.cs index ddd5f26b..034248e3 100644 --- a/src/net/Qml.Net/Host.cs +++ b/src/net/Qml.Net/Host.cs @@ -36,24 +36,24 @@ namespace Qml.Net return ResolvePathResult.FromSuccess(library); } } - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] internal delegate IntPtr GetExportedSymbolDelegate([MarshalAs(UnmanagedType.LPStr)]string symbolName); internal static GetExportedSymbolDelegate GetExportedSymbol; - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate int NativeRunCallbackDelegate(IntPtr app, IntPtr engine); public delegate int NetRunCallbackDelegate(); - + public static int Run(string[] args, Func action) { if (args.Length < 4) { throw new Exception("Args is invalid, must contain three entries which are pointers to native types."); } - + var appPtr = new IntPtr((long)ulong.Parse(args[0])); var enginePtr = new IntPtr((long)ulong.Parse(args[1])); var callbackPtr = new IntPtr((long)ulong.Parse(args[2])); diff --git a/src/net/Qml.Net/INetJsValue.cs b/src/net/Qml.Net/INetJsValue.cs index 2d776197..bb679654 100644 --- a/src/net/Qml.Net/INetJsValue.cs +++ b/src/net/Qml.Net/INetJsValue.cs @@ -7,7 +7,7 @@ namespace Qml.Net bool IsCallable { get; } bool IsArray { get; } - + object GetProperty(string propertyName); object GetItemAtIndex(int arrayIndex); diff --git a/src/net/Qml.Net/Internal/Behaviors/MvvmQmlInteropBehavior.cs b/src/net/Qml.Net/Internal/Behaviors/MvvmQmlInteropBehavior.cs index 76c3fc85..02dc7e0c 100644 --- a/src/net/Qml.Net/Internal/Behaviors/MvvmQmlInteropBehavior.cs +++ b/src/net/Qml.Net/Internal/Behaviors/MvvmQmlInteropBehavior.cs @@ -1,7 +1,7 @@ -using Qml.Net.Internal.Types; -using System; +using System; using System.Collections.Generic; using System.ComponentModel; +using Qml.Net.Internal.Types; namespace Qml.Net.Internal.Behaviors { @@ -14,17 +14,18 @@ namespace Qml.Net.Internal.Behaviors Name = name; SignalName = signalName; } - + // ReSharper disable once MemberCanBePrivate.Local // ReSharper disable once UnusedAutoPropertyAccessor.Local public string Name { get; } + public string SignalName { get; } } private class MvvmTypeInfo { private readonly Dictionary _propertyInfos = new Dictionary(); - + // ReSharper disable once UnusedMember.Local public Type Type { get; set; } @@ -40,7 +41,7 @@ namespace Qml.Net.Internal.Behaviors } private static readonly Dictionary TypeInfos = new Dictionary(); - + public bool IsApplicableFor(Type type) { return typeof(INotifyPropertyChanged).IsAssignableFrom(type); @@ -54,7 +55,7 @@ namespace Qml.Net.Internal.Behaviors } if (!(instance is INotifyPropertyChanged castedInstance)) { - //invalid type + // Invalid type. return; } castedInstance.PropertyChanged += PropertyChangedHandler; @@ -68,7 +69,7 @@ namespace Qml.Net.Internal.Behaviors } if (!(instance is INotifyPropertyChanged castedInstance)) { - //invalid type + // Invalid type. return; } @@ -81,7 +82,8 @@ namespace Qml.Net.Internal.Behaviors { return; } - //fire signal according to the property that got changed + + // Fire signal according to the property that got changed. var type = sender.GetType(); if (TypeInfos.TryGetValue(type, out var typeInfo)) { @@ -118,30 +120,32 @@ namespace Qml.Net.Internal.Behaviors var property = netTypeInfo.GetProperty(i); if (property.NotifySignal != null) { - //in this case some other behavior or the user has already set up a notify signal for this property - //we don't want to destroy that + // In this case some other behavior or the user has already set up a notify signal for this property. + // We don't want to destroy that. mvvmTypeInfo.AddPropertyInfo(property.Name, property.NotifySignal.Name); continue; } var signalName = CalculateSignalNameFromPropertyName(property.Name); mvvmTypeInfo.AddPropertyInfo(property.Name, signalName); - //check if this signal already has been registered - for(var signalIndex = 0; signalIndex < netTypeInfo.SignalCount; signalIndex++) + + // Check if this signal already has been registered. + for (var signalIndex = 0; signalIndex < netTypeInfo.SignalCount; signalIndex++) { var signal = netTypeInfo.GetSignal(signalIndex); - if(string.Equals(signalName, signal.Name)) + if (string.Equals(signalName, signal.Name)) { existingSignalIndex = signalIndex; break; } } - if(existingSignalIndex.HasValue) + if (existingSignalIndex.HasValue) { - //signal for this property is already existent but not registered (we check that above) + // Signal for this property is already existent but not registered (we check that above). property.NotifySignal = netTypeInfo.GetSignal(existingSignalIndex.Value); continue; } - //create a new signal and link it to the property + + // Create a new signal and link it to the property. var notifySignalInfo = new NetSignalInfo(netTypeInfo, signalName); netTypeInfo.AddSignal(notifySignalInfo); property.NotifySignal = notifySignalInfo; diff --git a/src/net/Qml.Net/Internal/DefaultCallbacks.cs b/src/net/Qml.Net/Internal/DefaultCallbacks.cs index 4a3a2641..5385dfd7 100644 --- a/src/net/Qml.Net/Internal/DefaultCallbacks.cs +++ b/src/net/Qml.Net/Internal/DefaultCallbacks.cs @@ -1,6 +1,4 @@ -using Qml.Net.Internal.Qml; -using Qml.Net.Internal.Types; -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -8,6 +6,8 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.CSharp.RuntimeBinder; +using Qml.Net.Internal.Qml; +using Qml.Net.Internal.Types; namespace Qml.Net.Internal { @@ -24,11 +24,15 @@ namespace Qml.Net.Internal using (var type = new NetTypeInfo(t)) { var typeInfo = Type.GetType(type.FullTypeName); - if (typeInfo == null) throw new InvalidOperationException(); - + if (typeInfo == null) + { + throw new InvalidOperationException(); + } + type.ClassName = typeInfo.Name; type.PrefVariantType = GetPrefVariantType(typeInfo); + // All the methods/properties/signals are later populated when needed. } } @@ -42,10 +46,13 @@ namespace Qml.Net.Internal { throw new InvalidOperationException($"Invalid type {type.FullTypeName}"); } - - // Don't grab properties and methods for system-level types. - if (Helpers.IsPrimitive(typeInfo)) return; + // Don't grab properties and methods for system-level types. + if (Helpers.IsPrimitive(typeInfo)) + { + return; + } + if (typeInfo.IsArray) { type.IsArray = true; @@ -58,13 +65,13 @@ namespace Qml.Net.Internal } else if (typeInfo.IsGenericType) { - if(typeof(IList<>).IsAssignableFrom(typeInfo.GetGenericTypeDefinition())) + if (typeof(IList<>).IsAssignableFrom(typeInfo.GetGenericTypeDefinition())) { type.IsList = true; } } } - + foreach (var methodInfo in typeInfo.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)) { if (methodInfo.IsGenericMethod) continue; // No generics supported. @@ -89,7 +96,7 @@ namespace Qml.Net.Internal } var signals = new Dictionary(); - + foreach (var signalAttribute in typeInfo.GetCustomAttributes().OfType()) { if (string.IsNullOrEmpty(signalAttribute.Name)) @@ -101,7 +108,7 @@ namespace Qml.Net.Internal { throw new InvalidOperationException($"Signal {signalAttribute.Name} for {typeInfo.Name} must begin with a lower case letter."); } - + var signal = new NetSignalInfo(type, signalAttribute.Name); foreach (var parameter in signalAttribute.Parameters) { @@ -110,7 +117,7 @@ namespace Qml.Net.Internal type.AddSignal(signal); signals.Add(signal.Name, signal); } - + foreach (var propertyInfo in typeInfo.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (Helpers.IsPrimitive(propertyInfo.DeclaringType)) continue; @@ -125,10 +132,11 @@ namespace Qml.Net.Internal name = $"{propertyInfo.Name}Changed"; name = char.ToLower(name[0]) + name.Substring(1); } - + if (signals.ContainsKey(name)) { notifySignal = signals[name]; + // Make sure the signal we are referencing has no parameters. if (notifySignal.ParameterCount != 0) { @@ -142,12 +150,12 @@ namespace Qml.Net.Internal { throw new InvalidOperationException($"Signal {name} for {typeInfo.Name} must begin with a lower case letter."); } - + notifySignal = new NetSignalInfo(type, name); type.AddSignal(notifySignal); } } - + using (var property = new NetPropertyInfo( type, propertyInfo.Name, @@ -166,7 +174,7 @@ namespace Qml.Net.Internal InteropBehaviors.OnNetTypeInfoCreated(type, typeInfo); } } - + public void ReleaseNetReference(UInt64 objectId) { NetReference.OnRelease(objectId); @@ -174,7 +182,7 @@ namespace Qml.Net.Internal public void ReleaseNetDelegateGCHandle(IntPtr handle) { - NetDelegate.ReleaseGCHandle(((GCHandle)handle)); + NetDelegate.ReleaseGCHandle((GCHandle)handle); } public IntPtr InstantiateType(IntPtr type) @@ -183,9 +191,9 @@ namespace Qml.Net.Internal { var typeName = Utilities.ContainerToString(Interop.NetTypeInfo.GetFullTypeName(type)); var typeInfo = Type.GetType(typeName); - if(typeInfo == null) throw new InvalidOperationException($"Invalid type {typeName}"); - + if (typeInfo == null) throw new InvalidOperationException($"Invalid type {typeName}"); var netReference = NetReference.CreateForObject(TypeCreator.Create(typeInfo)); + // When .NET collects this NetReference, we don't want it to delete this // handle. Ownership has been passed to the caller. return Interop.NetReference.Clone(netReference.Handle); @@ -198,24 +206,23 @@ namespace Qml.Net.Internal public void ReadProperty(IntPtr p, IntPtr t, IntPtr ip, IntPtr r) { - using(var property = new NetPropertyInfo(p)) - using(var target = new NetReference(t)) - using(var indexParameter = ip != IntPtr.Zero ? new NetVariant(ip) : null) - using(var result = new NetVariant(r)) + using (var property = new NetPropertyInfo(p)) + using (var target = new NetReference(t)) + using (var indexParameter = ip != IntPtr.Zero ? new NetVariant(ip) : null) + using (var result = new NetVariant(r)) { var o = target.Instance; var propertInfo = o.GetType() .GetProperty(property.Name, BindingFlags.Instance | BindingFlags.Public); - - if(propertInfo == null) + if (propertInfo == null) throw new InvalidOperationException($"Invalid property {property.Name}"); if (indexParameter != null) { object indexParameterValue = null; Helpers.Unpackvalue(ref indexParameterValue, indexParameter); - Helpers.PackValue(propertInfo.GetValue(o, new[]{indexParameterValue}), result); + Helpers.PackValue(propertInfo.GetValue(o, new[] { indexParameterValue }), result); } else { @@ -246,7 +253,7 @@ namespace Qml.Net.Internal { object indexParameterValue = null; Helpers.Unpackvalue(ref indexParameterValue, indexParameter); - propertInfo.SetValue(o, newValue, new[]{indexParameterValue}); + propertInfo.SetValue(o, newValue, new[] { indexParameterValue }); } else { @@ -263,7 +270,7 @@ namespace Qml.Net.Internal using (var result = r != IntPtr.Zero ? new NetVariant(r) : null) { var instance = target.Instance; - + List methodParameters = null; if (parameters.Count > 0) @@ -292,11 +299,12 @@ namespace Qml.Net.Internal else if (methods.Count > 1) { // This is an overload. - + // TODO: Make this more performant. https://github.com/pauldotknopf/Qml.Net/issues/39 - + // Get all the parameters for the method we are invoking. var parameterTypes = method.GetAllParameters().Select(x => x.Type.FullTypeName).ToList(); + // And find a good method to invoke. foreach (var potentialMethod in methods) { @@ -330,7 +338,7 @@ namespace Qml.Net.Internal } var returnObject = methodInfo.Invoke(instance, methodParameters?.ToArray()); - + if (result == null) { // this method doesn't have return type @@ -384,8 +392,8 @@ namespace Qml.Net.Internal public async Task AwaitTask(IntPtr t, IntPtr sc, IntPtr fc) { using (var target = new NetReference(t)) - using(var successCallback = new NetJsValue(sc)) - using(var failureCallback = fc != IntPtr.Zero ? new NetJsValue(fc) : null) + using (var successCallback = new NetJsValue(sc)) + using (var failureCallback = fc != IntPtr.Zero ? new NetJsValue(fc) : null) { var taskObject = target.Instance; if (taskObject is Task task) @@ -447,7 +455,7 @@ namespace Qml.Net.Internal } } } - + private NetVariantType GetPrefVariantType(Type typeInfo) { if (typeInfo == typeof(bool)) @@ -478,7 +486,7 @@ namespace Qml.Net.Internal return GetPrefVariantType(typeInfo.GetGenericArguments()[0]); // ReSharper restore TailRecursiveCall } - + return NetVariantType.Object; } } diff --git a/src/net/Qml.Net/Internal/Helpers.cs b/src/net/Qml.Net/Internal/Helpers.cs index f4a87509..0195d2bb 100644 --- a/src/net/Qml.Net/Internal/Helpers.cs +++ b/src/net/Qml.Net/Internal/Helpers.cs @@ -12,23 +12,25 @@ namespace Qml.Net.Internal { return false; } - + if (type.Namespace == "System") { if (type.Name == "Exception") { return false; } + if (type.Name == "Array") { return false; } + return true; } - + return false; } - + public static void PackValue(object source, NetVariant destination) { if (source == null) @@ -40,26 +42,26 @@ namespace Qml.Net.Internal var type = source.GetType(); if (type == typeof(bool)) destination.Bool = (bool)source; - else if(type == typeof(char)) + else if (type == typeof(char)) destination.Char = (char)source; - else if(type == typeof(float)) + else if (type == typeof(float)) destination.Float = (float)source; - else if(type == typeof(double)) + else if (type == typeof(double)) destination.Double = (double)source; else if (type == typeof(int)) destination.Int = (int)source; - else if(type == typeof(uint)) + else if (type == typeof(uint)) destination.UInt = (uint)source; else if (type == typeof(long)) destination.Long = (long)source; - else if(type == typeof(ulong)) + else if (type == typeof(ulong)) destination.ULong = (ulong)source; else if (type == typeof(string)) destination.String = (string)source; else if (type == typeof(DateTimeOffset)) - destination.DateTime = ((DateTimeOffset) source).DateTime; + destination.DateTime = ((DateTimeOffset)source).DateTime; else if (typeof(INetJsValue).IsAssignableFrom(type)) - destination.JsValue = ((NetJsValue.NetJsValueDynamic) source).JsValue; + destination.JsValue = ((NetJsValue.NetJsValueDynamic)source).JsValue; else { destination.Instance = NetReference.CreateForObject(source); @@ -67,7 +69,7 @@ namespace Qml.Net.Internal } } - public static void Unpackvalue(ref object destination, NetVariant source) + public static void Unpackvalue(ref object destination, NetVariant source) { switch (source.VariantType) { diff --git a/src/net/Qml.Net/Internal/IQmlInteropBehavior.cs b/src/net/Qml.Net/Internal/IQmlInteropBehavior.cs index d2f8b04e..30fb46e2 100644 --- a/src/net/Qml.Net/Internal/IQmlInteropBehavior.cs +++ b/src/net/Qml.Net/Internal/IQmlInteropBehavior.cs @@ -1,7 +1,5 @@ -using Qml.Net.Internal.Types; -using System; -using System.Collections.Generic; -using System.Text; +using System; +using Qml.Net.Internal.Types; namespace Qml.Net.Internal { diff --git a/src/net/Qml.Net/Internal/Interop.cs b/src/net/Qml.Net/Internal/Interop.cs index cbbd17a9..3700ba21 100644 --- a/src/net/Qml.Net/Internal/Interop.cs +++ b/src/net/Qml.Net/Internal/Interop.cs @@ -13,7 +13,7 @@ namespace Qml.Net.Internal internal static class Interop { static readonly CallbacksImpl DefaultCallbacks = new CallbacksImpl(new DefaultCallbacks()); - + static Interop() { string pluginsDirectory = null; @@ -22,7 +22,7 @@ namespace Qml.Net.Internal IPathResolver pathResolver = null; IPlatformLoader loader = null; - + if (Host.GetExportedSymbol != null) { // We are loading exported functions from the currently running executable. @@ -69,7 +69,7 @@ namespace Qml.Net.Internal } } } - + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { if (!string.IsNullOrEmpty(libDirectory) && Directory.Exists(libDirectory)) @@ -78,7 +78,8 @@ namespace Qml.Net.Internal // the folder to the path. The reason is because QML plugins aren't // in the same directory and have trouble finding dependencies // that are within our lib folder. - Environment.SetEnvironmentVariable("PATH", + Environment.SetEnvironmentVariable( + "PATH", Environment.GetEnvironmentVariable("PATH") + $";{libDirectory}"); } } @@ -112,11 +113,11 @@ namespace Qml.Net.Internal Utilities = LoadInteropType(library, loader); QtWebEngine = LoadInteropType(library, loader); - if(!string.IsNullOrEmpty(pluginsDirectory)) + if (!string.IsNullOrEmpty(pluginsDirectory)) { Qt.PutEnv("QT_PLUGIN_PATH", pluginsDirectory); } - if(!string.IsNullOrEmpty(qmlDirectory)) + if (!string.IsNullOrEmpty(qmlDirectory)) { Qt.PutEnv("QML2_IMPORT_PATH", qmlDirectory); } @@ -128,48 +129,49 @@ namespace Qml.Net.Internal public static CallbacksInterop Callbacks { get; } public static NetTypeInfoInterop NetTypeInfo { get; } - + public static NetMethodInfoInterop NetMethodInfo { get; } - + public static NetPropertyInfoInterop NetPropertyInfo { get; } - + public static NetTypeManagerInterop NetTypeManager { get; } - + public static QGuiApplicationInterop QGuiApplication { get; } - + public static QQmlApplicationEngineInterop QQmlApplicationEngine { get; } - + public static NetVariantInterop NetVariant { get; } - + public static NetReferenceInterop NetReference { get; } - + public static NetVariantListInterop NetVariantList { get; } - + public static NetTestHelperInterop NetTestHelper { get; } - + public static NetSignalInfoInterop NetSignalInfo { get; } - + public static QResourceInterop QResource { get; } - + public static NetDelegateInterop NetDelegate { get; } - + public static NetJsValueInterop NetJsValue { get; } - + public static QQuickStyleInterop QQuickStyle { get; } public static QtInterop QtInterop { get; } - + public static UtilitiesInterop Utilities { get; } - + public static QtWebEngineInterop QtWebEngine { get; } - private static T LoadInteropType(IntPtr library, NetNativeLibLoader.Loader.IPlatformLoader loader) where T:new() + private static T LoadInteropType(IntPtr library, NetNativeLibLoader.Loader.IPlatformLoader loader) + where T : new() { var result = new T(); LoadDelegates(result, library, loader); return result; } - + private static void LoadDelegates(object o, IntPtr library, NetNativeLibLoader.Loader.IPlatformLoader loader) { foreach (var property in o.GetType().GetProperties()) diff --git a/src/net/Qml.Net/Internal/InteropBehaviors.cs b/src/net/Qml.Net/Internal/InteropBehaviors.cs index a8fd8f5f..9be16210 100644 --- a/src/net/Qml.Net/Internal/InteropBehaviors.cs +++ b/src/net/Qml.Net/Internal/InteropBehaviors.cs @@ -8,6 +8,7 @@ namespace Qml.Net.Internal internal static class InteropBehaviors { private static List _QmlInteropBehaviors = new List(); + public static IEnumerable QmlInteropBehaviors => _QmlInteropBehaviors; private static IEnumerable GetApplicableInteropBehaviors(Type forType) @@ -16,13 +17,13 @@ namespace Qml.Net.Internal .Where(b => b.IsApplicableFor(forType)); } - /// - /// Registers an additional Qml Interop behavior. This behavior only gets applied to types and instances created or registered after this behavior registration - /// - /// + /// + /// Registers an additional Qml Interop behavior. This behavior only gets applied to types and instances created or registered after this behavior registration + /// + /// IQmlInteropBehavior public static void RegisterQmlInteropBehavior(IQmlInteropBehavior behavior, bool addIfTypeAlreadyExists = false) { - if(!addIfTypeAlreadyExists && _QmlInteropBehaviors.Any(ib => ib.GetType() == behavior.GetType())) + if (!addIfTypeAlreadyExists && _QmlInteropBehaviors.Any(ib => ib.GetType() == behavior.GetType())) { return; } diff --git a/src/net/Qml.Net/Internal/LinuxDllImportLibraryPathResolver.cs b/src/net/Qml.Net/Internal/LinuxDllImportLibraryPathResolver.cs index a3efab20..a6069e8a 100644 --- a/src/net/Qml.Net/Internal/LinuxDllImportLibraryPathResolver.cs +++ b/src/net/Qml.Net/Internal/LinuxDllImportLibraryPathResolver.cs @@ -19,7 +19,7 @@ namespace Qml.Net.Internal { var result = _original.Resolve(library); - if(!result.IsSuccess && library == "QmlNet") + if (!result.IsSuccess && library == "QmlNet") { // Try to let .NET load the library. try @@ -39,7 +39,7 @@ namespace Qml.Net.Internal } // ReSharper disable EmptyGeneralCatchClause catch (Exception) - // ReSharper restore EmptyGeneralCatchClause + // ReSharper restore EmptyGeneralCatchClause { } } diff --git a/src/net/Qml.Net/Internal/MacDllImportLibraryPathResolver.cs b/src/net/Qml.Net/Internal/MacDllImportLibraryPathResolver.cs index fc2c82d5..d2294614 100644 --- a/src/net/Qml.Net/Internal/MacDllImportLibraryPathResolver.cs +++ b/src/net/Qml.Net/Internal/MacDllImportLibraryPathResolver.cs @@ -18,7 +18,7 @@ namespace Qml.Net.Internal { var result = _original.Resolve(library); - if(!result.IsSuccess && library == "QmlNet") + if (!result.IsSuccess && library == "QmlNet") { // Try to let .NET load the library. try @@ -32,14 +32,13 @@ namespace Qml.Net.Internal { return result; } - + var sym = dlsym(dll, "qml_net_getVersion"); if (sym == IntPtr.Zero) { return result; } - var info = new DlInfo(); if (dladdr(sym, ref info) != 1) { @@ -48,11 +47,12 @@ namespace Qml.Net.Internal var location = Marshal.PtrToStringAnsi(info.fname); - if(File.Exists(location)) + if (File.Exists(location)) { return ResolvePathResult.FromSuccess(location); } } + // ReSharper disable EmptyGeneralCatchClause catch (Exception) // ReSharper restore EmptyGeneralCatchClause @@ -65,13 +65,13 @@ namespace Qml.Net.Internal [DllImport("libQmlNet.dylib")] static extern long qml_net_getVersion(); - + [DllImport("dl")] static extern IntPtr dlopen(string fileName, SymbolFlag flags); - + [DllImport("dl")] static extern IntPtr dlsym(IntPtr handle, string name); - + [DllImport("dl")] static extern int dladdr(IntPtr handle, ref DlInfo info); @@ -82,7 +82,7 @@ namespace Qml.Net.Internal private IntPtr notUsed2; private IntPtr notUsed3; } - + [Flags] private enum SymbolFlag { diff --git a/src/net/Qml.Net/Internal/NativeSymbolAttribute.cs b/src/net/Qml.Net/Internal/NativeSymbolAttribute.cs index 1b568e15..a949e8dc 100644 --- a/src/net/Qml.Net/Internal/NativeSymbolAttribute.cs +++ b/src/net/Qml.Net/Internal/NativeSymbolAttribute.cs @@ -4,6 +4,6 @@ namespace Qml.Net.Internal { public class NativeSymbolAttribute : Attribute { - public string Entrypoint { get; set; } + public string Entrypoint { get; set; } } } diff --git a/src/net/Qml.Net/Internal/ObjectSignals.cs b/src/net/Qml.Net/Internal/ObjectSignals.cs index 6aaa92f9..ce62e558 100644 --- a/src/net/Qml.Net/Internal/ObjectSignals.cs +++ b/src/net/Qml.Net/Internal/ObjectSignals.cs @@ -13,15 +13,14 @@ namespace Qml.Net.Internal public void Dispose() { - } - + public Dictionary> Delegates { get; } } - + internal static class ObjectSignals { - private static readonly ConditionalWeakTable Signals + private static readonly ConditionalWeakTable Signals = new ConditionalWeakTable(); public static void AttachDelegateToSignal(this object obj, string signal, Delegate del) @@ -31,9 +30,9 @@ namespace Qml.Net.Internal { signals.Delegates[signal].Add(del); } - signals.Delegates.Add(signal, new List{del}); + signals.Delegates.Add(signal, new List { del }); } - + public static List GetAttachedDelegates(this object obj, string signal) { if (Signals.TryGetValue(obj, out var signalCollection)) diff --git a/src/net/Qml.Net/Internal/ObjectTagger.cs b/src/net/Qml.Net/Internal/ObjectTagger.cs index baa7b1f6..e0803ab1 100644 --- a/src/net/Qml.Net/Internal/ObjectTagger.cs +++ b/src/net/Qml.Net/Internal/ObjectTagger.cs @@ -38,7 +38,7 @@ namespace Qml.Net.Internal ~ObjectId() { - if(_Tagger != null) + if (_Tagger != null) { _Tagger.FreeId(Id); } diff --git a/src/net/Qml.Net/Internal/Qml/NetJsValue.cs b/src/net/Qml.Net/Internal/Qml/NetJsValue.cs index edae6663..8eb3a030 100644 --- a/src/net/Qml.Net/Internal/Qml/NetJsValue.cs +++ b/src/net/Qml.Net/Internal/Qml/NetJsValue.cs @@ -9,7 +9,6 @@ namespace Qml.Net.Internal.Qml public NetJsValue(IntPtr handle, bool ownsHandle = true) : base(handle, ownsHandle) { - } public bool IsCallable => Interop.NetJsValue.IsCallable(Handle); @@ -21,11 +20,11 @@ namespace Qml.Net.Internal.Qml var result = Interop.NetJsValue.Call(Handle, parameters?.Handle ?? IntPtr.Zero); return result != IntPtr.Zero ? new NetVariant(result) : null; } - + public object Call(params object[] parameters) { NetVariantList variants = null; - + if (parameters != null && parameters.Length > 0) { variants = new NetVariantList(); @@ -38,20 +37,20 @@ namespace Qml.Net.Internal.Qml } } } - + var result = Call(variants); - + variants?.Dispose(); if (result == null) { return null; } - + object returnValue = null; Helpers.Unpackvalue(ref returnValue, result); result.Dispose(); - + return returnValue; } @@ -105,7 +104,7 @@ namespace Qml.Net.Internal.Qml } public NetJsValue JsValue => _jsValue; - + public bool IsCallable => _jsValue.IsCallable; public bool IsArray => _jsValue.IsArray; @@ -142,14 +141,14 @@ namespace Qml.Net.Internal.Qml public override bool TryInvoke(InvokeBinder binder, object[] args, out object result) { result = null; - + if (!IsCallable) { return false; } result = Call(args); - + return true; } @@ -193,30 +192,37 @@ namespace Qml.Net.Internal.Qml { [NativeSymbol(Entrypoint = "net_js_value_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr jsValue); - + [NativeSymbol(Entrypoint = "net_js_value_isCallable")] public IsCallableDel IsCallable { get; set; } + public delegate bool IsCallableDel(IntPtr jsValue); - + [NativeSymbol(Entrypoint = "net_js_value_isArray")] public IsArrayDel IsArray { get; set; } + public delegate bool IsArrayDel(IntPtr jsValue); - + [NativeSymbol(Entrypoint = "net_js_value_call")] public CallDel Call { get; set; } + public delegate IntPtr CallDel(IntPtr jsValue, IntPtr parameters); - + [NativeSymbol(Entrypoint = "net_js_value_getProperty")] public GetPropertyDel GetProperty { get; set; } + public delegate IntPtr GetPropertyDel(IntPtr jsValue, [MarshalAs(UnmanagedType.LPWStr)] string propertyName); - + [NativeSymbol(Entrypoint = "net_js_value_getItemAtIndex")] public GetItemAtIndexDel GetItemAtIndex { get; set; } + public delegate IntPtr GetItemAtIndexDel(IntPtr jsValue, int arrayIndex); - + [NativeSymbol(Entrypoint = "net_js_value_setProperty")] public SetPropertyDel SetProperty { get; set; } + public delegate void SetPropertyDel(IntPtr jsValue, [MarshalAs(UnmanagedType.LPWStr)] string propertyName, IntPtr value); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Qml/NetTestHelper.cs b/src/net/Qml.Net/Internal/Qml/NetTestHelper.cs index e2e09dda..6cf3c973 100644 --- a/src/net/Qml.Net/Internal/Qml/NetTestHelper.cs +++ b/src/net/Qml.Net/Internal/Qml/NetTestHelper.cs @@ -10,11 +10,12 @@ namespace Qml.Net.Internal.Qml Interop.NetTestHelper.RunQml(qmlEngine.Handle, qml); } } - + internal class NetTestHelperInterop { [NativeSymbol(Entrypoint = "net_test_helper_runQml")] public RunQmlDel RunQml { get; set; } + public delegate void RunQmlDel(IntPtr qmlEngine, [MarshalAs(UnmanagedType.LPWStr)]string qml); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Qml/NetVariant.cs b/src/net/Qml.Net/Internal/Qml/NetVariant.cs index bc7fc234..ad4cedf7 100644 --- a/src/net/Qml.Net/Internal/Qml/NetVariant.cs +++ b/src/net/Qml.Net/Internal/Qml/NetVariant.cs @@ -9,13 +9,11 @@ namespace Qml.Net.Internal.Qml public NetVariant() : this(Interop.NetVariant.Create()) { - } public NetVariant(IntPtr handle, bool ownsHandle = true) : base(handle, ownsHandle) { - } public NetVariantType VariantType => Interop.NetVariant.GetVariantType(Handle); @@ -35,19 +33,19 @@ namespace Qml.Net.Internal.Qml get => Interop.NetVariant.GetBool(Handle); set => Interop.NetVariant.SetBool(Handle, value); } - + public char Char { get => (char)Interop.NetVariant.GetChar(Handle); set => Interop.NetVariant.SetChar(Handle, value); } - + public int Int { get => Interop.NetVariant.GetInt(Handle); set => Interop.NetVariant.SetInt(Handle, value); } - + public uint UInt { get => Interop.NetVariant.GetUInt(Handle); @@ -71,28 +69,29 @@ namespace Qml.Net.Internal.Qml get => Interop.NetVariant.GetFloat(Handle); set => Interop.NetVariant.SetFloat(Handle, value); } - + public double Double { get => Interop.NetVariant.GetDouble(Handle); set => Interop.NetVariant.SetDouble(Handle, value); } - + public string String { get => Utilities.ContainerToString(Interop.NetVariant.GetString(Handle)); set => Interop.NetVariant.SetString(Handle, value); } - + public DateTimeOffset? DateTime { get { - var dateTime = new DateTimeContainer(); + var dateTime = new DateTimeContainer(); Interop.NetVariant.GetDateTime(Handle, ref dateTime); if (dateTime.IsNull) return null; - return new DateTimeOffset(dateTime.Year, + return new DateTimeOffset( + dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, @@ -101,6 +100,7 @@ namespace Qml.Net.Internal.Qml dateTime.Msec, TimeSpan.FromSeconds(dateTime.OffsetSeconds)); } + set { var dateTime = new DateTimeContainer(); @@ -134,122 +134,161 @@ namespace Qml.Net.Internal.Qml } set => Interop.NetVariant.SetJsValue(Handle, value?.Handle ?? IntPtr.Zero); } - + public void Clear() { Interop.NetVariant.Clear(Handle); } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetVariant.Destroy(ptr); } } - + internal class NetVariantInterop { [NativeSymbol(Entrypoint = "net_variant_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(); - + [NativeSymbol(Entrypoint = "net_variant_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr variant); [NativeSymbol(Entrypoint = "net_variant_getVariantType")] public GetVariantTypeDel GetVariantType { get; set; } + public delegate NetVariantType GetVariantTypeDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setNetReference")] public SetNetReferenceDel SetNetReference { get; set; } + public delegate void SetNetReferenceDel(IntPtr variant, IntPtr instance); - + [NativeSymbol(Entrypoint = "net_variant_getNetReference")] public GetNetReferenceDel GetNetReference { get; set; } + public delegate IntPtr GetNetReferenceDel(IntPtr variant); [NativeSymbol(Entrypoint = "net_variant_setBool")] public SetBoolDel SetBool { get; set; } + public delegate void SetBoolDel(IntPtr variant, bool value); + [NativeSymbol(Entrypoint = "net_variant_getBool")] public GetBoolDel GetBool { get; set; } + public delegate bool GetBoolDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setChar")] public SetCharDel SetChar { get; set; } + public delegate void SetCharDel(IntPtr variant, ushort value); + [NativeSymbol(Entrypoint = "net_variant_getChar")] public GetCharDel GetChar { get; set; } + public delegate ushort GetCharDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setInt")] public SetIntDel SetInt { get; set; } + public delegate void SetIntDel(IntPtr variant, int value); + [NativeSymbol(Entrypoint = "net_variant_getInt")] public GetIntDel GetInt { get; set; } + public delegate int GetIntDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setUInt")] public SetUIntDel SetUInt { get; set; } + public delegate void SetUIntDel(IntPtr variant, uint value); + [NativeSymbol(Entrypoint = "net_variant_getUInt")] public GetUIntDel GetUInt { get; set; } + public delegate uint GetUIntDel(IntPtr variant); [NativeSymbol(Entrypoint = "net_variant_setLong")] public SetLongDel SetLong { get; set; } + public delegate void SetLongDel(IntPtr variant, long value); + [NativeSymbol(Entrypoint = "net_variant_getLong")] public GetLongDel GetLong { get; set; } + public delegate long GetLongDel(IntPtr variant); [NativeSymbol(Entrypoint = "net_variant_setULong")] public SetULongDel SetULong { get; set; } + public delegate void SetULongDel(IntPtr variant, ulong value); + [NativeSymbol(Entrypoint = "net_variant_getULong")] public GetULongDel GetULong { get; set; } + public delegate ulong GetULongDel(IntPtr variant); [NativeSymbol(Entrypoint = "net_variant_setFloat")] public SetFloatDel SetFloat { get; set; } + public delegate void SetFloatDel(IntPtr variant, float value); + [NativeSymbol(Entrypoint = "net_variant_getFloat")] public GetFloatDel GetFloat { get; set; } + public delegate float GetFloatDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setDouble")] public SetDoubleDel SetDouble { get; set; } + public delegate void SetDoubleDel(IntPtr variant, double value); + [NativeSymbol(Entrypoint = "net_variant_getDouble")] public GetDoubleDel GetDouble { get; set; } + public delegate double GetDoubleDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setString")] public SetStringDel SetString { get; set; } + public delegate void SetStringDel(IntPtr variant, [MarshalAs(UnmanagedType.LPWStr)]string value); + [NativeSymbol(Entrypoint = "net_variant_getString")] public GetStringDel GetString { get; set; } + public delegate IntPtr GetStringDel(IntPtr variant); - + [NativeSymbol(Entrypoint = "net_variant_setDateTime")] public SetDateTimeDel SetDateTime { get; set; } + public delegate void SetDateTimeDel(IntPtr variant, ref DateTimeContainer dateTime); + [NativeSymbol(Entrypoint = "net_variant_getDateTime")] public GetDateTimeDel GetDateTime { get; set; } + public delegate void GetDateTimeDel(IntPtr variant, ref DateTimeContainer dateTime); [NativeSymbol(Entrypoint = "net_variant_setJsValue")] public SetJsValueDel SetJsValue { get; set; } + public delegate void SetJsValueDel(IntPtr variant, IntPtr jsValue); + [NativeSymbol(Entrypoint = "net_variant_getJsValue")] public GetJsValueDel GetJsValue { get; set; } + public delegate IntPtr GetJsValueDel(IntPtr variant); [NativeSymbol(Entrypoint = "net_variant_clear")] public ClearDel Clear { get; set; } + public delegate void ClearDel(IntPtr variant); } - + [StructLayout(LayoutKind.Sequential)] internal struct DateTimeContainer { diff --git a/src/net/Qml.Net/Internal/Qml/NetVariantList.cs b/src/net/Qml.Net/Internal/Qml/NetVariantList.cs index d78e55e8..444cad5c 100644 --- a/src/net/Qml.Net/Internal/Qml/NetVariantList.cs +++ b/src/net/Qml.Net/Internal/Qml/NetVariantList.cs @@ -7,13 +7,11 @@ namespace Qml.Net.Internal.Qml public NetVariantList() : this(Interop.NetVariantList.Create()) { - } public NetVariantList(IntPtr handle, bool ownsHandle = true) : base(handle, ownsHandle) { - } public int Count => Interop.NetVariantList.Count(Handle); @@ -39,37 +37,48 @@ namespace Qml.Net.Internal.Qml { Interop.NetVariantList.Clear(Handle); } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetVariantList.Destroy(ptr); } } - + internal class NetVariantListInterop - { + { [NativeSymbol(Entrypoint = "net_variant_list_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(); + [NativeSymbol(Entrypoint = "net_variant_list_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr list); [NativeSymbol(Entrypoint = "net_variant_list_count")] public CountDel Count { get; set; } + public delegate int CountDel(IntPtr list); - + [NativeSymbol(Entrypoint = "net_variant_list_add")] public AddDel Add { get; set; } + public delegate void AddDel(IntPtr list, IntPtr variant); + [NativeSymbol(Entrypoint = "net_variant_list_get")] public GetDel Get { get; set; } + public delegate IntPtr GetDel(IntPtr list, int index); + [NativeSymbol(Entrypoint = "net_variant_list_remove")] public RemoveDel Remove { get; set; } + public delegate void RemoveDel(IntPtr list, int index); + [NativeSymbol(Entrypoint = "net_variant_list_clear")] public ClearDel Clear { get; set; } + public delegate void ClearDel(IntPtr list); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Types/Callbacks.cs b/src/net/Qml.Net/Internal/Types/Callbacks.cs index 9a795e1d..02b4d3ad 100644 --- a/src/net/Qml.Net/Internal/Types/Callbacks.cs +++ b/src/net/Qml.Net/Internal/Types/Callbacks.cs @@ -26,26 +26,32 @@ namespace Qml.Net.Internal.Types { [NativeSymbol(Entrypoint = "type_info_callbacks_registerCallbacks")] public RegisterCallbacksDel RegisterCallbacks { get; set; } + public delegate void RegisterCallbacksDel(ref Callbacks callbacks); [NativeSymbol(Entrypoint = "type_info_callbacks_isTypeValid")] public IsTypeValidDel IsTypeValid { get; set; } + public delegate bool IsTypeValidDel([MarshalAs(UnmanagedType.LPWStr)]string typeName); [NativeSymbol(Entrypoint = "type_info_callbacks_releaseNetReferenceGCHandle")] public ReleaseNetReferenceDel ReleaseNetReference { get; set; } + public delegate void ReleaseNetReferenceDel(UInt64 objectId); [NativeSymbol(Entrypoint = "type_info_callbacks_releaseNetDelegateGCHandle")] public ReleaseNetDelegateGCHandleDel ReleaseNetDelegateGCHandle { get; set; } + public delegate void ReleaseNetDelegateGCHandleDel(IntPtr handle); - + [NativeSymbol(Entrypoint = "type_info_callbacks_instantiateType")] public InstantiateTypeDel InstantiateType { get; set; } + public delegate IntPtr InstantiateTypeDel(IntPtr type); - + [NativeSymbol(Entrypoint = "type_info_callbacks_invokeMethod")] public InvokeMethodDel InvokeMethod { get; set; } + public delegate void InvokeMethodDel(IntPtr method, IntPtr target, IntPtr variants, IntPtr result); } @@ -60,7 +66,7 @@ namespace Qml.Net.Internal.Types void CreateLazyTypeInfo(IntPtr typeInfo); void LoadTypeInfo(IntPtr typeInfo); - + IntPtr InstantiateType(IntPtr type); void ReadProperty(IntPtr property, IntPtr target, IntPtr indexProperty, IntPtr result); @@ -74,10 +80,10 @@ namespace Qml.Net.Internal.Types bool RaiseNetSignals(IntPtr target, string signalName, IntPtr parameters); Task AwaitTask(IntPtr target, IntPtr succesCallback, IntPtr failureCallback); - + bool Serialize(IntPtr instance, IntPtr result); } - + internal class CallbacksImpl { readonly ICallbacks _callbacks; @@ -94,28 +100,28 @@ namespace Qml.Net.Internal.Types RaiseNetSignalsDelegate _raiseNetSignalsDelegate; AwaitTaskDelegate _awaitTaskDelegate; SerializeDelegate _serializeDelegate; - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate bool IsTypeValidDelegate([MarshalAs(UnmanagedType.LPWStr)]string typeName); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void CreateLazyTypeInfoDelegate(IntPtr typeInfo); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void LoadTypeInfoDelegate(IntPtr typeInfo); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void ReleaseNetReferenceDelegate(UInt64 objectId); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void ReleaseNetDelegateGCHandleDelegate(IntPtr handle); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate IntPtr InstantiateTypeDelgate(IntPtr type); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void ReadPropertyDelegate(IntPtr property, IntPtr target, IntPtr indexParameter, IntPtr result); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void WritePropertyDelegate(IntPtr property, IntPtr target, IntPtr indexParameter, IntPtr value); @@ -124,20 +130,20 @@ namespace Qml.Net.Internal.Types [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void GCCollectDelegate(int maxGeneration); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate bool RaiseNetSignalsDelegate(IntPtr target, [MarshalAs(UnmanagedType.LPWStr)]string signalName, IntPtr parameters); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void AwaitTaskDelegate(IntPtr target, IntPtr successCallback, IntPtr failureCallback); - + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate bool SerializeDelegate(IntPtr instance, IntPtr result); - + public CallbacksImpl(ICallbacks callbacks) { _callbacks = callbacks; - + _isTypeValidDelegate = IsTypeValid; GCHandle.Alloc(_isTypeValidDelegate); @@ -152,7 +158,7 @@ namespace Qml.Net.Internal.Types _loadTypeInfoDelegate = LoadTypeInfo; GCHandle.Alloc(_loadTypeInfoDelegate); - + _instantiateTypeDelgate = InstantiateType; GCHandle.Alloc(_instantiateTypeDelgate); @@ -182,7 +188,7 @@ namespace Qml.Net.Internal.Types { return _callbacks.IsTypeValid(typeName); } - + private void ReleaseNetReference(UInt64 objectId) { _callbacks.ReleaseNetReference(objectId); @@ -197,17 +203,17 @@ namespace Qml.Net.Internal.Types { _callbacks.CreateLazyTypeInfo(type); } - + private void LoadTypeInfo(IntPtr type) { _callbacks.LoadTypeInfo(type); } - + private IntPtr InstantiateType(IntPtr type) { return _callbacks.InstantiateType(type); } - + private void ReadProperty(IntPtr property, IntPtr target, IntPtr indexParameter, IntPtr result) { _callbacks.ReadProperty(property, target, indexParameter, result); @@ -228,7 +234,8 @@ namespace Qml.Net.Internal.Types _callbacks.GCCollect(maxGeneration); } - private bool RaiseNetSignals(IntPtr target, + private bool RaiseNetSignals( + IntPtr target, string signalName, IntPtr parameters) { diff --git a/src/net/Qml.Net/Internal/Types/NetDelegate.cs b/src/net/Qml.Net/Internal/Types/NetDelegate.cs index ba5a6f0d..5362cc64 100644 --- a/src/net/Qml.Net/Internal/Types/NetDelegate.cs +++ b/src/net/Qml.Net/Internal/Types/NetDelegate.cs @@ -8,7 +8,6 @@ namespace Qml.Net.Internal.Types public NetDelegate(IntPtr handle) : base(handle) { - } public static NetDelegate FromDelegate(Delegate del) @@ -22,7 +21,6 @@ namespace Qml.Net.Internal.Types handle.Free(); } - public Delegate Delegate { get @@ -31,7 +29,7 @@ namespace Qml.Net.Internal.Types return (Delegate)handle.Target; } } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetDelegate.Destroy(ptr); @@ -42,13 +40,17 @@ namespace Qml.Net.Internal.Types { [NativeSymbol(Entrypoint = "delegate_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(IntPtr handle); + [NativeSymbol(Entrypoint = "delegate_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr del); - + [NativeSymbol(Entrypoint = "delegate_getHandle")] public GetHandleDel GetHandle { get; set; } + public delegate IntPtr GetHandleDel(IntPtr del); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Types/NetMethodInfo.cs b/src/net/Qml.Net/Internal/Types/NetMethodInfo.cs index 1682f7d3..c4ff486b 100644 --- a/src/net/Qml.Net/Internal/Types/NetMethodInfo.cs +++ b/src/net/Qml.Net/Internal/Types/NetMethodInfo.cs @@ -1,33 +1,33 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; -using Qml.Net.Internal; namespace Qml.Net.Internal.Types { internal class NetMethodInfo : BaseDisposable { - public NetMethodInfo(NetTypeInfo parentTypeInfo, + public NetMethodInfo( + NetTypeInfo parentTypeInfo, string methodName, NetTypeInfo returnTypeInfo, bool isStatic) : this(Create(parentTypeInfo, methodName, returnTypeInfo, isStatic)) { - } public NetMethodInfo(IntPtr handle, bool ownsHandle = true) - :base(handle, ownsHandle) + : base(handle, ownsHandle) { - } - private static IntPtr Create(NetTypeInfo parentTypeInfo, + private static IntPtr Create( + NetTypeInfo parentTypeInfo, string methodName, NetTypeInfo returnTypeInfo, bool isStatic) { - return Interop.NetMethodInfo.Create(parentTypeInfo?.Handle ?? IntPtr.Zero, + return Interop.NetMethodInfo.Create( + parentTypeInfo?.Handle ?? IntPtr.Zero, methodName, returnTypeInfo?.Handle ?? IntPtr.Zero, isStatic); @@ -71,7 +71,7 @@ namespace Qml.Net.Internal.Types } return result; } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetMethodInfo.Destroy(ptr); @@ -83,7 +83,6 @@ namespace Qml.Net.Internal.Types public NetMethodInfoParameter(IntPtr handle) : base(handle) { - } public string Name => Utilities.ContainerToString(Interop.NetMethodInfo.GetParameterName(Handle)); @@ -97,57 +96,68 @@ namespace Qml.Net.Internal.Types return new NetTypeInfo(result); } } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetMethodInfo.DestroyParameter(ptr); } } - + internal class NetMethodInfoInterop { [NativeSymbol(Entrypoint = "method_info_parameter_destroy")] public DestroyParameterDel DestroyParameter { get; set; } + public delegate void DestroyParameterDel(IntPtr parameter); - + [NativeSymbol(Entrypoint = "method_info_parameter_getName")] public GetParameterNameDel GetParameterName { get; set; } + public delegate IntPtr GetParameterNameDel(IntPtr methodParameter); - + [NativeSymbol(Entrypoint = "method_info_parameter_getType")] public GetParameterTypeDel GetParameterType { get; set; } + public delegate IntPtr GetParameterTypeDel(IntPtr methodParameter); - + [NativeSymbol(Entrypoint = "method_info_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(IntPtr parentTypeInfo, [MarshalAs(UnmanagedType.LPWStr)]string methodName, IntPtr returnTypeInfo, bool isStatic); - + [NativeSymbol(Entrypoint = "method_info_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr methodInfo); [NativeSymbol(Entrypoint = "method_info_getMethodName")] public GetMethodNameDel GetMethodName { get; set; } + public delegate IntPtr GetMethodNameDel(IntPtr method); - + [NativeSymbol(Entrypoint = "method_info_getReturnType")] public GetReturnTypeDel GetReturnType { get; set; } + public delegate IntPtr GetReturnTypeDel(IntPtr method); - + [NativeSymbol(Entrypoint = "method_info_isStatic")] public GetIsStaticDel GetIsStatic { get; set; } + public delegate bool GetIsStaticDel(IntPtr method); - + [NativeSymbol(Entrypoint = "method_info_addParameter")] public AddParameterDel AddParameter { get; set; } + public delegate void AddParameterDel(IntPtr method, [MarshalAs(UnmanagedType.LPWStr)]string name, IntPtr type); - + [NativeSymbol(Entrypoint = "method_info_getParameterCount")] public GetParameterCountDel GetParameterCount { get; set; } + public delegate int GetParameterCountDel(IntPtr method); - + [NativeSymbol(Entrypoint = "method_info_getParameter")] public GetParameterDel GetParameter { get; set; } + public delegate IntPtr GetParameterDel(IntPtr method, int index); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Types/NetPropertyInfo.cs b/src/net/Qml.Net/Internal/Types/NetPropertyInfo.cs index d8c8f0cf..6026a424 100644 --- a/src/net/Qml.Net/Internal/Types/NetPropertyInfo.cs +++ b/src/net/Qml.Net/Internal/Types/NetPropertyInfo.cs @@ -1,41 +1,42 @@ using System; using System.Runtime.InteropServices; -using Qml.Net.Internal; namespace Qml.Net.Internal.Types { internal class NetPropertyInfo : BaseDisposable { - public NetPropertyInfo(NetTypeInfo parentType, + public NetPropertyInfo( + NetTypeInfo parentType, string name, NetTypeInfo returnType, bool canRead, bool canWrite, NetSignalInfo notifySignal) - : this(Create(parentType, + : this(Create( + parentType, name, returnType, canRead, canWrite, notifySignal)) { - } public NetPropertyInfo(IntPtr handle, bool ownsHandle = true) : base(handle, ownsHandle) { - } - private static IntPtr Create(NetTypeInfo parentType, + private static IntPtr Create( + NetTypeInfo parentType, string name, NetTypeInfo returnType, bool canRead, bool canWrite, NetSignalInfo notifySignal) { - return Interop.NetPropertyInfo.Create(parentType?.Handle ?? IntPtr.Zero, + return Interop.NetPropertyInfo.Create( + parentType?.Handle ?? IntPtr.Zero, name, returnType?.Handle ?? IntPtr.Zero, canRead, @@ -46,7 +47,7 @@ namespace Qml.Net.Internal.Types public NetTypeInfo ParentType => new NetTypeInfo(Interop.NetPropertyInfo.GetParentType(Handle)); public string Name => Utilities.ContainerToString(Interop.NetPropertyInfo.GetPropertyName(Handle)); - + public NetTypeInfo ReturnType => new NetTypeInfo(Interop.NetPropertyInfo.GetReturnType(Handle)); public bool CanRead => Interop.NetPropertyInfo.GetCanRead(Handle); @@ -60,12 +61,13 @@ namespace Qml.Net.Internal.Types var result = Interop.NetPropertyInfo.GetNotifySignal(Handle); return result == IntPtr.Zero ? null : new NetSignalInfo(result); } + set { Interop.NetPropertyInfo.SetNotifySignal(Handle, value.Handle); } } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetPropertyInfo.Destroy(ptr); @@ -76,43 +78,53 @@ namespace Qml.Net.Internal.Types { [NativeSymbol(Entrypoint = "property_info_create")] public CreateDel Create { get; set; } - public delegate IntPtr CreateDel(IntPtr parentType, + + public delegate IntPtr CreateDel( + IntPtr parentType, [MarshalAs(UnmanagedType.LPWStr)]string methodName, IntPtr returnType, bool canRead, bool canWrite, IntPtr notifySignal); - + [NativeSymbol(Entrypoint = "property_info_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_getParentType")] public GetParentTypeDel GetParentType { get; set; } + public delegate IntPtr GetParentTypeDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_getPropertyName")] public GetPropertyNameDel GetPropertyName { get; set; } + public delegate IntPtr GetPropertyNameDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_getReturnType")] public GetReturnTypeDel GetReturnType { get; set; } + public delegate IntPtr GetReturnTypeDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_canRead")] public GetCanReadDel GetCanRead { get; set; } + public delegate bool GetCanReadDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_canWrite")] public GetCanWriteDel GetCanWrite { get; set; } + public delegate bool GetCanWriteDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_getNotifySignal")] public GetNotifySignalDel GetNotifySignal { get; set; } + public delegate IntPtr GetNotifySignalDel(IntPtr property); [NativeSymbol(Entrypoint = "property_info_setNotifySignal")] public SetNotifySignalDel SetNotifySignal { get; set; } + public delegate void SetNotifySignalDel(IntPtr property, IntPtr signal); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Types/NetReference.cs b/src/net/Qml.Net/Internal/Types/NetReference.cs index fc4cf22d..b0f1da01 100644 --- a/src/net/Qml.Net/Internal/Types/NetReference.cs +++ b/src/net/Qml.Net/Internal/Types/NetReference.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; -using Qml.Net.Internal; using Qml.Net.Internal.Qml; namespace Qml.Net.Internal.Types @@ -9,21 +8,20 @@ namespace Qml.Net.Internal.Types internal class NetReference : BaseDisposable { private NetReference(UInt64 objectId, NetTypeInfo type, bool ownsHandle = true) - :base(Interop.NetReference.Create(objectId, type.Handle), ownsHandle) + : base(Interop.NetReference.Create(objectId, type.Handle), ownsHandle) { } public NetReference(IntPtr handle, bool ownsHandle = true) : base(handle, ownsHandle) { - } public object Instance { get { - if(ObjectIdReferenceTracker.TryGetObjectFor(ObjectId, out var obj)) + if (ObjectIdReferenceTracker.TryGetObjectFor(ObjectId, out var obj)) { return obj; } @@ -60,9 +58,9 @@ namespace Qml.Net.Internal.Types { Interop.NetReference.Destroy(ptr); } - + #region Instance helpers - + private static Type GetUnproxiedType(Type type) { if (type.Namespace == "Castle.Proxies") @@ -70,7 +68,7 @@ namespace Qml.Net.Internal.Types return type; } - + public static NetReference CreateForObject(object value, bool autoCreateIfNotExist = true) { if (value == null) return null; @@ -81,10 +79,13 @@ namespace Qml.Net.Internal.Types // This item isn't tagged, so don't auto tag. return null; } - - var typeInfo = NetTypeManager.GetTypeInfo(GetUnproxiedType(value.GetType())); - if(typeInfo == null) throw new InvalidOperationException($"Couldn't create type info from {value.GetType().AssemblyQualifiedName}"); + var typeInfo = NetTypeManager.GetTypeInfo(GetUnproxiedType(value.GetType())); + if (typeInfo == null) + { + throw new InvalidOperationException($"Couldn't create type info from {value.GetType().AssemblyQualifiedName}"); + } + objectId = value.GetOrCreateTag(); var newNetReference = new NetReference(objectId.Value, typeInfo); @@ -102,25 +103,30 @@ namespace Qml.Net.Internal.Types } internal class NetReferenceInterop - { + { [NativeSymbol(Entrypoint = "net_instance_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(UInt64 objectId, IntPtr type); - + [NativeSymbol(Entrypoint = "net_instance_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr instance); - + [NativeSymbol(Entrypoint = "net_instance_clone")] public CloneDel Clone { get; set; } + public delegate IntPtr CloneDel(IntPtr instance); [NativeSymbol(Entrypoint = "net_instance_getObjectId")] public GetObjectIdDel GetObjectId { get; set; } + public delegate UInt64 GetObjectIdDel(IntPtr instance); - + [NativeSymbol(Entrypoint = "net_instance_activateSignal")] public ActivateSignalDel ActivateSignal { get; set; } + public delegate bool ActivateSignalDel(IntPtr instance, [MarshalAs(UnmanagedType.LPWStr)]string signalName, IntPtr variants); } @@ -129,6 +135,7 @@ namespace Qml.Net.Internal.Types class ObjectEntry { public object Obj { get; private set; } + public UInt64 Counter { get; set; } public ObjectEntry(object obj, UInt64 count) @@ -143,9 +150,9 @@ namespace Qml.Net.Internal.Types internal static bool TryGetObjectFor(UInt64 objectId, out object obj) { - lock(_LockObject) + lock (_LockObject) { - if(_ObjectIdObjectLookup.ContainsKey(objectId)) + if (_ObjectIdObjectLookup.ContainsKey(objectId)) { obj = _ObjectIdObjectLookup[objectId].Obj; return true; @@ -164,13 +171,16 @@ namespace Qml.Net.Internal.Types throw new InvalidOperationException("Releasing a NetReference that hasn't been counted!"); } _ObjectIdObjectLookup[objectId].Counter--; - //when there are no more QML references + + // When there are no more QML references. if (_ObjectIdObjectLookup[objectId].Counter == 0) { var obj = _ObjectIdObjectLookup[objectId].Obj; - //remove object entry + + // Remove object entry. _ObjectIdObjectLookup.Remove(objectId); - //and notify the behaviors + + // And notify the behaviors. InteropBehaviors.OnObjectLeavesNative(obj, objectId); } } diff --git a/src/net/Qml.Net/Internal/Types/NetSignalInfo.cs b/src/net/Qml.Net/Internal/Types/NetSignalInfo.cs index 09afe34f..234bb5fc 100644 --- a/src/net/Qml.Net/Internal/Types/NetSignalInfo.cs +++ b/src/net/Qml.Net/Internal/Types/NetSignalInfo.cs @@ -8,19 +8,17 @@ namespace Qml.Net.Internal.Types internal NetSignalInfo(IntPtr handle, bool ownsHandle = true) : base(handle, ownsHandle) { - } public NetSignalInfo(NetTypeInfo parentType, string name) : this(Interop.NetSignalInfo.Create(parentType.Handle, name)) { - } public NetTypeInfo ParentType => new NetTypeInfo(Interop.NetSignalInfo.GetParentType(Handle)); public string Name => Utilities.ContainerToString(Interop.NetSignalInfo.GetName(Handle)); - + public void AddParameter(NetVariantType type) { Interop.NetSignalInfo.AddParameter(Handle, type); @@ -43,26 +41,37 @@ namespace Qml.Net.Internal.Types { [NativeSymbol(Entrypoint = "signal_info_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(IntPtr parentType, [MarshalAs(UnmanagedType.LPWStr)] string name); + [NativeSymbol(Entrypoint = "signal_info_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr signal); [NativeSymbol(Entrypoint = "signal_info_getParentType")] public GetParentTypeDel GetParentType { get; set; } + public delegate IntPtr GetParentTypeDel(IntPtr signal); + [NativeSymbol(Entrypoint = "signal_info_getName")] public GetNameDel GetName { get; set; } + public delegate IntPtr GetNameDel(IntPtr signal); - + [NativeSymbol(Entrypoint = "signal_info_addParameter")] public AddParameterDel AddParameter { get; set; } + public delegate void AddParameterDel(IntPtr signal, NetVariantType type); + [NativeSymbol(Entrypoint = "signal_info_getParameterCount")] public GetParameterCountDel GetParameterCount { get; set; } + public delegate int GetParameterCountDel(IntPtr signal); + [NativeSymbol(Entrypoint = "signal_info_getParameter")] public GetParameterDel GetParameter { get; set; } + public delegate NetVariantType GetParameterDel(IntPtr signal, int index); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Types/NetTypeInfo.cs b/src/net/Qml.Net/Internal/Types/NetTypeInfo.cs index e21d1f31..882c39c9 100644 --- a/src/net/Qml.Net/Internal/Types/NetTypeInfo.cs +++ b/src/net/Qml.Net/Internal/Types/NetTypeInfo.cs @@ -6,14 +6,13 @@ namespace Qml.Net.Internal.Types internal class NetTypeInfo : BaseDisposable { public NetTypeInfo(string fullTypeName) - :this(Interop.NetTypeInfo.Create(fullTypeName)) + : this(Interop.NetTypeInfo.Create(fullTypeName)) { } public NetTypeInfo(IntPtr handle, bool ownsHandle = true) - :base(handle, ownsHandle) + : base(handle, ownsHandle) { - } public string FullTypeName => Utilities.ContainerToString(Interop.NetTypeInfo.GetFullTypeName(Handle)); @@ -35,13 +34,13 @@ namespace Qml.Net.Internal.Types get => Interop.NetTypeInfo.GetIsArray(Handle); set => Interop.NetTypeInfo.SetIsArray(Handle, value); } - + public bool IsList { get => Interop.NetTypeInfo.GetIsList(Handle); set => Interop.NetTypeInfo.SetIsList(Handle, value); } - + public void AddMethod(NetMethodInfo methodInfo) { Interop.NetTypeInfo.AddMethod(Handle, methodInfo.Handle); @@ -55,7 +54,7 @@ namespace Qml.Net.Internal.Types if (result == IntPtr.Zero) return null; return new NetMethodInfo(result); } - + public int LocalMethodCount => Interop.NetTypeInfo.GetLocalMethodCount(Handle); public NetMethodInfo GetLocalMethod(int index) @@ -64,7 +63,7 @@ namespace Qml.Net.Internal.Types if (result == IntPtr.Zero) return null; return new NetMethodInfo(result); } - + public int StaticMethodCount => Interop.NetTypeInfo.GetStaticMethodCount(Handle); public NetMethodInfo GetStaticMethod(int index) @@ -73,7 +72,7 @@ namespace Qml.Net.Internal.Types if (result == IntPtr.Zero) return null; return new NetMethodInfo(result); } - + public void AddProperty(NetPropertyInfo property) { Interop.NetTypeInfo.AddProperty(Handle, property.Handle); @@ -87,7 +86,7 @@ namespace Qml.Net.Internal.Types if (result == IntPtr.Zero) return null; return new NetPropertyInfo(result); } - + public void AddSignal(NetSignalInfo signal) { Interop.NetTypeInfo.AddSignal(Handle, signal.Handle); @@ -110,7 +109,7 @@ namespace Qml.Net.Internal.Types { Interop.NetTypeInfo.EnsureLoaded(Handle); } - + protected override void DisposeUnmanaged(IntPtr ptr) { Interop.NetTypeInfo.Destroy(ptr); @@ -121,110 +120,137 @@ namespace Qml.Net.Internal.Types { [NativeSymbol(Entrypoint = "type_info_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel([MarshalAs(UnmanagedType.LPWStr)]string fullTypeName); - + [NativeSymbol(Entrypoint = "type_info_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr netTypeInfo); - + [NativeSymbol(Entrypoint = "type_info_getFullTypeName")] public GetFullTypeNameDel GetFullTypeName { get; set; } + public delegate IntPtr GetFullTypeNameDel(IntPtr netTypeInfo); - + [NativeSymbol(Entrypoint = "type_info_setClassName")] public SetClassNameDel SetClassName { get; set; } + public delegate void SetClassNameDel(IntPtr netTypeInfo, [MarshalAs(UnmanagedType.LPWStr)]string className); - + [NativeSymbol(Entrypoint = "type_info_getClassName")] public GetClassNameDel GetClassName { get; set; } + public delegate IntPtr GetClassNameDel(IntPtr netTypeInfo); - + [NativeSymbol(Entrypoint = "type_info_setPrefVariantType")] public SetPrefVariantTypeDel SetPrefVariantType { get; set; } + public delegate void SetPrefVariantTypeDel(IntPtr netTypeInfo, NetVariantType variantType); - + [NativeSymbol(Entrypoint = "type_info_getPrefVariantType")] public GetPrefVariantTypeDel GetPrefVariantType { get; set; } + public delegate NetVariantType GetPrefVariantTypeDel(IntPtr netTypeInfo); [NativeSymbol(Entrypoint = "type_info_setIsArray")] public GetIsArrayDel GetIsArray { get; set; } + public delegate bool GetIsArrayDel(IntPtr netTypeInfo); - + [NativeSymbol(Entrypoint = "type_info_getIsArray")] public SetIsArrayDel SetIsArray { get; set; } + public delegate void SetIsArrayDel(IntPtr netTypeInfo, bool isArray); - + [NativeSymbol(Entrypoint = "type_info_setIsList")] public GetIsListDel GetIsList { get; set; } + public delegate bool GetIsListDel(IntPtr netTypeInfo); - + [NativeSymbol(Entrypoint = "type_info_getIsList")] public SetIsListDel SetIsList { get; set; } + public delegate void SetIsListDel(IntPtr netTypeInfo, bool isList); - + [NativeSymbol(Entrypoint = "type_info_addMethod")] public AddMethodDel AddMethod { get; set; } + public delegate void AddMethodDel(IntPtr typeInfo, IntPtr methodInfo); - + [NativeSymbol(Entrypoint = "type_info_getMethodCount")] public GetMethodCountDel GetMethodCount { get; set; } + public delegate int GetMethodCountDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_getMethodInfo")] public GetMethodInfoDel GetMethodInfo { get; set; } + public delegate IntPtr GetMethodInfoDel(IntPtr typeInfo, int index); - + [NativeSymbol(Entrypoint = "type_info_getLocalMethodCount")] public GetLocalMethodCountDel GetLocalMethodCount { get; set; } + public delegate int GetLocalMethodCountDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_getLocalMethodInfo")] public GetLocalMethodInfoDel GetLocalMethodInfo { get; set; } + public delegate IntPtr GetLocalMethodInfoDel(IntPtr typeInfo, int index); - + [NativeSymbol(Entrypoint = "type_info_getStaticMethodCount")] public GetStaticMethodCountDel GetStaticMethodCount { get; set; } + public delegate int GetStaticMethodCountDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_getStaticMethodInfo")] public GetStaticMethodInfoDel GetStaticMethodInfo { get; set; } + public delegate IntPtr GetStaticMethodInfoDel(IntPtr typeInfo, int index); - + [NativeSymbol(Entrypoint = "type_info_addProperty")] public AddPropertyDel AddProperty { get; set; } + public delegate void AddPropertyDel(IntPtr typeInfo, IntPtr property); - + [NativeSymbol(Entrypoint = "type_info_getPropertyCount")] public GetPropertyCountDel GetPropertyCount { get; set; } + public delegate int GetPropertyCountDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_getProperty")] public GetPropertyDel GetProperty { get; set; } + public delegate IntPtr GetPropertyDel(IntPtr typeInfo, int index); - + [NativeSymbol(Entrypoint = "type_info_addSignal")] public AddSignalDel AddSignal { get; set; } + public delegate void AddSignalDel(IntPtr typeInfo, IntPtr signal); - + [NativeSymbol(Entrypoint = "type_info_getSignalCount")] public GetSignalCountDel GetSignalCount { get; set; } + public delegate int GetSignalCountDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_getSignal")] public GetSignalDel GetSignal { get; set; } + public delegate IntPtr GetSignalDel(IntPtr typeInfo, int index); [NativeSymbol(Entrypoint = "type_info_isLoaded")] public IsLoadedDel IsLoaded { get; set; } + public delegate bool IsLoadedDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_isLoading")] public IsLoadingDel IsLoading { get; set; } + public delegate bool IsLoadingDel(IntPtr typeInfo); - + [NativeSymbol(Entrypoint = "type_info_ensureLoaded")] public EnsureLoadedDel EnsureLoaded { get; set; } + public delegate void EnsureLoadedDel(IntPtr typeInfo); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/Types/NetTypeManager.cs b/src/net/Qml.Net/Internal/Types/NetTypeManager.cs index bd31a816..4409d630 100644 --- a/src/net/Qml.Net/Internal/Types/NetTypeManager.cs +++ b/src/net/Qml.Net/Internal/Types/NetTypeManager.cs @@ -12,7 +12,7 @@ namespace Qml.Net.Internal.Types public static NetTypeInfo GetTypeInfo(Type type) { - if(type == null) + if (type == null) { return null; } @@ -21,11 +21,12 @@ namespace Qml.Net.Internal.Types return netTypeInfo; } } - + internal class NetTypeManagerInterop { [NativeSymbol(Entrypoint = "type_manager_getTypeInfo")] public GetTypeInfoDel GetTypeInfo { get; set; } + public delegate IntPtr GetTypeInfoDel([MarshalAs(UnmanagedType.LPWStr)]string fullTypeName); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Internal/WindowsDllImportLibraryPathResolver.cs b/src/net/Qml.Net/Internal/WindowsDllImportLibraryPathResolver.cs index acb7e6d2..ac6882fc 100644 --- a/src/net/Qml.Net/Internal/WindowsDllImportLibraryPathResolver.cs +++ b/src/net/Qml.Net/Internal/WindowsDllImportLibraryPathResolver.cs @@ -18,7 +18,7 @@ namespace Qml.Net.Internal { var result = _original.Resolve(library); - if(!result.IsSuccess && library == "QmlNet") + if (!result.IsSuccess && library == "QmlNet") { // Try to let .NET load the library. try @@ -34,7 +34,7 @@ namespace Qml.Net.Internal var path = Marshal.PtrToStringAnsi(bytes); Marshal.FreeHGlobal(bytes); - if(File.Exists(path)) + if (File.Exists(path)) { return ResolvePathResult.FromSuccess(path); } diff --git a/src/net/Qml.Net/NotifySignalAttribute.cs b/src/net/Qml.Net/NotifySignalAttribute.cs index 32cd4749..32ba52a5 100644 --- a/src/net/Qml.Net/NotifySignalAttribute.cs +++ b/src/net/Qml.Net/NotifySignalAttribute.cs @@ -7,14 +7,13 @@ namespace Qml.Net { public NotifySignalAttribute() { - } - + public NotifySignalAttribute(string name) { Name = name; } - + public string Name { get; set; } } } \ No newline at end of file diff --git a/src/net/Qml.Net/QGuiApplication.cs b/src/net/Qml.Net/QGuiApplication.cs index 1b14f557..13f8d0ff 100644 --- a/src/net/Qml.Net/QGuiApplication.cs +++ b/src/net/Qml.Net/QGuiApplication.cs @@ -15,31 +15,30 @@ namespace Qml.Net readonly SynchronizationContext _oldSynchronizationContext; public QGuiApplication() - :this(null) + : this(null) { - } - + public QGuiApplication(string[] args) - :base(Create(args?.ToList())) + : base(Create(args?.ToList())) { TriggerDelegate triggerDelegate = Trigger; _triggerHandle = GCHandle.Alloc(triggerDelegate); - + Interop.QGuiApplication.AddTriggerCallback(Handle, Marshal.GetFunctionPointerForDelegate(triggerDelegate)); - + _oldSynchronizationContext = SynchronizationContext.Current; SynchronizationContext.SetSynchronizationContext(new QtSynchronizationContext(this)); } internal QGuiApplication(IntPtr existingApp) - :base(CreateFromExisting(existingApp)) + : base(CreateFromExisting(existingApp)) { TriggerDelegate triggerDelegate = Trigger; _triggerHandle = GCHandle.Alloc(triggerDelegate); - + Interop.QGuiApplication.AddTriggerCallback(Handle, Marshal.GetFunctionPointerForDelegate(triggerDelegate)); - + _oldSynchronizationContext = SynchronizationContext.Current; SynchronizationContext.SetSynchronizationContext(new QtSynchronizationContext(this)); } @@ -84,7 +83,7 @@ namespace Qml.Net } action?.Invoke(); } - + protected override void DisposeUnmanaged(IntPtr ptr) { SynchronizationContext.SetSynchronizationContext(_oldSynchronizationContext); @@ -103,7 +102,7 @@ namespace Qml.Net { args = new List(); } - + // By default, the argv[0] should be the process name. // .NET doesn't pass that name, but Qt should get it // since it does in a normal Qt environment. @@ -119,13 +118,14 @@ namespace Qml.Net strings.Add(variant); } } + return Interop.QGuiApplication.Create(strings.Handle, IntPtr.Zero); } } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void TriggerDelegate(); - + private class QtSynchronizationContext : SynchronizationContext { readonly QGuiApplication _guiApp; @@ -141,35 +141,42 @@ namespace Qml.Net } } } - + internal class QGuiApplicationInterop { [NativeSymbol(Entrypoint = "qguiapplication_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(IntPtr args, IntPtr existingApp); - + [NativeSymbol(Entrypoint = "qguiapplication_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr app); [NativeSymbol(Entrypoint = "qguiapplication_exec")] public ExecDel Exec { get; set; } + public delegate int ExecDel(); - + [NativeSymbol(Entrypoint = "qguiapplication_addTriggerCallback")] public AddTriggerCallbackDel AddTriggerCallback { get; set; } + public delegate void AddTriggerCallbackDel(IntPtr app, IntPtr callback); - + [NativeSymbol(Entrypoint = "qguiapplication_requestTrigger")] public RequestTriggerDel RequestTrigger { get; set; } + public delegate void RequestTriggerDel(IntPtr app); - + [NativeSymbol(Entrypoint = "qguiapplication_exit")] public ExitDel Exit { get; set; } + public delegate void ExitDel(int returnCode); - + [NativeSymbol(Entrypoint = "qguiapplication_internalPointer")] public InternalPointerDel InternalPointer { get; set; } + public delegate IntPtr InternalPointerDel(IntPtr app); } } \ No newline at end of file diff --git a/src/net/Qml.Net/QQmlApplicationEngine.cs b/src/net/Qml.Net/QQmlApplicationEngine.cs index 1687079d..e6536e43 100644 --- a/src/net/Qml.Net/QQmlApplicationEngine.cs +++ b/src/net/Qml.Net/QQmlApplicationEngine.cs @@ -10,15 +10,13 @@ namespace Qml.Net public sealed class QQmlApplicationEngine : BaseDisposable { public QQmlApplicationEngine() - :base(Interop.QQmlApplicationEngine.Create(IntPtr.Zero)) + : base(Interop.QQmlApplicationEngine.Create(IntPtr.Zero)) { - } internal QQmlApplicationEngine(IntPtr existingEngine) - :base(Interop.QQmlApplicationEngine.Create(existingEngine)) + : base(Interop.QQmlApplicationEngine.Create(existingEngine)) { - } public void Load(string path) @@ -30,7 +28,7 @@ namespace Qml.Net { Interop.QQmlApplicationEngine.LoadData(Handle, data); } - + public void AddImportPath(string path) { Interop.QQmlApplicationEngine.AddImportPath(Handle, path); @@ -67,7 +65,7 @@ namespace Qml.Net } } } - + internal IntPtr InternalPointer => Interop.QQmlApplicationEngine.InternalPointer(Handle); [Obsolete("Use Qml.RegisterType() instead.", true)] @@ -85,8 +83,8 @@ namespace Qml.Net /// Activates the MVVM behavior. /// This Behavior automatically connects INotifyPropertyChanged instances with appropriate signals on the QML side /// and triggers those signals whenever the PropertyChanged event of the INotifyPropertyChanged instances is triggered. - /// - /// Call this before any INotifyPropertyChanged type is registered! + /// + /// Call this before any INotifyPropertyChanged type is registered! /// Otherwise the behavior might not include /// INotifyPropertyChanged types that were registered (implicitly or explicitly) before this call /// @@ -100,51 +98,62 @@ namespace Qml.Net Interop.QQmlApplicationEngine.Destroy(ptr); } } - + internal class QQmlApplicationEngineInterop { [NativeSymbol(Entrypoint = "qqmlapplicationengine_create")] public CreateDel Create { get; set; } + public delegate IntPtr CreateDel(IntPtr existingEngine); - + [NativeSymbol(Entrypoint = "qqmlapplicationengine_destroy")] public DestroyDel Destroy { get; set; } + public delegate void DestroyDel(IntPtr engine); [NativeSymbol(Entrypoint = "qqmlapplicationengine_load")] public LoadDel Load { get; set; } + public delegate int LoadDel(IntPtr engine, [MarshalAs(UnmanagedType.LPWStr)]string path); [NativeSymbol(Entrypoint = "qqmlapplicationengine_loadData")] public LoadDataDel LoadData { get; set; } + public delegate int LoadDataDel(IntPtr engine, [MarshalAs(UnmanagedType.LPWStr)]string path); [NativeSymbol(Entrypoint = "qqmlapplicationengine_registerType")] public RegisterTypeDel RegisterType { get; set; } + public delegate int RegisterTypeDel(IntPtr type, [MarshalAs(UnmanagedType.LPWStr)]string uri, int versionMajor, int versionMinor, [MarshalAs(UnmanagedType.LPWStr)]string qmlName); - + [NativeSymbol(Entrypoint = "qqmlapplicationengine_registerSingletonTypeQml")] public RegisterSingletonTypeQmlDel RegisterSingletonTypeQml { get; set; } + public delegate int RegisterSingletonTypeQmlDel([MarshalAs(UnmanagedType.LPWStr)]string url, [MarshalAs(UnmanagedType.LPWStr)]string uri, int versionMajor, int versionMinor, [MarshalAs(UnmanagedType.LPWStr)]string qmlName); [NativeSymbol(Entrypoint = "qqmlapplicationengine_registerSingletonTypeNet")] public RegisterSingletonTypeNetDel RegisterSingletonTypeNet { get; set; } + public delegate int RegisterSingletonTypeNetDel(IntPtr type, [MarshalAs(UnmanagedType.LPWStr)]string uri, int versionMajor, int versionMinor, [MarshalAs(UnmanagedType.LPWStr)]string typeName); [NativeSymbol(Entrypoint = "qqmlapplicationengine_addImportPath")] public AddImportPathDel AddImportPath { get; set; } + public delegate void AddImportPathDel(IntPtr engine, [MarshalAs(UnmanagedType.LPWStr)]string path); - + [NativeSymbol(Entrypoint = "qqmlapplicationengine_internalPointer")] public InternalPointerDel InternalPointer { get; set; } + public delegate IntPtr InternalPointerDel(IntPtr app); - + [NativeSymbol(Entrypoint = "qqmlapplicationengine_getContextProperty")] public GetContextPropertyDel GetContextProperty { get; set; } + public delegate IntPtr GetContextPropertyDel(IntPtr app, [MarshalAs(UnmanagedType.LPWStr)]string name); - + [NativeSymbol(Entrypoint = "qqmlapplicationengine_setContextProperty")] public SetContextPropertyDel SetContextProperty { get; set; } + public delegate void SetContextPropertyDel(IntPtr app, [MarshalAs(UnmanagedType.LPWStr)]string path, IntPtr value); } } \ No newline at end of file diff --git a/src/net/Qml.Net/QQuickStyle.cs b/src/net/Qml.Net/QQuickStyle.cs index bef2ee52..9bec1fe6 100644 --- a/src/net/Qml.Net/QQuickStyle.cs +++ b/src/net/Qml.Net/QQuickStyle.cs @@ -15,15 +15,17 @@ namespace Qml.Net Interop.QQuickStyle.SetStyle(style); } } - + internal class QQuickStyleInterop { [NativeSymbol(Entrypoint = "qquickstyle_setFallbackStyle")] public SetFallbackStyleDel SetFallbackStyle { get; set; } + public delegate void SetFallbackStyleDel([MarshalAs(UnmanagedType.LPWStr)]string style); [NativeSymbol(Entrypoint = "qquickstyle_setStyle")] public SetStyleDel SetStyle { get; set; } + public delegate void SetStyleDel([MarshalAs(UnmanagedType.LPWStr)]string style); } } \ No newline at end of file diff --git a/src/net/Qml.Net/QResource.cs b/src/net/Qml.Net/QResource.cs index 5c0e1523..62154567 100644 --- a/src/net/Qml.Net/QResource.cs +++ b/src/net/Qml.Net/QResource.cs @@ -15,14 +15,17 @@ namespace Qml.Net return Internal.Interop.QResource.UnregisterResource(rccFileName, resourceRoot); } } - + internal class QResourceInterop { [NativeSymbol(Entrypoint = "qresource_registerResource")] public RegisterResourceDel RegisterResource { get; set; } + public delegate bool RegisterResourceDel([MarshalAs(UnmanagedType.LPWStr)]string rccFileName, [MarshalAs(UnmanagedType.LPWStr)]string resourceRoot); + [NativeSymbol(Entrypoint = "qresource_unregisterResource")] public UnregisterResourceDel UnregisterResource { get; set; } + public delegate bool UnregisterResourceDel([MarshalAs(UnmanagedType.LPWStr)]string rccFileName, [MarshalAs(UnmanagedType.LPWStr)]string resourceRoot); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Qml.Net.csproj b/src/net/Qml.Net/Qml.Net.csproj index fa3db58b..e23678d8 100644 --- a/src/net/Qml.Net/Qml.Net.csproj +++ b/src/net/Qml.Net/Qml.Net.csproj @@ -1,10 +1,12 @@  netstandard2.0 + ../../../StyleCop.ruleset + \ No newline at end of file diff --git a/src/net/Qml.Net/Qml.cs b/src/net/Qml.Net/Qml.cs index 498f6e0f..e01f5ace 100644 --- a/src/net/Qml.Net/Qml.cs +++ b/src/net/Qml.Net/Qml.cs @@ -15,7 +15,7 @@ namespace Qml.Net { return Interop.QQmlApplicationEngine.RegisterSingletonTypeQml(url, uri, versionMajor, versionMinor, qmlName); } - + public static int RegisterSingletonType(string uri, int versionMajor = 1, int versionMinor = 0) { using (var type = NetTypeManager.GetTypeInfo()) diff --git a/src/net/Qml.Net/Qt.cs b/src/net/Qml.Net/Qt.cs index 081d7701..e4984d78 100644 --- a/src/net/Qml.Net/Qt.cs +++ b/src/net/Qml.Net/Qt.cs @@ -1,6 +1,6 @@ -using Qml.Net.Internal; -using System; +using System; using System.Runtime.InteropServices; +using Qml.Net.Internal; namespace Qml.Net { @@ -26,12 +26,17 @@ namespace Qml.Net { [NativeSymbol(Entrypoint = "qt_putenv")] public PutEnvDel PutEnv { get; set; } + public delegate bool PutEnvDel([MarshalAs(UnmanagedType.LPStr)]string name, [MarshalAs(UnmanagedType.LPStr)]string value); + [NativeSymbol(Entrypoint = "qt_getenv")] public GetEnvDel GetEnv { get; set; } + public delegate IntPtr GetEnvDel(string name); + [NativeSymbol(Entrypoint = "qt_version")] public QtVersionDel QtVersion { get; set; } + public delegate IntPtr QtVersionDel(); } } diff --git a/src/net/Qml.Net/QtWebEngine.cs b/src/net/Qml.Net/QtWebEngine.cs index b6deee3b..c148dfdc 100644 --- a/src/net/Qml.Net/QtWebEngine.cs +++ b/src/net/Qml.Net/QtWebEngine.cs @@ -9,11 +9,12 @@ namespace Qml.Net Interop.QtWebEngine.Initialize(); } } - + internal class QtWebEngineInterop { [NativeSymbol(Entrypoint = "qtwebebengine_initialize")] public InitializeDel Initialize { get; set; } + public delegate void InitializeDel(); } } \ No newline at end of file diff --git a/src/net/Qml.Net/Serialization/NewtonSerializer.cs b/src/net/Qml.Net/Serialization/NewtonSerializer.cs index 349301a5..12c3e3f8 100644 --- a/src/net/Qml.Net/Serialization/NewtonSerializer.cs +++ b/src/net/Qml.Net/Serialization/NewtonSerializer.cs @@ -9,7 +9,7 @@ namespace Qml.Net.Serialization { ContractResolver = new CamelCasePropertyNamesContractResolver() }; - + public string Serialize(object value) { return JsonConvert.SerializeObject(value, _defaultSerializerSettings); diff --git a/src/net/Qml.Net/SignalAttribute.cs b/src/net/Qml.Net/SignalAttribute.cs index f559af13..d5353bef 100644 --- a/src/net/Qml.Net/SignalAttribute.cs +++ b/src/net/Qml.Net/SignalAttribute.cs @@ -10,10 +10,9 @@ namespace Qml.Net Name = name; Parameters = parameters; } - - + public string Name { get; } - + public NetVariantType[] Parameters { get; } } } \ No newline at end of file diff --git a/src/net/Qml.Net/Signals.cs b/src/net/Qml.Net/Signals.cs index 3effcab0..6446e77b 100644 --- a/src/net/Qml.Net/Signals.cs +++ b/src/net/Qml.Net/Signals.cs @@ -23,17 +23,17 @@ namespace Qml.Net } var signals = instance.GetAttachedDelegates(signalName); - + if (signals == null || signals.Count <= 0) { return false; } - + foreach (var del in signals) { del.DynamicInvoke(args); } - + return true; } diff --git a/src/net/Qml.Net/TypeCreator.cs b/src/net/Qml.Net/TypeCreator.cs index 4137be29..ada6ce65 100644 --- a/src/net/Qml.Net/TypeCreator.cs +++ b/src/net/Qml.Net/TypeCreator.cs @@ -34,7 +34,7 @@ namespace Qml.Net { _func = func; } - + public object Create(Type type) { return _func(type); diff --git a/src/net/Qml.Net/Utilities.cs b/src/net/Qml.Net/Utilities.cs index b7ae3aa4..4e8248a7 100644 --- a/src/net/Qml.Net/Utilities.cs +++ b/src/net/Qml.Net/Utilities.cs @@ -24,13 +24,14 @@ namespace Qml.Net { private readonly IntPtr _ignore; public readonly IntPtr Data; - } + } } - + internal class UtilitiesInterop { [NativeSymbol(Entrypoint = "freeString")] public FreeStringDel FreeString { get; set; } + public delegate void FreeStringDel(IntPtr container); } } \ No newline at end of file