From 776753dae579209b09d9fde42eb59e341e978dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Sun, 24 Aug 2025 17:27:51 +0200 Subject: [PATCH] Initialize solution structure --- .editorconfig | 163 +++++++++ CodeMaid.config | 337 ++++++++++++++++++ Directory.Build.props | 10 + FritzCallMonitor.sln | 76 ++++ FritzCallMonitor.snk | Bin 0 -> 596 bytes nuget.config | 7 + package-icon.png | Bin 0 -> 12920 bytes src/Directory.Build.props | 54 +++ .../FritzCallMonitor.Demo.csproj | 12 + src/FritzCallMonitor/FritzCallMonitor.csproj | 28 ++ src/FritzCallMonitor/README.md | 10 + test/Directory.Build.props | 28 ++ .../FritzCallMonitor.Tests.csproj | 11 + 13 files changed, 736 insertions(+) create mode 100644 .editorconfig create mode 100644 CodeMaid.config create mode 100644 Directory.Build.props create mode 100644 FritzCallMonitor.sln create mode 100644 FritzCallMonitor.snk create mode 100644 nuget.config create mode 100644 package-icon.png create mode 100644 src/Directory.Build.props create mode 100644 src/FritzCallMonitor.Demo/FritzCallMonitor.Demo.csproj create mode 100644 src/FritzCallMonitor/FritzCallMonitor.csproj create mode 100644 src/FritzCallMonitor/README.md create mode 100644 test/Directory.Build.props create mode 100644 test/FritzCallMonitor.Tests/FritzCallMonitor.Tests.csproj diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7fb01f9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,163 @@ +# Documentation: +# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference + +# Top-most EditorConfig file +root = true + +[*] +insert_final_newline = true +end_of_line = crlf +indent_style = tab + +[*.{cs,vb}] +# Sort using and Import directives with System.* appearing first +dotnet_sort_system_directives_first = true + +# Avoid "this." and "Me." if not necessary +dotnet_style_qualification_for_event = false:warning +dotnet_style_qualification_for_field = false:warning +dotnet_style_qualification_for_method = false:warning +dotnet_style_qualification_for_property = false:warning + +# Use language keywords instead of framework type names for type references +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:warning + +# Suggest explicit accessibility modifiers +dotnet_style_require_accessibility_modifiers = always:suggestion + +# Suggest more modern language features when available +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:none +dotnet_style_prefer_conditional_expression_over_return = true:none +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion + +# Definitions +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum, delegate, type_parameter +dotnet_naming_symbols.methods_properties.applicable_kinds = method, local_function, property +dotnet_naming_symbols.public_symbols.applicable_kinds = property, method, field, event +dotnet_naming_symbols.public_symbols.applicable_accessibilities = public +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_symbols.private_protected_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_protected_internal_fields.applicable_accessibilities = private, protected, internal +dotnet_naming_symbols.parameters_locals.applicable_kinds = parameter, local +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +dotnet_naming_style.camel_case_style.capitalization = camel_case + +# Name all types using PascalCase +dotnet_naming_rule.types_must_be_capitalized.symbols = types +dotnet_naming_rule.types_must_be_capitalized.style = pascal_case_style +dotnet_naming_rule.types_must_be_capitalized.severity = warning + +# Name all methods and properties using PascalCase +dotnet_naming_rule.methods_properties_must_be_capitalized.symbols = methods_properties +dotnet_naming_rule.methods_properties_must_be_capitalized.style = pascal_case_style +dotnet_naming_rule.methods_properties_must_be_capitalized.severity = warning + +# Name all public members using PascalCase +dotnet_naming_rule.public_members_must_be_capitalized.symbols = public_symbols +dotnet_naming_rule.public_members_must_be_capitalized.style = pascal_case_style +dotnet_naming_rule.public_members_must_be_capitalized.severity = warning + +# Name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_must_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_must_be_pascal_case.style = pascal_case_style +dotnet_naming_rule.constant_fields_must_be_pascal_case.severity = suggestion + +# Name all private and internal fields using camelCase +dotnet_naming_rule.private_protected_internal_fields_must_be_camel_case.symbols = private_protected_internal_fields +dotnet_naming_rule.private_protected_internal_fields_must_be_camel_case.style = camel_case_style +dotnet_naming_rule.private_protected_internal_fields_must_be_camel_case.severity = warning + +# Name all parameters and locals using camelCase +dotnet_naming_rule.parameters_locals_must_be_camel_case.symbols = parameters_locals +dotnet_naming_rule.parameters_locals_must_be_camel_case.style = camel_case_style +dotnet_naming_rule.parameters_locals_must_be_camel_case.severity = warning + +# Name all private fields starting with underscore +dotnet_naming_rule.private_members_with_underscore.symbols = private_fields +dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore +dotnet_naming_rule.private_members_with_underscore.severity = suggestion + +dotnet_naming_symbols.private_fields.applicable_kinds = field +dotnet_naming_symbols.private_fields.applicable_accessibilities = private + +dotnet_naming_style.prefix_underscore.capitalization = camel_case +dotnet_naming_style.prefix_underscore.required_prefix = _ + +[*.cs] +csharp_preferred_modifier_order = public, private, protected, internal, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, volatile, async:suggestion +csharp_style_prefer_primary_constructors = false + +# Only use "var" when it's obvious what the variable type is +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = false:none + +# Prefer method-like constructs to have a block body +csharp_style_expression_bodied_methods = false:none +csharp_style_expression_bodied_constructors = false:none +csharp_style_expression_bodied_operators = false:none + +# Prefer property-like constructs to have an expression-body +csharp_style_expression_bodied_properties = true:none +csharp_style_expression_bodied_indexers = true:none +csharp_style_expression_bodied_accessors = true:none + +# Suggest more modern language features when available +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion + +# Newline settings +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +[*.{xml,csproj,targets,props,json,yml}] +indent_size = 2 +indent_style = space + +[*.{json,yml}] +end_of_line = lf diff --git a/CodeMaid.config b/CodeMaid.config new file mode 100644 index 0000000..02255f6 --- /dev/null +++ b/CodeMaid.config @@ -0,0 +1,337 @@ + + + + +
+ + + + + + False + + + True + + + .*\.Designer\.cs||.*\.resx||packages.config||.*\.min\.js||.*\.min\.css + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + True + + + False + + + True + + + True + + + True + + + False + + + False + + + True + + + True + + + False + + + False + + + True + + + True + + + True + + + False + + + True + + + False + + + True + + + True + + + True + + + False + + + False + + + True + + + False + + + True + + + False + + + False + + + False + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + True + + + True + + + 0 + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + + + + + False + + + False + + + True + + + 100 + + + False + + + False + + + False + + + False + + + False + + + False + + + 0 + + + False + + + False + + + False + + + + \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..843426f --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,10 @@ + + + 12.0 + + 0024000004800000940000000602000000240000525341310004000001000100d9b40f5db1670c563c2e8be5dfd24ed66ad811b3ebba8a0ca0df9cbad3a115ca361b3de4b4d4ed990bf9874d2651e62565f56adb33af33819687021e263b02d6bf5b3cdacde4f09650cafe97467de4b9e4e9cc1d6c2d500a08759697bbe80940916c05533d172ca7e55e10434f9cc46fd189f26cefc100781a20e57f1bad65d5 + + true + $(SolutionDir)/FritzCallMonitor.snk + + diff --git a/FritzCallMonitor.sln b/FritzCallMonitor.sln new file mode 100644 index 0000000..9dbb9aa --- /dev/null +++ b/FritzCallMonitor.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36414.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FritzCallMonitor", "src\FritzCallMonitor\FritzCallMonitor.csproj", "{9951D44E-9511-40D0-84C1-6A7344389A05}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C386CB98-2D60-4E40-B869-73053972BD28}" + ProjectSection(SolutionItems) = preProject + src\Directory.Build.props = src\Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{DC8CE4B0-4CDD-4162-9CCD-FE711BC86EAB}" + ProjectSection(SolutionItems) = preProject + test\Directory.Build.props = test\Directory.Build.props + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FritzCallMonitor.Tests", "test\FritzCallMonitor.Tests\FritzCallMonitor.Tests.csproj", "{7C5920EA-F4A8-4446-9645-3484DB13BCBD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{3DF1F30A-77F3-4F24-8739-CB89EE07BB8B}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "config", "config", "{6FA27A08-FCE1-405E-A4A4-3A89FF4579F3}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitignore = .gitignore + CodeMaid.config = CodeMaid.config + nuget.config = nuget.config + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{B5851E79-416B-40CA-959C-ADCAFCC8BADB}" + ProjectSection(SolutionItems) = preProject + LICENSE.txt = LICENSE.txt + README.md = README.md + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FritzCallMonitor.Demo", "src\FritzCallMonitor.Demo\FritzCallMonitor.Demo.csproj", "{6D718239-B477-4517-B8A5-9FBFCF3F3F2D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9951D44E-9511-40D0-84C1-6A7344389A05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9951D44E-9511-40D0-84C1-6A7344389A05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9951D44E-9511-40D0-84C1-6A7344389A05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9951D44E-9511-40D0-84C1-6A7344389A05}.Release|Any CPU.Build.0 = Release|Any CPU + {7C5920EA-F4A8-4446-9645-3484DB13BCBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C5920EA-F4A8-4446-9645-3484DB13BCBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C5920EA-F4A8-4446-9645-3484DB13BCBD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C5920EA-F4A8-4446-9645-3484DB13BCBD}.Release|Any CPU.Build.0 = Release|Any CPU + {6D718239-B477-4517-B8A5-9FBFCF3F3F2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D718239-B477-4517-B8A5-9FBFCF3F3F2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D718239-B477-4517-B8A5-9FBFCF3F3F2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D718239-B477-4517-B8A5-9FBFCF3F3F2D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9951D44E-9511-40D0-84C1-6A7344389A05} = {C386CB98-2D60-4E40-B869-73053972BD28} + {7C5920EA-F4A8-4446-9645-3484DB13BCBD} = {DC8CE4B0-4CDD-4162-9CCD-FE711BC86EAB} + {3DF1F30A-77F3-4F24-8739-CB89EE07BB8B} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {6FA27A08-FCE1-405E-A4A4-3A89FF4579F3} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {B5851E79-416B-40CA-959C-ADCAFCC8BADB} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {6D718239-B477-4517-B8A5-9FBFCF3F3F2D} = {C386CB98-2D60-4E40-B869-73053972BD28} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {68E37BBB-3CC2-4B0B-8093-7F2F56345EF3} + EndGlobalSection +EndGlobal diff --git a/FritzCallMonitor.snk b/FritzCallMonitor.snk new file mode 100644 index 0000000000000000000000000000000000000000..1cf12d29c3f623e79e342fa2e9d95320b31a5933 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098mv=3deXAD+6E{o;g(oWWD*b%eqx{3^- z-<-PBp%uzD8$IN-)a{uI`G-v=QRXFO^=jKQuQP#`hXNiZI|A0fTRhs$C7E$El>&wb(WXA=m|iPYz0$27c8gcUJyf1oWyU@iSlgk!2oy~Amx7>t!352 zcak||>G_NJW&ex#e5ixWI(KZ`aHFqFf)wzDorj!}W` zj>x%NEY~A*jWpmhGlC+M)H{p0=z_N5>0?UL>`Jp6flO5=L$v&$s!u5smoo6oj5{Dkz^L=Rho$7ljZe7A*pG6GP-Nf$fK5TGC$$GnQtwy{ zf!0wI{1ap4NWk$#vI98B2(ZY}7^ARGP`4`q4Dpk*+_NbORYjazoUAknn~kYB5ZRe~ zt1+-de9FsV5`VkGnZL)(PkjdI-x3H7IFK`4IIM zbr2`^1lysbtaW*&6{)@5P#|>zp~Fpb*C`g=m1iS;>{oW72w~oYY4o2~*JRH_+?0?fzMa z#d;f+YeRR{I + + + + + + diff --git a/package-icon.png b/package-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..37b10f28a98524bdb3f7825ffebab31fbec28900 GIT binary patch literal 12920 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 iFOAt~Yo=jqqW=L7s6VPh6`A$`0000 + + enable + {semvertag:main}{!:-dev} + ../../FritzCallMonitor.snk + + true + false + true + + git + https://github.com/AM-WD/FritzCallMonitor.git + true + + package-icon.png + README.md + LICENSE.txt + + true + snupkg + false + + CallMonitor implementation for FRITZ!Box + AM.WD + Andreas Müller + © {copyright:2025-} AM.WD + + + + true + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/src/FritzCallMonitor.Demo/FritzCallMonitor.Demo.csproj b/src/FritzCallMonitor.Demo/FritzCallMonitor.Demo.csproj new file mode 100644 index 0000000..555658f --- /dev/null +++ b/src/FritzCallMonitor.Demo/FritzCallMonitor.Demo.csproj @@ -0,0 +1,12 @@ + + + + Exe + net8.0 + + + + + + + diff --git a/src/FritzCallMonitor/FritzCallMonitor.csproj b/src/FritzCallMonitor/FritzCallMonitor.csproj new file mode 100644 index 0000000..608c2a4 --- /dev/null +++ b/src/FritzCallMonitor/FritzCallMonitor.csproj @@ -0,0 +1,28 @@ + + + + netstandard2.0;net6.0 + v[0-9]* + + AMWD.Net.Api.Fritz.CallMonitor + fritz box api call monitor + true + + amwd-fritz-callmonitor + AMWD.Net.Api.Fritz.CallMonitor + + FRITZ!Box CallMonitor + Implementation to read the real-time call monitor interface of FRITZ!Box. + + + + + + + + + + + + + diff --git a/src/FritzCallMonitor/README.md b/src/FritzCallMonitor/README.md new file mode 100644 index 0000000..3df8431 --- /dev/null +++ b/src/FritzCallMonitor/README.md @@ -0,0 +1,10 @@ +# FRITZ!Box Call Monitor + + +--- + +Published under MIT License (see [choose a license]). + +[![Buy me a Coffee](https://shields.am-wd.de/badge/PayPal-Buy_me_a_Coffee-yellow?style=flat&logo=paypal)](https://link.am-wd.de/donate) + +[choose a license]: https://choosealicense.com/licenses/mit/ diff --git a/test/Directory.Build.props b/test/Directory.Build.props new file mode 100644 index 0000000..ecb2bd8 --- /dev/null +++ b/test/Directory.Build.props @@ -0,0 +1,28 @@ + + + false + true + true + Cobertura + + ../../FritzCallMonitor.snk + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + diff --git a/test/FritzCallMonitor.Tests/FritzCallMonitor.Tests.csproj b/test/FritzCallMonitor.Tests/FritzCallMonitor.Tests.csproj new file mode 100644 index 0000000..299c314 --- /dev/null +++ b/test/FritzCallMonitor.Tests/FritzCallMonitor.Tests.csproj @@ -0,0 +1,11 @@ + + + + net8.0 + + + + + + +